背景
日常的版本迭代开发中,每当封版上线之前,项目组都会对当前开发后的整体系统进行稳定性、压力、回归等各种性能测试,他们的测试时间一般都会持续2-3天,在用jmeter进行测试后,由于生成的日志等请求信息会非常大,导致最后生成聚合报告失败,难以观察到 测试期间的系统各种表现,为了解决这个问题,通过今天这篇文章,我们通过搭建jmeter+grafana+influxdb 的监控平台,将jmeter实时产生的测试数据异步打入influxdb,数据库,最后我们可以通过grafana来聚合展示整个测试过程中我们想看到的聚合结果,进而避免最后jmeter生成报告失败
搭建
jmeter
jmeter是部署在专门的压力测试服务器上的,只要从官网下载进行配置即可
k8s
由于后续grafana、influxdb都是被容器化部署在k8s当中的,所以需要先部署一套k8s 集群,如果没有可以参考ubuntu 18.04 基于kubeadm 搭建kubernetes 1.15.0来搭建自己的k8s集群
grafana
对于k8s集群的监控 一般prometheus + grafana都是标配,如果没有参考kube-prometheus来搭建属于自己的监控服务,我们这篇文章只用到了里面的grafana
influxdb
- influxdb也是部署在k8s中的,以下是他的部署文件,由于海外镜像拉取都存在缓慢或者被墙的问题,我已经通过阿里云的海外机房构建了国内的镜像,直接只用我的配置文件里的镜像即可
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: influxdb
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
k8s-app: influxdb
template:
metadata:
labels:
task: monitoring
k8s-app: influxdb
spec:
containers:
- name: influxdb-containers
image: registry.cn-beijing.aliyuncs.com/mirror-suke/influxdb:1.7-alpine
volumeMounts:
- name: influxdb-storage
mountPath: /data/influxdb
ports:
- containerPort: 8086
volumes:
- name: influxdb-storage
hostPath:
path: /root/influxdb
---
apiVersion: v1
kind: Service
metadata:
name: influxdb
namespace: monitoring
spec:
type: NodePort
ports:
- nodePort: 31436
port: 8086
targetPort: 8086
selector:
k8s-app: influxdb
- 注意influxdb 和grafana都部署在了相同的namespace
- 这里通过nodeport对外暴露了influxdb的端口将集群的31436 映射到了influxdb默认端口8086,所以如果是集群内部访问,直接使用serviceName:port 的方式即可,也就是influxdb:8086,如果是从外部访问就需要 集群ip:31436的方式去访问了
配置
所有的基础服务部署完成之后,接下里就需要组合起来z这些服务来完成我们的测试功能了
influxdb
你可以进入容器内或者远程连接influx,创建后面我们写入测试数据的时许数据库和连接需要的用户,这里选择直接进入容器的方式
kubectl get po -n monitoring | grep influx
influxdb-74c54878c8-6t555 1/1 Running 0 158m
//进入容器
kubectl exec -it influxdb-74c54878c8-6t555 /bin/sh -n monitoring
//创建用户
create user "root" with password 'newpwd' with all privileges
//创建jmeter库
create database jmeter
grafana 数据源
前面部署好的grafana,我这里通过nodeport来暴露对外访问的url,这样就可以打开grafana 的ui页面了
具体grafana service的配置方式如下
apiVersion: v1
kind: Service
metadata:
labels:
app: grafana
name: grafana
namespace: monitoring
spec:
ports:
- name: http
nodePort: 31435
port: 3000
protocol: TCP
targetPort: 3000
selector:
app: grafana
type: NodePort
打开ui页面选择配置数据源
配置之前部署的influxdb的链接地址,influxdb:8086,以及创建好的的用户 、密码和库名称
jmeter
最后需要配置jmeter的Backend Listener,它帮我们实时发送数据到 InfluxDB,有这个 JMeter 发送给 InfluxDB, 有了这个数据之后,我们不需要看上面的那些 HTML 数据,也可以直观地看到系统性能的性能趋势。并且这样保存下来的数据,在测试结束后想再次查看也比较方便比对。
JMeter+InfluxDB+Grafana 的结构如下:
在这个结构中,JMeter 发送压力到服务器的同时,统计下 TPS、响应时间、线程数、错误率等信息。默认每 30 秒在控制台输出一次结果(在 jmeter.properties 中有一个参数 #summariser.interval=30 可以控制)。配置了 Backend Listener 之后,将统计出的结果异步发送到 InfluxDB 中。最后在 Grafana 中配置 InfluxDB 数据源和 JMeter 显示模板。然后就可以实时查看 JMeter 的测试结果了,这里看到的数据和控制台的数据是一样。
JMeter 中 Backend Listener 的配置
- 首先在jmeter中添加Backend Listener
- 配置数据将要发送到的influxdb的连接地址,以及相关的应用和库信息和jmeter的listenser实现类,选jmeter相关的那个
导入grafana jmeter展示模版
- 添加一个 JMeter dashboard
- 我们常用的 dashboard 是 Grafana 官方 ID 为 5496 的模板
- 导入进来后,选择好对应的数据源。
- 最后就可以看到展示的面板了
当通过jmeter 进行测试产生测试数据。这里就可以看到数据展示了