性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_JMeter

概述

本文我们将介绍如何使用JMeter+InfluxDB+Grafana打造压测可视化实时监控。

引言

我们很多时候在使用JMeter做性能测试,我们很难及时察看压测过程中应用的性能状况,总是需要等到测试完成后去看Report,如果是长时间压测,比如压测1~2天,那就更烦人了。

压测的时候,我们实时通过监听器 ​GenerateSummaryResults​汇总输出,可以看到如下内容

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_InfluxDB_02

GenerateSummaryResults​汇总展示了压测中需要关注的大量信息,其中包括:Avg (Average), Min (Minimum) 、Max (Maximum)响应时间,TPS,错误率,活跃线程数等, ​jmeter.properties​默认是30秒的统计频率,如果我们想使用小于30秒更细颗粒度的统计频率的时候,那么在控制台会有大量的输出,这个时候我们就不好观察结果了。

1. # jmeter.properties 

2. # Define the following property to automatically start a summariser with that name

3. # (applies to non-GUI mode only)

4. # summariser.name=summary

5. #

6. # interval between summaries (in seconds) default 3 minutes

7. # summariser.interval=30

8. #

9. # Write messages to log file

10. # summariser.log=true

11. #

12. # Write messages to System.out

13. # summariser.out=true

另一方面,如果需要分享给其它人员,这种控制台输出方式并不是一个很友好的方式,我们需要一个简单漂亮的图形,比如HTML Dashboard,但需要等待整个测试完成。

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_JMeter_03

因此,我们可以在测试计划中去除​GenerateSummaryResults​,把测试结果发送到数据库中持久化,这样我们就可以通过SQL查询数据库来创建展示图表。

从JMeter2.13开始,通过提供实现AbstractBackendListenerClient的类,可以使用(JDBC,JMS,Webservice,...)通过Backend Listener发送到数据库的存储实时结果。

BackendListenerGraphiteBackendListenerClien​t,允许将统计指标发送到Graphite 

此功能提供:

  • 实时数据
  • 漂亮图表
  • 能够对比2个以上的测试计划
  • 只要JMeter产生相同的Backend,就可以存储监控数据
  • ...

JMeter 3.2 Backend Listener中引入的 ​InfluxDBBackendListenerClient​允使用UDP或HTTP协议将统计指标发送到InfluxDB 

此功能提供:

  • 实时数据
  • 漂亮图表
  • 能够对比2个以上的测试计划
  • 能够向图表添加注释
  • 只要JMeter产生相同的Backend,就可以存储监控数据
  • ...

解决方案

JMeter引入Backend Listener,用于在压测过程中实时发送统计指标数据给时序数据库Influxdb,通过配置Grafana(开源的WEB可视化看板)数据源连接到Influxdb,我们就可以创建炫酷的可视化看板,并可以实时获取到测试指标数据。

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_InfluxDB_04

相关介绍:

时序数据库:处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。想象它就像一个sql表,其中时间是它的主键

InfluxDB:是一款用Go语言编写的开源分布式时序、事件和指标数据库,无需外部依赖。该数据库现在主要用于存储涉及大量的时间戳数据,如DevOps监控数据,APP metrics, loT传感器数据和实时分析数据。

官网地址:https://www.influxdata.com/

数据DEMO

1. > select* from weather

2. name: weather

3. -------------

4. time altitude area humidity temperature

5. 1456386985094000000 1000 北 18 17

6. 1456386985094000000 5000 上 20 47

7. 1456386985094000000 5000 北 26 68

8. 1456386985094000000 1000 广 17 83

9. 1456387267668000000 1000 上 12 77

10. 1456387267668000000 1000 北 16 20

11. 1456387267668000000 5000 广 -3 66

12. 1456387267668000000 5000 上 19 60

与传统数据库中的名词做比较

influxDB中的名词

传统数据库中的概念

database

数据库

measurement

数据库中的表

points

表里面的一行数据

InfluxDB中独有的一些概念

Point由时间戳(time)、数据(field)、标签(tags)组成。

