在IT系统运维和性能监控中,常常需要对日志进行分析,得到系统的故障点或性能瓶颈。采用现成的日志分析软件,通常着重于监测节点和网络状态,几乎都难以满足大型应用系统对故障点或性能瓶颈分析的要求。
举几个例子:
(1)找出故障的上下层调用的关系,定位应用层故障对应的底层接口
(2)分析父子调用的时间差,找出性能瓶颈
(3)分析指定系统调用和服务的响应时间、是否超时
SODBASE CEP可以处理各类复杂的日志实时分析和图表显示功能。用户可以自己定义日志服务接口,采集日志数据,也可以用一些日志采集客户端,如flume、splunk等,完成采集功能。
本文用flume作为日志采集客户端,将日志信息发送到SODBASE CEP引擎。(logstash日志采集,请参考SODBASE CEP学习进阶篇(二)续:Logstash、Kafka和CEP集成)
1.操作步骤
(1)Windows环境(Linux环境类似),安装JDK1.6+
(2)下载SODBASE-CEP-Studio软件
解压点击cepstudio.exe打开
在SODBASE Studio中点击菜单“文件”->“导入" 选择loganalysis.sod
在工作区面板空白处,右键点击测试运行
(3)下载apache-flume-1.5.2-bin.zip,解压到E:\software或其它自定义目录。将SODBASE Studio lib目录下的sodbase-cep-engine.jar,sodbase-studio.jar,sodbase-dataadaptor-socket.jar,sodbase-dataadaptor-flume.jar拷贝到flume的lib目录下
用记事本代开flume的bin/flume-win.bat,需要编辑两个地方:FLUME_HOME,flume解压后的目录;JAVA_HOME,设置自己的JDK安装目录。
(4)运行flume-win.bat
(5)结果输出。在Studio中可以看到接收的日志结果,如下图所示
(6)SODBASE Studio主要用于建模和测试。如果想把日志分析功能部署到服务器,请参考SODBASE系列产品用户手册CEP Server的使用,在文档目录中。
示例操作完成,如果想了解工作原理,请看下文。
2.工作原理
flume比较其它日志采集客户端的优点是Java编写跨平台,轻量级。本文用flume作为日志采集客户端,将日志信息发送到SODBASE CEP引擎。示例中,我们实现一个将数据通过socket传输到CEP引擎的Sink。在CEP引擎中通过socket输入适配器负责接收数据。
需要用到的类库有sodbase-cep-engine.jar,sodbase-studio.jar,sodbase-dataadaptor-socket.jar,sodbase-dataadaptor-flume.jar, 运行时放到flume的lib目录下即可。注:sodbase-cep-engine.jar在flume中用的版本需要和CEPserver中的版本一致,保证对象能够正常解序列化。
package com.sodbase.dataadaptor.flume;
import java.io.IOException;
import java.util.Date;
import org.apache.flume.Channel;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDeliveryException;
import org.apache.flume.Transaction;
import org.apache.flume.conf.Configurable;
import org.apache.flume.sink.AbstractSink;
import com.sodbase.outputadaptor.socket.SocketUtil;
import zstreamplus.eventbuffer.PrimitiveEvent;
import zstreamplus.eventbuffer.ValueType;
public class CEPServerSink extends AbstractSink implements Configurable
{
private String CEPServerSocketIpPort;
private String retrynum;
private static final String DEFAULT_ENCODING = "UTF-8";
private SocketUtil socketUtil=new SocketUtil();
@Override
public void configure(Context context)
{
/**
* 在flume-conf.properties中配置
*/
CEPServerSocketIpPort = context.getString("CEPServerSocketIpPort",
"localhost:12345");
retrynum = context.getString("CEPServerSocketRetryNum", "30");
}
@Override
public void start()
{
socketUtil.setRunning(true);
}
@Override
public void stop()
{
socketUtil.setRunning(false);
if (socketUtil.getClient() != null)
try
{
socketUtil.getClient().close();
} catch (IOException e)
{
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
@Override
public Status process() throws EventDeliveryException
{
Status status = null;
// Start transaction
Channel ch = getChannel();
Transaction txn = ch.getTransaction();
txn.begin();
try
{
Event event = ch.take();
//prepare the log data
String eventData = new String(event.getBody(), DEFAULT_ENCODING);
PrimitiveEvent primitiveEvent = new PrimitiveEvent();
ValueType valueType = new ValueType(eventData, "string");
primitiveEvent.getAttributeMap().put("flumeeventdata", valueType);
Date date = new Date();
long time = date.getTime();
primitiveEvent.setStart_ts(time);
primitiveEvent.setEnd_ts(time);
//transfer data to cep server
String[] address = CEPServerSocketIpPort.split(":");
socketUtil.setIp(address[0]);
socketUtil.setPort(address[1]);
socketUtil.setRetrynum(retrynum);
socketUtil.outputPrimitiveEvent(primitiveEvent);
txn.commit();
status = Status.READY;
} catch (Throwable t)
{
txn.rollback();
status = Status.BACKOFF;
if (t instanceof Error)
{
throw (Error) t;
}
} finally
{
txn.close();
}
return status;
}
}
linux的flume启动调用sh脚本即可,windows中可参考下面脚本
set FLUME_HOME=E:\software\apache-flume-1.5.2-bin\apache-flume-1.5.2-bin
set JAVA_HOME=D:\Program Files\Java\jdk1.7.0_51
set JAVA="%JAVA_HOME%\bin\java.exe"
set JAVA_OPTS=-Xmx256m
set CONF=%FLUME_HOME%\conf\flume-cep-conf.properties
set AGENT=agent
%JAVA% %JAVA_OPTS% -Dflume.monitoring.type=http -Dflume.monitoring.port=34545 -Dlog4j.configuration=file:\\\%FLUME_HOME%\conf\log4j.properties -cp "%FLUME_HOME%\lib\*" org.apache.flume.node.Application -f %FLUME_HOME%\conf\flume-cep-conf.properties -n %AGENT%
flume-cep-conf.properties
agent.sources = seqGenSrc
agent.channels = memoryChannel
agent.sinks = loggerSink
# For each one of the sources, the type is defined
agent.sources.seqGenSrc.type = seq
# The channel can be defined as follows.
agent.sources.seqGenSrc.channels = memoryChannel
# Each sink's type must be defined
agent.sinks.loggerSink.type = logger
#Specify the channel the sink should use
agent.sinks.loggerSink.channel = memoryChannel
# Each channel's type is defined.
agent.channels.memoryChannel.type = memory
# Other config values specific to each type of channel(sink or source)
# can be defined as well
# In this case, it specifies the capacity of the memory channel
agent.channels.memoryChannel.capacity = 100
agent.sources = seqGenSrc
agent.channels = memoryChannel
agent.sinks = loggerSink
agent.sources.seqGenSrc.type = seq
agent.sources.seqGenSrc.channels = memoryChannel
agent.sources.seqGenSrc.type = exec
agent.sources.seqGenSrc.command = cmd.exe /c echo test
agent.sources.seqGenSrc.restart = true
agent.sources.seqGenSrc.restartThrottle = 1000
agent.sources.seqGenSrc.batchSize = 100
agent.sinks.loggerSink.type = com.sodbase.dataadaptor.flume.CEPServerSink
agent.sinks.loggerSink.channel = memoryChannel
agent.sinks.loggerSink.CEPServerSocketIpPort=localhost:12345
agent.sinks.loggerSink.CEPServerSocketRetryNum=2
agent.channels.memoryChannel.type = memory
command可以用tail命令在监测日志,windows下有python版的命令。
logstash日志采集,请参考 SODBASE CEP学习进阶篇(二)续:日志采集-目录文件
日志数据采集上来以后,数据分析和展示请参考
SODBASE CEP学习(四):类SQL语言EPL与Storm或jStorm集成-日志分析
SODBASE CEP学习(五):流式计算中的类SQL语言EPL 第1.1小节 2.1小节有服务函数调用分析的例子,读者也可以定制自己的分析策略
SODBASE CEP学习(九):SODBASE View 实时图表显示和移动端消息
SODBASE CEP学习(五):流式计算中的类SQL语言EPL 第1.1小节 2.1小节有服务函数调用分析的例子,读者也可以定制自己的分析策略
SODBASE CEP用于轻松、高效实施数据监测、监控类项目。EPL语法见SODSQL写法与示例。图形化建模请使用SODBASE Studio。