在nGrinder测试报告中使用自定义的监控数据
?
需要注意的是,自定义的监控数据的图表名字是 “CUSTOM MONITOR DATA 1”, “CUSTOM MONITOR DATA 2” .., 直到“CUSTOM MONITOR DATA 5”。而且最多只能有5条数据,所以也最多有5个自定义监控数据的图。由于这个图的名字很不直观,但是又无法自定义,用户可以把这些字段的意义作为测试的注释(comment)保存在这个测试的属性里面。
接下来,我们就需要利用一下工具来获取并生成监控数据。我们需要定时的获取系统的某一个属性并保存在文件中。
说到这里,可能很多人就会想到用Linux的cron,例如创建一个脚本用来获取监控数据并保存的文件中,然后用cron定时的调用。但是,cron最低只能设置每分钟执行,但是,nGrinder的监控数据基本都是每秒钟获取一次。
所以,在这个例子中,我要使用java来实现。例如,我要做的是获取Tomcat的GC执行情况,用Java JMX来连接Tomcat进程,用获取GC的执行情况,并保存在文件中。
要使用JMX连接本地服务器上的其它进程,一般情况下,需要那个Java进程启动了JMX服务,但是,一般情况下,我们使用Tomcat是不启动这个服务的。那我们要怎么才能使用JMX连接呢?Attach API。在本地服务器上,我们可以使用attach API来绑定到目标Java进程,然后启动目标进程上的“management agent”。这样就可以使用JMX连接到了。
有关使用attach API和JMX连接到其他Java进程的程序,可以参考这个。有一点需要特别说明的是,我们是使用JMX对象名来获取远程进程的属性,所以我们需要知道GC的名称来获取。但是,在不同的Java版本已经不同的GC配置下,GC的名字也是不一样的,所以,在这个例子中,我先获取了一下本地JVM的GC名称,然后通过这个名字来获取目标进程中GC属性。这就要求,我们允许这个代码的Java环境和运行目标java进程的java环境必须一样,然后使用的VM参数也必须一样。
在这个代码中,我整理了sun和bea的JVM的GC名称,以及它们对应的minor GC或者full GC。而且对于其他的JVM例如IBM的就没有,如果你们需要其他的,请参考相关文档自己添加。
下面,我们就仿照这个事例,来编写一个类,来每隔一秒钟,获取一次目标java进程的GC信息,并写到文件中。其代码如下:
有关这个代码,有几个需要注意的:
a) 我们需要知道目标进程的ID,并把它作为运行参数。
b) 运行这个java程序的环境必须和目标Tomcat服务器的java环境一致,例如"-server"和其他VM的配置必须一样。
c) 自定义的监控数据的格式是“minorGCCount,minorGCTime,fullGCCount,fullGCTime”.
d) 运行这个java程序时,必须在 “${ngrinder_agent}/monitor/” 目录中,因为在代码中,我将在当前目录中创建和更新custom.data文件。
e) 编译这段代码需要JDK的 “tools.jar”。你需要用类似下面的方式来编译和运行:
(因为这个例子中的GC不是很频繁,所以看到的基本上就是一条直线。)
?
使用这样的方式,我们就可以在我们的测试结果中添加任意的监控数据,来帮助我们对target服务器上的某些运行状态有一个更好的展示。并保存便于以后查看。 ?