Point属性

传统数据库中的概念

time

每个数据记录时间,是数据库中的主索引(会自动生成)

fields

各种记录值(没有索引的属性)也就是记录的值:温度, 湿度

tags

各种有索引的属性:地区,海拔

JMeter&InfluxDB集成

InfluxDB安装

安装要求

网络端口

InfluxDB默认使用以下网络端口:

  • TCP端口8086用于通过InfluxDB的HTTP API进行客户端-服务器通信
  • TCP端口8088用于RPC服务以进行备份和还原
  • 除了上面的端口,InfluxDB还提供了多个可能需要自定义端口的插件。可以通过配置文件修改所有端口映射,配置文件位于 /etc/influxdb/influxdb.conf默认位置。
网络时间协议(NTP)

InfluxDB使用主机的UTC本地时间为数据分配时间戳并用于协调目的。使用网络时间协议(NTP)同步主机之间的时间; 如果主机的时钟与NTP不同步,写入InfluxDB的数据的时间戳可能不准确。

下载安装

1. wget et https://dl.influxdata.com/influxdb/releases/influxdb-1.6.2.x86_64.rpm

2. sudo yum localinstall influxdb-1.6.2.x86_86_64.rpm

InfluxDB配置

找到InfluxDB配置文件(/etc/influxdb/influxdb.conf)

1. vi /etc/influxdb/influxdb.conf

influxdb.conf​中的大多数设置都被注释掉了;所有注释掉的设置将确定为内部默认值。如果配置文件中的任何未注释的设置都会覆盖内部默认值。

请注意,本地配置文件不需要包含每个配置设置。

如果你无法找到配置文件,可以使用InfluxDB显示配置命令

1. Influxd config

Jmeter使用graphite协议去写入数据到InfluxDB,因此,需要在InfluxDB配置文件启用它,如下图所示:

1. [[graphite]]

2. enabled = true

3. bind-address = ":2003"

4. database = "jmeter"

5. retention-policy = ""

6. protocol = "tcp"

7. batch-size = 5000

8. batch-pending = 10

9. batch-timeout = "1s"

10. consistency-level = "one"

11. separator = "."

12. udp-read-buffer = 0

修改后,使用以下命令加载InfluxDB启动

有两种方法可以使用配置文件启动InfluxDB:

1.使用以下-config选项将进程指向正确的配置文件

1. influxd -config /etc/influxdb/influxdb.conf

2.将环境变量设置为INFLUXDBCONFIGPATH配置文件的路径并启动

1. echo $INFLUXDB_CONFIG_PATH

2. /etc/influxdb/influxdb.conf

3.

4. influxd


InfluxDB操作

1. [root@zuozewei ~]# influx  #登录数据库

2. Connected to http://localhost:8086 version 1.6.2

3. InfluxDB shell version: 1.6.2

4. > show databases #查看所有数据库

5. name: databases

6. name

7. ----

8. _internal

9.

10. > CREATE DATABASE "jmeter" #创建数据库

11. > use jmeter #切换数据库

12. Using database jmeter

13. > CREATE USER "admin" WITH PASSWORD 'admin' WITH ALL PRIVILEGES # 创建管理员权限的用户

JMeter配置

  • 创建一个测试计划,并添加Backend Listener
  • 设置InfluxDB IP及端口
  • 运行测试,等待几秒
  • 查看JMeter是否生成错误日志

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_Grafana_05

端口说明:

  • 8086端口,Grafana用来从数据库取数据的端口
  • 2003端口,JMeter往数据库发数据的端口

查看JMeter数据库下所有的表

1. > show measurements

2. name: measurements

3. name

4. ----

5. delta

6. jmeter.all.a.avg

7. jmeter.all.a.count

8. jmeter.all.a.max

9. jmeter.all.a.min

10. jmeter.all.a.pct90

11. jmeter.all.a.pct95

12. jmeter.all.a.pct99

13. jmeter.all.h.count

14. jmeter.all.ko.count

15. jmeter.all.ok.avg

