在上一篇阶梯式压测的文章中,我们通过jmeter的插件来查看TPS和响应时间的结果:
对于压力测试来说,我们关心的无非就是TPS、RT、错误率这三个指标。通过jmeter自带的插件去生成结果图,比较简陋,且后期整理起来会比较麻烦,需要一个个去查找,无法分析趋势。因此,这篇文章将介绍如何解决这个问题。
我们可以通过Jmeter+InfluxDB+Grafana来展示性能的结果及趋势。可以通过influxdb将每次jmeter执行的结果保存起来。InfluxDB是一款用Go语言编写的开源分布式时序、事件和指标数据库,无需外部依赖。该数据库现在主要用于存储涉及大量的时间戳数据,如DevOps监控数据,APP metrics, loT传感器数据和实时分析数据。
InfluxDB的特点可以归纳为以下9个方面:
无结构(无模式):可以是任意数量的列;
可以设置metric的保存时间;
支持与时间有关的相关函数(如min、max、sum、count、mean、median等),方便统计;
支持存储策略:可以用于数据的删改。(influxDB没有提供数据的删除与修改方法);
支持连续查询:是数据库中自动定时启动的一组语句,和存储策略搭配可以降低InfluxDB的系统占用量;
原生的HTTP支持,内置HTTP API;
支持类似sql语法;
支持设置数据在集群中的副本数;
支持定期采样数据,写入另外的measurement,方便分粒度存储数据。
再通过grafana的看板展示具体的性能指标和趋势,grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。
grafana的特点可以归纳为如下:
可视化:快速和灵活的客户端图形具有多种选项。面板插件为许多不同的方式可视化指标和日志。
报警:可视化地为最重要的指标定义警报规则。Grafana将持续评估它们,并发送通知。
通知:警报更改状态时,它会发出通知。接收电子邮件通知。
动态仪表盘:使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板顶部。
混合数据源:在同一个图中混合不同的数据源!可以根据每个查询指定数据源。这甚至适用于自定义数据源。
注释:注释来自不同数据源图表。将鼠标悬停在事件上可以显示完整的事件元数据和标记。
过滤器:过滤器允许您动态创建新的键/值过滤器,这些过滤器将自动应用于使用该数据源的所有查询。
大致的操作就是通过添加jmeter的backend listener来完成监控数据的存储,可以配置application name,measurement name,percentage和test title等。
我们一起简单看一看的jmeter源码,在InfluxdbBackendListenerClient.java中:jmeter会将运行的事务的total请求,发送和接受字节,最大值、最小值、平均值都加到metric中,同时也会分别统计成功和失败的事务信息。
然后通过influxdbMetricsManager.writeAndSendMetrics()将监控数据发送给influxDB。
influxdb安装:
brew update
brew install influxdb
启动influxdb:
1)执行influxd命令启动后台服务
2)执行influx命令启动influxdb cli
通过select * from measurements看一下influxDB的存储的数据结构:
在influxDB中,创建了两个measurements,分别是events和jmeter。在jmeter的measurement中,我们可以看到所有事务的统计信息,grafana展示时所用到的数据也是来自这个表,根据数据的时序展示不同的曲线。
在 InfluxDB 中,我们可以粗略的将要存入的一条数据看作一个虚拟的 key 和其对应的 value(field value),格式如下:
cpu_usage,host=server01,region=us-west
value=0.64 1434055562000000000
再来看一下grafana的配置,1)配置influxdb的数据源url:
2)配置influxdb的database信息:
3)在grafana中import官方提供的jmeter的dashboard模板:
就可以看到界面了:
我们来看下具体的TPS的图是按照什么规则绘制出来的?
通过select last('count') from all transaction 计算TPS。
再看看响应时间的计算规则:
通过统计status = OK 的last(avg) 来获取平均响应时间,也可以通过
SELECT last("pct90.0") FROM "$measurement_name" WHERE ("transaction" =~ ^$transaction$/ AND "statut" = 'ok') AND $timeFilter GROUP BY time($__interval) fill(null)
来获取P90的响应时间。
错误率是如何计算出来的?
可以通过如下方式error总量/所有事务数获得:
SELECT sum("error") sum("all")
FROM
(SELECT sum("count") AS "all" FROM "$measurement_name"
WHERE "transaction" =~ /^$transaction$/ AND "statut" = 'all'
AND "application" =~ /^$application$/
AND $timeFilter GROUP BY time($__interval) fill(null)),
(SELECT sum("count") AS "error" FROM "$measurement_name"
WHERE "transaction" =~ /^$transaction$/ AND "statut" = 'ko'
AND "application" =~ /^$application$/
AND $timeFilter GROUP BY time($__interval) fill(null))
至此,jmeter+influxdb+grafana的配置就完成了,可以通过筛选不同的时间段,来分析性能的各项指标以及趋势。
今天的学习就到这里,如果这篇文章对你有所帮助,请点赞和转发哦👍