通过搭建jmeter+grafana+influxdb 的性能测试平台,解决了通过可视化面板实时观察压测过程中的各项性能指标数据。一般大家搭建这样的平台,都会选用官方提供的现有版面模板直接导入使用,它满足了大部分的基础需求。但是在团队真正的使用起来后,随着使用频率和使用人数的增加会发现些问题。
例如:多人同时进行压测如何在grafana面板中如何区出自己的压测信息;当一个脚本中有多个请求,如何查看每个请求的独立数据以及总事务数据等等,要达到实际使用的需求的信息展示,我们就需要对jmeter和grafana的配置进行些个性化配置调整,给数据添加分组信息便于使用过程中剥离、筛选出查看所需的精准信息,而这部分改造网上的资料很少,基本上都是基于模版完成的简单功能,所以本篇将完成进一步的拓展功能,在阅读本篇之前最好已经完成该框架的基础搭建。
监听器->后端监听器会异步将脚本运行的信息写入influxDB储存,图1是jmeter脚本中添加后端监听器选择influxDB后默认数据,通常只需修改influxdbUrl的IP信息为自己搭建的influxdb的IP即可使用,其余数据可以不用修改。当需要定制化数据,你就需要了解各参数的意义,然后才能灵活运用;
图1
介绍下插件参数
influxdbUrl | [URL]?db=[库名] |
---|---|
application | 应用名,会存储在events表中;在grafana面板可以做为在分类筛选项 |
measurement | 数据库表名;influxBD数据库中的measurement可以理解为mysql数据库的表的含义 |
summaryOnly | true/false;true表示发生summary,false表示发生summary和detail;summaryOnly是针对有多个接口同时测试的情况,推荐选择false |
samplersRegex | 正则表达式,过滤发送到数据库信息;在summaryOnly=false的前提下(summaryOnly=true下是无效的) |
percentiles | 响应时间百分比;根据自己需要配置 |
testTitle | 存储在events表中text; events表中写入testTitle+'started'和testTitle+'ended' |
eventTags | 任务标签,配合grafana使用 |
参数application在性能脚本中修改为自己项目所需的分组名字,目的是区别于别的脚本数据,具有一定的唯一性且有实际标志作用。例如:项目中遇到的问题是多人同时使用不同压测服务器进行压测,导致无法在grafana中查看到自己脚本当前实际使用线程数。这时可以将application填写压测服务器IP做为区别,这样第一具有唯一性第二具有真实用途标识性。这样配置就能通过筛选application来查看自己关注的运行的脚本当前线程数据。
参数summaryOnly默认选项为true,个人推荐选择false。
在调整好写入的数据的基础上,再对grafana面板中调整下配置。之后运行脚本的数据就变的灵活机动且清晰明了。
我们以官网下载使用最高的模板为基础,在模板基础上针对自己所需的需求做微调就行,下载地址:
https://grafana.com/grafana/dashboards?search=jmeter
成功导入模板后如下图,这一步没啥难度。
第一步先修改面板设置,点击图中齿轮icon进入修改,选择Variables
$application的SQL就是获取库中application字段全部数据
influxDB数据库的表由时间戳(time)、数据(field)、标签(tags)组成。application是influxDB是内置tags,show tag标签数据。
transaction根据application选择的application的值联动查询对应的全部transaction数据。需要注意SQL中去除了internal和all2个值,这是influxDB为transaction预留的内部使用名,所以大家给transaction取名的时候需要注意不要与预留名重名,这样数据会被自动筛除或者不准确等问题。
修改data_source,application,
配置项筛选条件选为ALL,展示全部数据
~~接下来开始正式调整展示各项数据~~
进入编辑配置
下图为Total Errors数据模板提供的原始配置
Total Errors对应调整如下:
添加分类数据application;"application" =~ /^
-- 调整SQL
select sum("countError") FROM "$measurement_name" WHERE ("transaction" = 'all' AND "application" =~ /^$application$/) AND $timeFilter GROUP BY "application",time($__interval) fill(null)
ALIAS BY改为$tag_application;在图标字段列出当前全部application名字,application名字就是jmeter中application写入的值。
看下实战应用的展示,这里按压测服务器IP末尾值作为application的值,可以清晰明了的区分看到同一时间内有2台压测服务器在运行脚本并且列出自个独立的报错数量
Active Threads的调整和Total Errors是如出一辙的
-- 调整SQL,添加application数据分类
select last("maxAT") FROM "$measurement_name" WHERE ("transaction" = 'internal' AND " application" =~ /^$application$/) AND $timeFilter GROUP BY "application",time($__interval) fill(null)
ALIAS BY改为$tag_application
图中显示2台(148,158)压测服务器运行的脚本分别使用的线程数
接下来复制一个Total Throuhtput来添加一个展示数据位,展示单请求吞吐量的数据
对复制出来的Throuhtput进行修改,展示每个单独请求的吞吐量,展示数据的名字按自己实际需求修改
transaction=all获取脚本的总事务的数据,这里所关注的是单个请求的吞吐量数据,所以去除transaction
添加statut=all,statut是请求的状态all为全部,ok为成功,ko为失败
添加transaction数据分类,"application" =~ /^
-- 调整SQL
select last("count")/$send_interval FROM "$measurement_name" WHERE ("statut"='all' AND"application" =~ /^$application$/) AND $timeFilter GROUP BY "transaction",time($__interval) fill(null)
调整ALIAS BY改为$tag_transaction,图标字段列出当前全部transaction名字,transaction名是jmeter脚本中各个请求的名字
图中展示一个脚本中2个请求分别为V1和V3,2个请求各自的吞吐量以及总吞吐量走势(all为总吞吐量)
Network Traffic调整
SQL添加"transaction"=~ /^
SQL
select mean("sb") FROM "$measurement_name" WHERE ("application" =~ /^$application$/ AND"transaction"=~ /^$transaction$/ ) AND $timeFilter GROUP BY "transaction", time($__interval) fill(null)
SELECT mean("rb") FROM "$measurement_name" WHERE ("application" =~ /^$application$/ AND"transaction"=~ /^$transaction$/) AND $timeFilter GROUP BY "transaction", time($__interval) fill(null)
sb(sent KB/sec)调整ALIAS BY改为$tag_transaction-in
rb(Received KB/sec)调整ALIAS BY改为$tag_transaction-out
图中2个请求对应各自的in和out的网络开销
全部调整完毕如图,同时采样收集多个服务多个接口并展示,也提供了筛选条件来过滤只查看自己所关注的数据
模板中还有些别的数据展示,有需求的同学可以按以上提供的方法试着调整出自己需要的数据,大家一定要理解清楚对应关系再去尝试,不加理解直接套用sql大概率报错。