CEP因其高效的规则管理能力和卓越的定制化能力,常作为服务监控或应用监控系统的核心。监控系统中,除了前文介绍的日志采集方法,还有一种APM探针的方法。APM探针和日志采集一样不需要修改原有系统,同时能够得到一些日志中不方便监测的数据。
本文示例基于Java探针。对其它开发语言如PHP、.Net C#、HTML、Objective C等构建的系统,探针原理类似。也是不改动原有系统的前提下,使用工具加一些监测代码。
1. 示例操作步骤
(1)下载(“ 数据采集示例”) sodbase-dataadaptor-apm工程,下载(“SODBASE Studio示例模型”)服务器端 CEP模型apm.sod,下载 SODBASE Studio。
(2)解压SODBASE Studio打开,导入apm.sod模型,作用就是把采集上来的监测数据屏幕打印输出。
在左侧模型列表中点击apm,在工作面板右键,点击测试运行。
(3)解压sodbase-dataadaptor-apm工程,导入Eclipse。打开com.example.apm包下的TimeCostTest.java,它是被监测程序。
Run As Run Configuration...配置VM Arguments,-javaagent:lib/apm.jar -Dpackagemonitored=com -Dcep_home=cep_home
2.4输出结果
在SODBASE Studio中可看到输出结果
2. 工作原理
2.1 探针程序
APM探针的原理其实比较简单,主要因为现代编译解释虚拟机(JVM,.net framework等)已经提供了一项功能:在不影响原程序的同时,可以在线增加一些监测度量代码。
本文示例中用的是javaagent方式,在启动被监测的时候加启动参数。lib/apm.jar是探针程序 -Dpackagemonitored是要监测的包前缀,-Dcep_home是放置SODBASE CEP配置文件的目录。
另外,也可以在被监测程序运行过程中,通过进程ID来Attach。具体方法读者可参考Java Instrumentation相关文章。
2.2 传送数据到监测服务器
传送数据到监测服务器有两个挑战(1)传送程序不能阻塞原来系统正常运行,因为需要是异步传输
(2)并不一定所有数据都要传送。选择需要的数据如执行时间超过1秒的数据,或者定时传送统计数据
为解决这两个挑战,我们在探针采集端用了一个嵌入式SODBASE CEP引擎,从而实现了
(1)异步传输
(2)通过cep_home/files/apmagent.xml的EPL语句来控制数据传输
示例中目前是全部数据传输。如传输时间超过1秒的数据,可将XML中SODSQL修改为
CREATE QUERY apmagent SELECT * FROM T1:collectdata PATTERN T1 WHERE T1.timecost>1000 WITHIN 0
EPL写法请参考类
流式计算中的类SQL语言EPL一文。
之前我们在“ SODBASE CEP学习进阶篇(二):日志采集 “一文直接用了SocketUtil类的API传输数据。如果想进一步升级,也建议采用本文嵌入式SODBASE CEP引擎方式。
2.3 图形展示和报表
如果需要图形展示,可以参考SODBASE View中的RESTful接口,或者也可以将数据输出入库(包括磁盘库或memory库),用iReport等工具生成报表。
2.4 APM产品
目前有不少APM厂商,主要是两类。一类是云监测,用户的数据传到APM厂商的服务器上去。云监测服务器端比较庞大,不适宜迁移到企业内部。另一类是独立APM产品,适合放在企业内部。SODBASE CEP既可以搭建云监测平台,也可以做独立APM产品。相对来说,SODBASE CEP尤其合适监测平台放置在企业内部的场合,满足易定制、易维护的需求。
SODBASE CEP用于轻松、高效实施数据监测、监控类、交易类、实时分析类项目。EPL语法见SODSQL写法与示例。图形化建模请使用SODBASE Studio。
使用SODBASE产品的程序员现在可领礼品啦