16. jmeter.all.ok.count

17. jmeter.all.ok.max

18. jmeter.all.ok.min

19. jmeter.all.ok.pct90

20. jmeter.all.ok.pct95

21. jmeter.all.ok.pct99

22. jmeter.test.endedT

23. jmeter.test.maxAT

24. jmeter.test.meanAT

25. jmeter.test.minAT

26. jmeter.test.startedT

27. total

OK,我们已经可以将统计指标数据成功发送到InfluxDB

Grafana&InfluxDB集成

什么是Grafana?

Grafana是一个开源软件,拥有丰富的指标仪表盘和图形编辑器,适用Graphite, Elasticsearch, OpenTSDB, Prometheus,InfluxDB。简单点说就是一套开源WEB可视化平台。

官网地址:https://grafana.com/

安装启动

下载安装

1.  wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.2.0-1.x86_64.rpm 

2. sudo yum localinstall grafana-4.2.0-1.x86_64.rpm

启动

1. service grafana-server start

2. Starting grafana-server (via systemctl): [ OK ]

使用浏览器打开 ​http://IP:3000/login​,访问Grafana主页

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_JMeter_06

创建InfluxDB数据源

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_Grafana_07

单击 ​save&test​,确保可以连接上InfluxDB

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_Grafana_08

创建dashboard

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_JMeter_09

添加Graph面板

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_InfluxDB_10

数据绑定

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_JMeter_11

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_InfluxDB_12

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_JMeter_13

线程数/用户相关指标

  • test.minAT-Min active threads:最小活跃线程数
  • test.maxAT-Max active threads:最大活跃线程数
  • test.meanAT-Mean active threads:活跃线程数
  • test.startedT-Started threads:启动线程数
  • test.endedT-Finished threads:结束线程数

响应时间指标

  • .ok.count:采样器的成功响应数
  • .h.count:每秒点击数
  • .ok.min:采样器成功最短响应时间
  • .ok.max:采样器成功最长响应时间
  • .ok.avg:采样器成功平均响应时间
  • .ok.pct:采样器成功响应百分比
  • .ko.count:采样器失败响应数
  • .ko.min:采样器失败的响应最短时间
  • .ko.max:采样称失败最长响应时间
  • .ko.avg:采样器失败平均响应时间
  • .ko.pct:采样器失败响应百分比
  • .a.count:采样器响应数(ok.count和ko.count的总和)
  • .a.min:采样器最小响应时间(ok.count和ko.count的最小值)
  • .a.max:采样器最大响应时间(ok.count和ko.count的最大值)
  • .a.avg:采样器平均响应时间(ok.count和ko.count的平均值)
  • .a.pct:采样器响应百分比(根据和失败样本的总数计算)

Backend Listener的默认百分位设置为“90;95;99”,即百分位数为90%,95%和99%。

Graphite使用点(“.”)去拆分的元素,这可能与十进制百分位值混淆。JMeter转换任何此类值,用下划线(“ - ”)替换点(“.”)。例如,“99.9 ”变为“99_9 ”

默认情况下,JMeter发送在samplerName“all”下累计的所有采样器的指标。 如果配置了 ​BackendListenerSamplersList​,那么JMeter还会发送匹配样本名称的指标,前提是配置 ​summaryOnly=true

压测中的效果

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_JMeter_14

导入Dashboard模版

如果让大家去设计一个好看的Dashboard,估计大家都不太想从零开始自己设计,其实Grafana官网提供丰富的模版的库,大家可以自己上去找,然后进行二次扩展。

官网模版库:https://grafana.com/dashboards

搜索看板模版

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_Grafana_15


此处,我选择下载这个下载量3000+的模版

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_Grafana_16

下模版JSON文件

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_JMeter_17

导入模版

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_InfluxDB_18

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_Grafana_19

选择数据源

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_Grafana_20


JMeter Backend Listener设置

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_Grafana_21

压测期间的动画效果

性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控_JMeter_22


至此,我初步打造的压测可视化实时监控大功告成~😄