JMeter监听器组件
前文介绍过,我们可以从实际用途上将JMeter的Listener(监听器)组件分为两大类Report (报告)和Vizualizers(监视器)。Report (报告)主要用于收集来自于线程组内各个Sampler在进行sample时所产生的结果数据;Vizualizers(监视器)主要用于主动采集一些我们所关心的,最终用于结合Sampler结果数据进行性能瓶颈分析与调优的性能计数(如操作系统CPU利用率、内存使用情况等)。另外,为达到监听效果在GUI层常常会以图表形式对监听到的结果数据进行直观展现,在文件系统层通过格式化后将结果数据进行本地化文件保存。
Report插件开发
Report (报告)继承AbstractListenerElement抽象类,通过实现sampleOccurred(SampleEvent e)方法,对所有采集事件中所产生的SampleResult进行处理,从而生成报告。
一个用于产生结果的SleepTestSampler插件
Sampler插件非常简单,需要的功能是根据配置生成一个sample标签并产生一段sample消耗时间,核心代码参考如下:
public SampleResult sample(Entry entry) {
SampleResult res = new SampleResult();
res.sampleStart();
res.setSampleLabel(this.getPropertyAsString(NAME) + this.getThreadName());
Random rand = new Random();
try {
long defaultValue = (rand.nextInt(5) + 1) * 1000;
if(this.getPropertyAsString(SLEEP).trim().equals("")){
Thread.sleep(defaultValue);
} else {
Thread.sleep(this.getPropertyAsLong(SLEEP, defaultValue));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
res.sampleEnd();
res.setResponseCodeOK();
res.setSuccessful(true);
return res;
}
完成后,效果如下图:
从前面的代码可以看出,第一个输入框为产生一个NAME属性,第一个输入框为产生一个SLEEP属性,当SLEEP属性未设置时,将产生一个随机时间。
Report插件
Report插件会监听到所有Sampler在sample时所产生的SampleResult对象,为了甄别我们真正想要收集的结果数据,可以定义一个isSampleWanted方法,收集器Collector的代码参考如下:
public class SamplerResultCollector extends AbstractListenerElement implements SampleListener, Clearable, Serializable,
TestStateListener, Remoteable, NoThreadClone {
public boolean isSampleWanted(boolean success){
if(success){
return true;
}
return false;
}
@Override
public void testEnded() {
}
@Override
public void testEnded(String host) {
}
@Override
public void testStarted() {
}
@Override
public void testStarted(String host) {
}
@Override
public void clearData() {
}
@Override
public void sampleOccurred(SampleEvent event) {
SampleResult result = event.getResult();
if(isSampleWanted(result.isSuccessful())){
long during = result.getEndTime() - result.getStartTime();
System.out.println(result.getSampleLabel() + ":" + during + "ms");
}
}
@Override
public void sampleStarted(SampleEvent event) {
}
@Override
public void sampleStopped(SampleEvent event) {
}
}
我们收集所有状态为成功的SampleResult,并在收集的同时输出其对应的sample标签和响应时间。
Report的GUI代码参考如下:
public class SamplerResultReporter extends AbstractListenerGui{
@Override
public TestElement createTestElement() {
SamplerResultCollector collector = new SamplerResultCollector();
modifyTestElement(collector);
return collector;
}
@Override
public String getLabelResource() {
return this.getClass().getSimpleName();
}
@Override
public String getStaticLabel() {
//设置显示名称
return JMeterPluginUtils.prefixLabel("SamplerResultReport");
}
@Override
public void modifyTestElement(TestElement element) {
super.configureTestElement(element);
}
@Override
public void configure(TestElement element) {
super.configure(element);
}
}
完成后,我们创建两个SleepTestSampler,第一个取名为A,固定产生3000毫秒响应时间,第二个取名为B,随机产生响应时间,使用SamplerResultReporter进行监听,10个线程循环2次,效果如下: