代码分析也无需事无巨细皆列而剖之,只要找到关键所在也就是了;又不然列一堆的声明上来,纵然有人有耐心看下去,我也没耐心写下去啊。特别关注了三 个类,Stats、MonitorPerformancePanel、MonitorGraph。分别是获取解析得到的数据、监控器面板显示和监视器上的 图像绘制。下面选取了一些关键代码来进行分析:
首先是Stats.java,下面是计算内存使用率的方法
public static int calculateMemoryLoad(Status stat) {
double load = 0;
if (stat != null) {
double total = stat.getJvm().getMemory().getTotal();
double free = stat.getJvm().getMemory().getFree();
double used = total - free;
load = (used / total);
}
return (int) (load * 100);
}
很简单吧?就是获取total值和free值,然后计算内存使用率,那么它解析的是什么东西呢?我们取了一份tomcat上的status的xml,内容如下:
<?xml version="1.0" encoding="utf-8"?><status><jvm><memory free='937000' total='5177344' max='66650112'/></jvm><connector name='http-8080'><threadInfo maxThreads="40" currentThreadCount="2" currentThreadsBusy="1" /><requestInfo maxTime="1715" processingTime="2819" requestCount="20" errorCount="2" bytesReceived="0" bytesSent="108662" /><workers><worker stage="S" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="127.0.0.1" virtualHost="localhost" method="GET" currentUri="/manager/status" currentQueryString="XML=true" protocol="HTTP/1.1" /><worker stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesRecieved="0" remoteAddr="?" virtualHost="?" method="?" currentUri="?" currentQueryString="?" protocol="?" /></workers></connector><connector name='jk-8009'><threadInfo maxThreads="200" currentThreadCount="4" currentThreadsBusy="1" /><requestInfo maxTime="0" processingTime="0" requestCount="0" errorCount="0" bytesReceived="0" bytesSent="0" /><workers></workers></connector></status>
这乱七八糟的,谁看得清啊,不要急,保存下来命名为.xml文件,扔到ie里再看一下
其实上面那段代码所取的,就是这个xml里面的memory free和total。
这 个xml里这么多可以利用的内容,要是我们都解析出来,不就可以有很多资源数据了?有人也许会问,这些都是什么tread信息什么,又没有cpu啊,io 之类的信息,解析出来也没用;要知道,这个xml文件你自己可以生成的,里面存什么数据,你自己怎么定义都行啊,定义好了,写一个动态更新这里面的数据的 脚本或程序,再利用web去展现这个xml,jmeter不就可以取来用了?
我们再看看MonitorPerformancePanel.java
public static final String LEGEND_MEM = JMeterUtils.getResString("monitor_legend_memory_per"); //$NON-NLS-1$
public static final ImageIcon LEGEND_MEM_ICON = JMeterUtils.getImage("monitor-orange-legend.gif"); //$NON-NLS-1$
这两句就是设置监视器上显示的图例,是啥东西呢?就是这个:
标识了图线的颜色和内容标签
上面两句设置好了,要显示就要看下面这段的了:
JLabel mem = new JLabel(LEGEND_MEM);
mem.setFont(plaintext);
mem.setPreferredSize(lsize);
mem.setIcon(LEGEND_MEM_ICON);
legend.add(mem);
做过java的gui编程的朋友一定不会觉得陌生,呵呵
再下来看一下MonitorGraph.java
if (MEM) {
int mmy = (int) (height - (height * (model.getMemload() / 10000.0)));
int lastmmy = (int) (height - (height * (last.getMemload() / 10000.0)));
g.setColor(Color.orange);
g.drawLine(lastx, lastmmy, xaxis, mmy);
}
这段就是展现曲线的代码,可以产生如下的效果:
用jmeter做过tomcat监控的人一定会觉得很熟悉。不过也许会问,为啥这个图像上曲线这么多呢,jmeter不是就四条么?
呵呵,不忙,且听我慢慢道来。