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自动编译的,所以不太清楚怎么设置,不过应该很简单。)