关于Jmeter后端监听器的一个坑

       Jmeter的后端监听器(BackendListener)是一个异步侦听器,可以将数据推入到数据库中,提供了InfluxDB,graphite两个选项。用来监听Jmeter取样器的测试结果,能够以树、表及图形的形式来显示测试结果。除了监听测试结果之外,大部分监听器还提供查看,保存和读取已保存测试结果的方法。具体使用方法参考:https://blog.csdn.net/smooth00/article/details/79926294

        但是使用过程中,Jmeter后端监听器有个巨大的坑(也算是小BUG),很多人没有意识到。那就是在多脚本并行运行时,会出现监控数据混合在一起的情况,这是为什么呢,针对这个问题用以下例子进行说明:

我们先是创建两个脚本,叫不同的名字,HRP-1.jmx和HRP-2.jmx,为了区别两脚本,接口名称也不相同,如下:

关于Jmeter后端监听器的一个坑_第1张图片关于Jmeter后端监听器的一个坑_第2张图片

这两脚本各自创建自己的后端监听器,连接的influxdb库是一样的,但是application名字不一样,如下:

关于Jmeter后端监听器的一个坑_第3张图片

关于Jmeter后端监听器的一个坑_第4张图片

然后同时跑这两脚本,结果发现两脚本的数据全都合到一个application中了(合到第一个运行的脚本名称中):

关于Jmeter后端监听器的一个坑_第5张图片

在看influxdb数据库,发现确实两个脚本产生的数据全都归到Application Name为HRP-uplaod下:

关于Jmeter后端监听器的一个坑_第6张图片

       明明是命名了两个不同的Application Name,我们再看一下后端监控器的配置参数说明,就算把testTitle改成不同的名称,也解决不了这个问题。

influxdbMetricsSender:org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender
influxdbUrl:influx数据库的url。example : http://influxHost:8086/write?db=jmeter
application:被测试的应用名称。此值也作为名为“application”的标记存储在“events”中
measurement:使用默认的”jmeter“就行
summaryOnly:为true的情况下,只输出所有请求的集合数据报告,为flase的情况下,输出每条数据的详情报告、
samplersRegex:正则表达式将与样本名称匹配并发送到后端。默认匹配所有
testTitle:测试名称。默认的设置为 Test name。该值作为名为“text”的字段存储在“事件”度量中。 JMeter在测试的开始和结束时自动生成一个注释,其值以'started'和'ended'结尾
percentiles:要发送到后端的百分位数,多个值已;分割
TAG_WhatEverYouWant:自定义标签。您可以根据需要添加任意数量的自定义标签。对于它们中的每一个,只需创建一个新行并在其名称前加“TAG_”

于是对Jmeter的源代码进行DEBUG跟踪,发现两个脚本启动运行,到下面这段if判断时就不一样了:

关于Jmeter后端监听器的一个坑_第7张图片

如上代码,第一个脚本启动时,listernerClientData = null,能执行后面的逻辑,但是第二个脚本启动后,listernerClientData不为null,不再执行后面的逻辑,这就导致Application对应的events表没有插入相应的数据,也就是说只插入了HRP-uplaod的:

关于Jmeter后端监听器的一个坑_第8张图片

问题就出在这个 listernerClientData 的判断上,而且我们查看myName这个变量,发现两个脚本执行时,都是显示“后端监视器”,毫无疑问这是我们BackendListener的默认名称,说明这块是采用这个名称来判断监听器是否在运行,这就是BUG呀,不同脚本的监听器名称可能不同,也可能相同呀(默认肯定是相同的),这就是名称冲突导致了两个脚本的监听数据被混合了!!!!

        直是无语了,现在只有两条路,要么是改Jmeter的源码,改成不以监听器名称为判断条件,而是以Application Name为判断条件,改完后重新打包,只需要替换jmeter下的ApacheJMeter_components.jar包就行(600多KB);另一条路就是我们自己去适应人家,创建脚本时,自定义BackendListener名称,别用默认的名称(这样就可以回避这个问题)。

我们把两监听器名称改一下,一个叫“后端监听器-1”,另一个叫“后端监听器-2”,重新再跑一次两脚本,发现监听到数据完美分离了,如下:

关于Jmeter后端监听器的一个坑_第9张图片

关于Jmeter后端监听器的一个坑_第10张图片

再看influxdb库,能看到两组events都入库了,如下:

关于Jmeter后端监听器的一个坑_第11张图片

对应的jmeter监控数据也是两组:

关于Jmeter后端监听器的一个坑_第12张图片

       目前我用的是Jmeter 5.1.1版本有这个问题,我相信之前的版本肯定也有这个问题,最新的Jmeter5.3源码也还是这个判断问题,至于后续的版本能不能解决,会进行关注。就算一直不解决,也不影响我们,只要知道有这个坑,及时做好回避即可。

你可能感兴趣的:(性能监控技术,Jmeter自动化测试,#,Jmeter)