使用Kieker(AspectJ)监控控制台程序

这两天想比较下到底AspectJ和ASM进行instrumentation后的监控结果有什么不同。由于之前使用Kieker的时候,总是监控Web程序(如J2EE或WebLogic),实际上对怎么配置其监控最简单的控制台程序并不是很了解。今天又翻出来Kieker 1.4的userguide学习了一阵。

Kieker实际上自带一个非常简单Java控制台程序(Bookstore,这篇日志中主要内容在Kieker userguide的第5.1节),在我之前的一篇日志中,介绍了Kieker的最简单知识,这里就不赘述了。

Kieker的“kieker-1.4_binaries.zip”解压后,进入目录“D:\Kieker-1.4\kieker-1.4_binaries\kieker-1.4\examples\userguide\ch5--trace-monitoring-aspectj”。首先,和之前的一篇日志一样,将"kieker-1.4"下"dist"文件夹下的"kieker-1.4.jar"和"lib"文件夹下的"aspectjweaver-1.6.11.jar"和"commons-logging-1.1.1.jar"三个jar包拷贝进该目录下的“lib”文件夹中;

其次,创建“build”文件夹,将文件夹“META-INF”拷贝进该“build”文件夹;

第三,运行命令(编译Bookstore的源代码):

javac -classpath lib\kieker-1.4.jar;lib\commons-logging-1.1.1.jar src\bookstoreTracing\*java -d build

然后运行(运行已经编译好的Bookstore字节码文件):

java -javaagent:lib\aspectjweaver-1.6.11.jar -classpath build\;lib\kieker-1.4.jar;lib\commons-logging-1.1.1.jar bookstoreTracing.BookstoreStarter

就可以看到Kieker运行的信息,运行完之后就可以得到如下的监控数据:

$1;1331019696273374630;1;bookstoreTracing.Catalog.getBook(boolean);N/A;7922535431986479105;1331019696270729090;1331019696273356785;ibm;1;1

具体监控数据的位置,可以在Kieker运行时的控制台输出中看到。

另外,这里再总结一下aop.xml文件两个需要注意的问题,首先,应该注意aop.xml文件的位置,据userguide中介绍:“The aop.xml must be located in a META-INF/ directory in the classpath——in this case the build/ directory.”

其次,aop.xml文件的aspect name字段用于制定monitoring probe(监控探针)的类型,Kieker支持4种类型的探针,如下所示:

    <aspects>
<!--<aspect name="kieker.monitoring.probe.aspectJ.operationExecution.OperationExecutionAspectAnnotation"/>-->
<!--<aspect name="kieker.monitoring.probe.aspectJ.operationExecution.OperationExecutionAspectAnnotationServlet"/>-->
<aspect name="kieker.monitoring.probe.aspectJ.operationExecution.OperationExecutionAspectFull"/>
<!--<aspect name="kieker.monitoring.probe.aspect.JoperationExecution.OperationExecutionAspectFullServlet"/>-->
</aspects>

如果使用Annotation类型的探针,那么源代码中包含

@OperationExecutionMonitoringProbe

的方法将被监控,而带有Servlet后缀的类型,“additionally store a session identi er within the OperationExecutionRecord.”(这句话我不是特别清楚)

对应的,OperationExecutionAspectFull类型指定了所有包含在include字段中的方法都将被监控,当选择这种类型的探针时,源代码中的

@OperationExecutionMonitoringProbe

标记将自动被忽略。

使用上述步骤,基本可以实现对所有Java控制台程序的监控,但是经过尝试,如果在Eclipse中重复上述过程(即使将classpath之类的都设置好),运行时也会报错:

Cannot register non aspect: kieker$monitoring$probe$aspectJ$operationExecution$OperationExecutionAspectFull , kieker.monitoring.probe.aspectJ.operationExecution.OperationExecutionAspectFull

原因也很简单,因为编译过程中没有使用Kieker的jar包,如果在Eclipse中设置编译时的classpath,则上述问题可以解决。(之前都是默认Eclipse自动编译的,所以不太清楚怎么设置,不过应该很简单。)

posted on 2012-03-06 16:38  qysh123  阅读(1005)  评论(0编辑  收藏  举报

导航