51Testing软件测试论坛

标题: jmeter资源监控器开发——关键代码分析 [打印本页]

作者: qaarchitech    时间: 2008-7-31 22:14
标题: jmeter资源监控器开发——关键代码分析
by jack
代码分析也无需事无巨细皆列而剖之,只要找到关键所在也就是了;又不然列一堆的声明上来,纵然有人有耐心看下去,我也没耐心写下去啊。特别关注了三个类,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="&#63;" virtualHost="&#63;" method="&#63;" currentUri="&#63;" currentQueryString="&#63;" protocol="&#63;" /></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不是就四条么?
呵呵,不忙,且听我慢慢道来。
附件:

作者: wangs    时间: 2008-8-15 17:47
得支持。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2