Jmeter + Grafana + InfluxDB 性能测试监控

发布于 2020-09-18  2,493 次阅读


阅读目录

1. 安装InfluxDB

2. 安装Grafana

3. 配置Jmeter

序章

在性能监控图谱中,有操作系统、应用服务器、中间件、队列、缓存、数据库、网络、前端、负载均衡、Web 服务器、存储、代码等很多需要监控的点。我只能找最常用的几个,做些逻辑思路的说明,同时也把具体的实现描述出来。如果你遇到了其他的组件,也需要一一实现这些监控。

在本篇中,主要想说明白下图的这个监控逻辑。

这应该是现在最流行的一套监控逻辑了吧。

所有做性能的人都应该知道一点,不管数据以什么样的形式展示,最要紧的还是看数据的来源和含义,以便做出正确的判断。

我先说明一下 JMeter 和 node_exporter 到 Grafana 的数据展示逻辑。至于其他的 Exporter,我就不再解释这个逻辑了,只说监控分析的部分。

JMeter+InfluxDB+Grafana 的数据展示逻辑

一般情况下,我们用 JMeter 做压力测试时,都是使用 JMeter 的控制台来查看结果。如下图所示:

或者装个插件来看结果:

这样看都没有问题,对于压力工具来说,我们最多只关心三条曲线的数据:TPS(T 由测试目标定义)、响应时间、错误率。这里的错误率还只是辅助排查问题的曲线,没有问题时,只看 TPS 和响应时间即可。

不过采取以上三种方式有几个方面的问题。

  • 整理结果时比较浪费时间。
  • 在 GUI 用插件看曲线,做高并发时并不现实。
  • 在场景运行时间比较长的时候,采用生成 HTML 的方式,会出现消耗内存过大的情况,而实际上,在生成的结果图中,有很多生成的图我们并不是那么关注。
  • 生成的结果保存之后再查看比较麻烦,还要一个个去找。

那么如何解决这几个问题呢?

用 JMeter 的 Backend Listener 帮我们实时发送数据到 InfluxDB 或 Graphite 可以解决这样的问题。

其实有这个 JMeter 发送给 InfluxDB 的数据之后,我们不需要看上面的那些 HTML 数据,也可以直观地看到系统性能的性能趋势。并且这样保存下来的数据,在测试结束后想再次查看也比较方便比对。

JMeter+InfluxDB+Grafana 的结构如下:

