SODBASE CEP学习进阶篇(二):日志采集-Flume

开发者社区活动,SODBASE产品的用户现在可以领礼品 

在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打开

下载loganalysis.sod CEP模型文件

在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 实时图表显示和移动端消息

APM探针方式请参考


SODBASE CEP用于轻松、高效实施数据监测、监控类项目微笑。EPL语法见SODSQL写法与示例。图形化建模请使用SODBASE Studio

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值