背景
日常工作中,经常会用到Jmeter去压测,毕竟LR还要钱(@¥&*...),而最常用的接口压力测试,我们都是通过聚合报告去查看压测结果的,然鹅聚合报告的真的是丑到家了,作为程序猿这当然不能忍!那我们要怎么给它变得好看点捏?
如何华丽变身?
方式
优点
缺点
场景
Jmeter+ant+Jenkins
快捷,上手简单
报告还是不够美观、直观,如果测试接口一多,报告就会显示臃肿不够直观
看最终报告
Grafana+Jmeter+Influxdb(推荐)
数据可视化,数据直观,筛选功能强大,拓展能力强
当然就是要自己部署环境咯,还得了解Influxdb的语法和常用查询语句,系统方法等.....
看压测过程中参数的变化
工具介绍
工具
介绍
Jmeter
Java语言开发的压力测试工具(不多介绍)
InfluxDB
Go 语言开发的一个开源分布式时序数据库,非常适合存储指标、事件、分析等数据
Grafana
纯 Javascript 开发的前端工具,用于访问 InfluxDB,自定义报表、显示图表等
Centos7安装InfluxDB
备注:博主是自己买的阿里云服务器哈,就不介绍虚拟机下如何安装了(毕竟虚拟机很多坑...)
1、直接执行以下命令进行安装:
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.6.3.x86_64.rpm
sudo yum localinstall influxdb-1.6.3.x86_64.rpm
2、安装完成后,修改InfluxDB的配置,主要配置jmeter存储的数据库与端口号
vim /etc/influxdb/influxdb.conf
3、找到graphite并且修改它的库与端口
enabled = truedatabase = "jmeter"retention-policy = ""bind-address = ":2003"protocol = "tcp"consistency-level = "one
4、找到http,将前面的#号去掉
5、现在新版本的InfluxDB已取消自带的数据可视化界面了,旧版的还是有,可通过找到admin,将前面的#号去掉,开放它的UI端口;(该步骤非必须!)
可通过InfluxDB可视化工具来查看我们的数据库和数据哦,具体安装和简单使用参照此篇博文:https://www.cnblogs.com/poloyy/p/12213495.html
[admin]
# Determines whether the admin service is enabled.
enabled = true
# The default bind address used by the admin service.
bind-address = ":8083"
6、配置成功后,启动InfluxDB
启动命令: systemctl start influxdb.service
查看状态命令: systemctl status influxdb.service
到此,InfluxDB已安装并配置完成了!!*:ஐ٩(๑´ᵕ`)۶ஐ:*
特别说明:
8083端口:InfluxDB的UI界面展示的端口
8086端口:Grafana用来从数据库取数据的端口
2003端口:刚刚设置的,Jmeter往数据库发数据的端口
Centos7安装Grafana
1、直接执行以下命令进行安装:
wget https://dl.grafana.com/oss/release/grafana-6.5.2-1.x86_64.rpm
sudo yum localinstall grafana-6.5.2-1.x86_64.rpm
2、然后启动即可
启动命令: systemctl start grafana-server.service
查看状态命令: systemctl status grafana-server.service
3、访问IP加端口 http://xxx.xx.xx.xx:3000 ,输入用户名,密码登录系统。用户名与密码都是"admin",如果能打开页面则已经成功了!但是...装环境这东西怎么可能这么简单??
4、当你查看状态是active但是访问3000时是失败的话,辣么有可能就是你的3000端口还未开放!
5.访问IP加端口 http://xxx.xx.xx.xx:3000 ,若能访问到grafana就是成功啦!
配置Jmeter
这里就不教如何安装Jmeter了哈,主要讲Jmeter作为采集端是通过什么采集数据的
步骤一:在线程组中,添加监听器(Listener)- Backend Listener
步骤二:配置Backend Listener
可以看到,Jmeter默认选中的Implementatin是 GraphiteBackendListenerClient ,它是Jmeter 2.13就开始提供了;在Jmeter 3.2时又加多了一个 InfluxDBBackendListenerClient ,哎~这两者有什么区别呢?后面会讲到!
这里先讲选中 GraphiteBackendListenerClient 时,每个配置项的含义
graphiteHost:InfluxDB安装的服务器的ip
graphitePort:端口;默认就是2003,除非你自己安装InfluxDB时设置了其他端口是哦(可见上面安装InfluxDB后关于graphite的配置)
rootMetricsPrefix:指标的根前缀;将测试结果存入数据库时,不同指标会生成不同表,但这些表都最好要有一个共同的前缀,这个就是了;后面会讲到不同的指标的含义(重点哦)
summaryOnly:当你线程组有多个请求又想知道每个请求的结果数据时,最好填false,因为true只会返回所有请求的集合数据报告,不会输出每条请求的数据报告
samplersList:取样器列表;想收集哪些请求就填哪些,最好用正则去匹配,减轻工作量
useRegexpForSamplersList:是否使用正则;如果true则使用,samplersList里可以匹配正则表达式
percentiles:百分比;即类似聚合报告里90% Line,95% Line,99% Line的数据;倘若想要99.9时,需要写成【99_9】,用下划线代替点
建议:如果想看每个请求的结果数据的话,根据我的截图进行配置即可;只需改动samplerList来匹配你需要监控的请求,其他不用动!
步骤三:运行Jmeter脚本,查看数据库
一开始,我的数据库是只有两张表的,这里方便演示,就只跑get、post请求了
如果成功了代表结果数据也存进InfluxDB里面了,接下来我们来看看使用 GraphiteBackendListenerClient 时会生成哪些表呢?
可以看到生成了三种前缀的表,分别是: jmeter.all 、 jmeter.get 、 jmeter.post ;最后其实还有 jmeter.test 开头的表,这个后面会单独拿出来说
============================================
=== 倘若不想了解每个指标的具体含义,可以跳过下面内容
=== 直接点击右侧目录,跳转至配置Grafana,查看下一步
============================================
步骤四:细品指标含义
为什么每个表都有jmeter前缀呢?
因为在Jmeter的Backend Listener配置了rootMetricsPrefix 值为 jmeter. ,你不喜欢前缀或者想起其他名,在Backend Listener里直接改 rootMetricsPrefix 的值就可以了
可以参考下官方文档的写法: .ok.count ,rootMetricsPrefix和samplerName都是变量,可配置的
接下来,我们来说明下每个前缀的含义
jmeter.all :代表了所有请求;当summaryOnly=true时,就只有samplerName=all的表了
jmeter.get :代表了HTTP请求的名字是get,即samplerName=get
jmeter.post :代表了HTTP请求的名字是post,即samplerName=post
备注:假设你的某个HTTP请求叫【GET请求啊】,辣么你的数据库就会生成以jmeter.GET请求啊 为前缀的各种表
然后再针对不同指标说下它们的含义
划重点:这里的指标含义都是直接翻译Jmeter官方文档的
Thread/Virtual Users metrics - 线程/虚拟用户指标
跟线程组设置相关的
指标
全称
含义
test.minAT
Min active threads
最小活跃线程数
test.maxAT
Max active threads
最大活跃线程数
test.meanAT
Mean active threads
平均活跃线程数
test.startedT
Started threads
启动线程数
test.endedT
Finished threads
结束线程数
Response times metrics - 响应时间指标
划重点:每个sampler都包含了所有响应时间指标,每个sampler的每个指标都会有单独的一个表存储结果数据
指标
含义
.ok.count
sampler的成功响应数
.h.count
服务器每秒命中次数(每秒点击数,即TPS)
.ok.min
sampler响应成功的最短响应时间
.ok.max
sampler响应成功的最长响应时间
.ok.avg
sampler响应成功的平均响应时间
.ok.pct
sampler响应成功的所占百分比
.ko.count
sampler的失败响应数
.ko.min
sampler响应失败的最短响应时间
.ko.max
sampler响应失败的最长响应时间
.ko.avg
sampler响应失败的平均响应时间
.ko.pct
sampler响应失败的所占百分比
.a.count
sampler响应数(ok.count+ko.count)
.sb.bytes
已发送字节
.rb.bytes
已接收字节
.a.min
sampler响应的最短响应时间
(ok.count和ko.count的最小值)
.a.max
sampler响应的最长响应时间
(ok.count和ko.count的最大值)
.a.avg
sampler响应的平均响应时间
(ok.count和ko.count的平均值)
.a.pct
sampler响应的百分比
(根据成功和失败的总数来计算)
不知道大家是否有个疑问,为何 a.min 、 a.max 、 a.avg 明明说的都是平均响应时间,但是括号里备注的又是和响应数相关的;但是Jmeter官方文档说明翻译过来的确是这样的..只能等我来寻找答案了!
经过我的“缜密”对比,可以发现官网说明的确是错的哈,真实情况如下!
a.min :是ok.min和ko.min的最小值
a.max :是ok.max和ko.max的最小值
a.avg :是ok.avg和ko.avg的平均值
接下来就是用数据说明事实!按照上面的指标顺序来看图哈!
不过,博主并不确定这样比对是否完全科学正确,但是从博主验证结果来说,我的纠正是正确滴!
附上按官方文档说明翻译过来的对比图,可以看到如果是 a.max 的话,跟 ok.count 和 ko.count 是没有半毛钱关系的
配置Grafana
首先进入Grafana的首页,可以看到官方画了个流程:先创建数据源,再创建数据面板
创建数据源
一共有两个入口哈,可以在首页直接点击 Create your first data source ,也可以看第二张图按步骤进入创建页面
然后,选择InfluxDB作为我们的数据源
到此为止,数据源就配置成功啦!!
配置数据看板
Grafana&InfluxDB集成,展示测试结果数据
panel基础使用
按上面的步骤创建好DashBoard后,再通过panel展示具体数据,先介绍下panel的入口
一般选 Add Query 先,当然选 Choose Visualization 也可以,进去后可以相互切换的
Convert to row 就是生成一行,可以将展示差不多一致类型数据的panel放到里面,统一管理,收起or展开;
如下图,我将描述线程数和响应数的panel放在同一个Row了
数据绑定
查看总线程数、成功响应数、失败响应数
可以先点Add Query,进入到下面的界面
若想看成功响应数和失败响应数,只需要切换表名即可;
可以发现跟我一开始只展示数字不太一样,因为图表类型还没设置;当我们只想看数据而不想看数据趋势图的话,可以改变它的类型;
在同一个界面,点击左侧列表选中第二个icon,然后选择Singlestat即可
查看所有请求、get请求、post请求的TPS
如果想在同一个panel里展示多个指标数据的话,可以通过在Panel里Add Query
基本的数据绑定已经教会大家啦,自己想要展示什么数据直接改变表名就行了
顺带附上官方提供的一个数据看板图,大家也可以照搬照抄用它的panel,手动添加每个指标
至此,初级版的Grafana+Jmeter+Influxdb 性能实时监控平台初步搭好啦!
当然博主是不建议Jmeter使用 GraphiteBackendListenerClient 来采集数据的,因为请求多起来的时候会有非常多的表,维护成本也会增加;后面将会介绍如何通过 InfluxDBBackendListenerClient 来采集数据
配置Backend Listener之InfluxDBBackendListenerClient
配置项含义
首先来看看每个配置项的含义
influxdbUrl:安装influxdb的路径;主要格式:http://主机地址:8086/write?db=数据库名
application:应用名称;在 events 表中对应的字段是 application
measurement:表名;数据存储到哪个表,默认是jmeter,不用改即可
summaryOnly:同GraphiteBackendListenerClient
samplersRegex:同GraphiteBackendListenerClient
percentiles:同GraphiteBackendListenerClient
testTitle:测试名称;在 events 表中对应的字段是 text ,JMeter在测试的开始和结束时自动生成注释,该注释的值以'start'和'end'结尾
eventTags:Grafana允许为每个注释显示标签;在 events 表中对应的字段是 tags
不懂application和testTitle的小伙伴可以看看下面的图,可以看到同一个testTitle的两条记录的时间差就是执行测试计划的总时长
建议:只需修改application和testTitle即可,可以相同也可以不相同,其他配置跟着图片走就好了;当然安装路径还是要改的哈
查看InfluxDB
使用InfluxDBBackendListenerClient好处就是,再多的请求也只会生成两张表:
events :主要拿存事件的
jmeter :存测试结果数据的,Grafana也是从这个表获取数据再展示
再次Grafana&InfluxDB集成,展示测试结果数据
这次就不再需要自己去创建DashBoard和Panel了,因为在官方模板库,已经有一个非常完美的模板了,当然前提是你要用 InfluxDBBackendListenerClient 采集数据才能有效的哈
首先,进入官方模板库: https://grafana.com/dashboards ,然后跟着图片导入模板并初始化即可
只要你的数据源,表名配的没有错,Jmeter再执行一下测试计划,DashBoard中筛选下时间,就可以成功看到数据啦!
模板自带了三个下拉筛选框
data_source:数据源,在Grafana配置了多少个就显示多少个
application:在Jmeter配置好的application,如果每次测试计划执行时的application都不一样,你就可以通过这个筛选出对应测试时机的结果数据了
transaction:在Jmeter配置好的sampleList,譬如我只发了get、post请求,这里就只会给你选get、post;可以滑到页面下面看到针对某个请求的数据展示
其实这个模板还有很多可以值得改进优化的地方,辣么这个时候就需要你对Grafana的各种用法熟悉操作啦,后续会补充一篇关于Grafana常见用法&高级用法的文章哦!敬请期待!