在这个结构中,JMeter 发送压力到服务器的同时,统计下 TPS、响应时间、线程数、错误率等信息。默认每 30 秒在控制台输出一次结果(在 jmeter.properties 中有一个参数 #summariser.interval=30 可以控制)。配置了 Backend Listener 之后,将统计出的结果异步发送到 InfluxDB 中。最后在 Grafana 中配置 InfluxDB 数据源和 JMeter 显示模板。

然后就可以实时查看 JMeter 的测试结果了,这里看到的数据和控制台的数据是一样。

        是吧,很帅吧!数据是用InfluxDB来存储的,展示则是用Grafana(dashboard是官方 ID 为 5496)来展示的

        InfluxDB是一个年轻的时序数据库,是用同样很年轻的语言“GO”开发出来的。小数据量的时候还性能还不错,但是数据量大一点,性能问题就体现出来了。不过只是收集一下我几个小时测试的数据,还是足够了。要是几个月的测试数据那还是挑别的数据库吧。

        Grafana是纯粹用js编写出来的,专门用来展示数据用的。

        基本上,就是Jmeter通过“Backend Listener”,将测试的数据上传到我的虚拟机上,通过InfluxDB来存储,Grafana来展示出来。我们访问web,稍微配置一下,就可以看到展示的数据了。

    我的InfluxDB和Grafana都是部署在一台Linux虚拟机下面的。

虚拟机 --- IP 10.9.128.47

1. 安装InfluxDB

新建InfluxDB下载源

cat << EOF | tee /etc/yum.repos.d/influxdb.repo[influxdb]name = InfluxDB Repository - RHEL \$releaseverbaseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stableenabled = 1gpgcheck = 1gpgkey = https://repos.influxdata.com/influxdb.keyEOF

使用yum下载InfluxDB

yum install -y influxdb

修改InfluxDB的配置,主要配置jmeter存储的数据库与端口号,还有需要将UI端口开放

[root@localhost ~]# vim /etc/influxdb/influxdb.conf # 找到graphite并且修改它的库与端口[[graphite]]  enabled = true  database = "jmeter"  bind-address = ":2003"  protocol = "tcp"  consistency-level = "one" # 找到admin,将前面的#号去掉,开放它的UI端口[admin]
  # Determines whether the admin service is enabled.
  enabled = true  # The default bind address used by the admin service.
  bind-address = ":8083"  # Whether the admin service should use HTTPS.
  # https-enabled = false  # The SSL certificate used when HTTPS is enabled.
  # https-certificate = "/etc/ssl/influxdb.pem

启动InfluxDB

[root@localhost ~]# /etc/init.d/influxdb restartStopping influxdb...influxdb process was stopped [ OK ]Starting influxdb...influxdb process was started [ OK ]

打开浏览器,访问虚拟机IP“http://10.9.128.47:8083”

如果启动成功应该会InfluxDB的web ui界面。查看有没有jmeter库,没有就新建一个。

在输入框中,输入如下,来新建库:

CREATE DATABASE "jmeter"

2. 安装Grafana

使用yum下载Grafana并且安装

yum install https://grafanarel.s3.amazonaws.com/builds/grafana-3.0.1-1.x86_64.rpm

启动Grafana

[root@localhost ~]# /etc/init.d/grafana-server restartOKopping Grafana Server ...                                [  OK  ]Starting Grafana Server: .... OK

打开浏览器,访问虚拟机IP“http://10.9.128.47:3000”

输入用户名,密码登录系统。用户名与密码都是"admin"

数据源,dashboard我已经配置过

添加需要展示数据的数据库

添加InfluxDB数据库配置。输入帐号密码“admin / admin”,点击Test & Save 提示“Success”说明成功了

【注意】URL的端口是8086,而刚才配置的8083是UI的端口。

    - 8083端口是InfluxDB的UI界面展示的端口

    - 8086端口是Grafana用来从数据库取数据的端口

    - 2003端口则是刚刚设置的,Jmeter往数据库发数据的端口

3. 配置Jmeter

1. jmeter中,添加“监听器 -> Backend Listener”

2. 配置“Backend Listener”,主要配置Host,如下图

Graphite Backend Listener 的支持是在 JMeter 2.13 版本,InfluxdDB Backend Listener 的支持是在 JMeter 3.3 的版本,都是异步发送。

3. 添加一个http请求

4. 添加“监听器 -> 查看结果树” 运行一下Jmeter,主要看http请求是否发送出去了


没有什么问题,这个时候访问InfluxDB“http://10.9.128.47:8083”, 在输入框中输入如下,点击回车:

# 可以使用这个,这个是查询所有表,显示1条记录select * from /.*/ limit 1 # 也可以使用这个,这个是显示所有表show measurements

点击回车后,就应该有数据了,会出现下图:

这个时候再回来配置Grafana,来展示这些数据

添加一个展示项目

添加一个dashboard

导入一个模板(5496)

大致介绍几种我常用的监控。

名称描述
jmeter.all.h.count所有请求的TPS
jmeter.<请求名称>.h.count对应<请求名称>的TPS
jmeter.all.ok.pct9999%的请求响应时间
jmeter.<请求名称>.ok.pct99对应<请求名称>99%的请求响应时间
jmeter.all.test.startedT线程数

如果想要了解这些监控都代表什么意思,可以访问Jmeter的官网地址去查看阅读“http://jmeter.apache.org/usermanual/realtime-results.html

最后来一张帅气的图:


一名测试工作者,专注接口测试、自动化测试、性能测试、Python技术。