背景

日常的版本迭代开发中,每当封版上线之前,项目组都会对当前开发后的整体系统进行稳定性、压力、回归等各种性能测试,他们的测试时间一般都会持续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页面选择配置数据源

k8s容器删除 挂载目录会被删除么 k8s 挂载文件_数据源


k8s容器删除 挂载目录会被删除么 k8s 挂载文件_测试数据_02


k8s容器删除 挂载目录会被删除么 k8s 挂载文件_k8s容器删除 挂载目录会被删除么_03

配置之前部署的influxdb的链接地址,influxdb:8086,以及创建好的的用户 、密码和库名称

k8s容器删除 挂载目录会被删除么 k8s 挂载文件_测试数据_04

jmeter

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

JMeter+InfluxDB+Grafana 的结构如下:

k8s容器删除 挂载目录会被删除么 k8s 挂载文件_k8s容器删除 挂载目录会被删除么_05

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

JMeter 中 Backend Listener 的配置
  • 首先在jmeter中添加Backend Listener
  • k8s容器删除 挂载目录会被删除么 k8s 挂载文件_测试数据_06

  • 配置数据将要发送到的influxdb的连接地址,以及相关的应用和库信息和jmeter的listenser实现类,选jmeter相关的那个
  • k8s容器删除 挂载目录会被删除么 k8s 挂载文件_k8s容器删除 挂载目录会被删除么_07

导入grafana jmeter展示模版

  • 添加一个 JMeter dashboard
  • k8s容器删除 挂载目录会被删除么 k8s 挂载文件_k8s容器删除 挂载目录会被删除么_08

  • 我们常用的 dashboard 是 Grafana 官方 ID 为 5496 的模板
  • k8s容器删除 挂载目录会被删除么 k8s 挂载文件_数据_09

  • 导入进来后,选择好对应的数据源。
  • k8s容器删除 挂载目录会被删除么 k8s 挂载文件_数据_10

  • 最后就可以看到展示的面板了
  • k8s容器删除 挂载目录会被删除么 k8s 挂载文件_测试数据_11

当通过jmeter 进行测试产生测试数据。这里就可以看到数据展示了