掘金 后端 ( ) • 2024-04-10 19:42

前言

为什么要搭建这个平台?

先 jmeter 是一个优秀的开源性能测试工具,它非常通用,多数公司的压测方案都会选择该工具。但是 jmeter 自带的聚合报告有很明显的缺陷:

  1. 只能自己看,分享不方便,缺乏实时性。
  2. 展示的信息比较简陋,不美观也不直观。

如上缺陷可能可以通过安装插件解决部分问题,但是无法完美解决。
因此我选择了 influxDB+grafana 的方案。

  • influxDB: 这是一个开源的时间序列数据库。它专门设计用于处理高度时间相关的数据,具有高性能和可扩展性,可以胜任 jmeter 的数据写入需求。
  • grafana: 这是一个用于可视化和分析数据的开源数据仪表盘工具。它非常流行,提供了简单易用的用户界面,可以从多种数据源中获取数据,并将数据以图表、图形、表格等形式展示出来。grafana 支持实时监控、报警、告警以及自定义插件等功能。

这是该方案的数据流向图 image.png

部署

本次也是通过 docker-compose 进行 InfluxDB 和 Grafana 的部署,jmeter在windows上搞一个免安装的。

InfluxDB(2.x)

本次部署的 InfluxDB 版本为 2.7.5 的,以下配置项仅适用于 v2 版本,不兼容 v1 版本和 v3 版本

1.x 和 2.x 的区别

  • 2.x 版本自带 web-ui,可以输出简易的图像报表和管理数据,1.x 则不带有 web-ui,必须依靠第三方工具输出图像报表
  • 1.x 版本使用 influxQL 查询语言,2.x 和 1.8+(beta) 使用 flux 查询语法
  • 2.x 相对于 1.x 移除了 database,新增了 bucket 概念

容器部署

  1. 创建对应的文件夹,并修改目录操作权限
mkdir -p /usr/local/docker/influxdb/{conf,data}

chmod 777 /usr/local/docker/influxdb/{conf,data}
  1. 进入influxdb目录
cd /usr/local/docker/influxdb
  1. 新建docker-compose.yml文件 以下是 docker-compose.yml 文件内容
version: '3'
 
networks:
  web-network:
 
services:
  docker-influxdb:
    image: influxdb:2.7.5
    container_name: influxdb
    restart: always
    ports:
      - "8086:8086" #HTTP UI and API port
    environment:
      DOCKER_INFLUXDB_INIT_MODE: "setup"
      DOCKER_INFLUXDB_INIT_USERNAME: "root" #创建管理员用户
      DOCKER_INFLUXDB_INIT_PASSWORD: "!a123456" #创建管理员密码,太简单会报错
      DOCKER_INFLUXDB_INIT_ORG: "org" #组织名称
      DOCKER_INFLUXDB_INIT_BUCKET: "jmeter"
    volumes:
      - "/usr/local/docker/influxdb/data:/var/lib/influxdb2"
      - "/usr/local/docker/influxdb/conf:/etc/influxdb2"
    networks:
      - web-network

关于 INFLUXDB_TOKEN 的获取:

cat /usr/local/docker/influxdb/conf/influx-configs
  1. 通过docker compose启动
docker compose up -d

influxDB 使用

登录

输入你创建容器时的管理员账号和密码

新建 bucket

跳转至路径 load data ——> buckets ——> buckets ——> create bucket 新建一个 bucket

image.png

image.png 命名为 jmeter image.png

新建 telegraf

telegraf的主要作用是权限,它可以控制写入和读取任意buckets数据的权限范围

tag 切换至 telegraf,然后选择 create configuration image.png

bucket 这里选择 jmeter,然后 data from 我这里选择的是 Docker(无影响) image.png

创建成功后这里有一串 token,复制保存下来。 image.png

token 管理

tag 切换至 api tokens,这里可以对之前创建 telegraf 的 token 进行管理,也可以创建读写任意 bucket 的 root 权限 token(需注意安全)

注意:telegraf默认生成的token无法用于grafana连接influxdbbucket,因为没有读取bucket的权限。需要创建一个可以操作对应buckettoken

image.png

创建一个自定义权限的token image.png

需要对指定bucket,同时拥有读、写权限。 image.png

Grafana

容器部署

1. 获取 grafana 镜像
docker pull grafana/grafana:10.4.1
2. 准备挂载目录和配置文件
  • Your_PATH/grafana/data 目录,准备用来挂载放置grafana的数据
  • Your_PATH/grafana/plugins 目录,准备用来放置grafana的插件
  • Your_PATH/grafana/conf 目录,准备用来挂载放置grafana的配置文件
  • Your_PATH/grafana/logs 目录,准备用来挂载放置logs的文件
mkdir -p /usr/local/docker/grafana/{data,plugins,conf,logs}
  • 修改文件夹权限,如果不修改,创建容器时可能会挂载失败,这边为了方便,全部修改成了 777(不推荐)
chmod 777 /usr/local/docker/grafana/{data,plugins,conf,logs}
  • 复制配置文件
# 临时启动一个容器
docker run --name grafana-tmp -d grafana/grafana
# 将容器中默认的配置文件拷贝到宿主机上
docker cp grafana-tmp:/etc/grafana/grafana.ini /usr/local/docker/grafana/conf/grafana.ini
# 移除临时容器
docker rm -f grafana-tmp
3启动容器
  • 进入/usr/local/docker/grafana
cd /usr/local/docker/grafana
  • 新建docker-compose.yml文件
version: "3"
 
services:
  grafana:
    image: grafana/grafana:10.4.1
    container_name: grafana
    privileged: true
    environment:
      TZ: Asia/Shanghai
      GF_SECURITY_ADMIN_PASSWORD: admin   # 设置默认管理员admin的密码为admin
    volumes:
      - /usr/local/docker/grafana/conf:/etc/grafana
      - /usr/local/docker/grafana/data:/var/lib/grafana
      - /usr/local/docker/grafana/plugins:/var/lib/grafana/plugins
      - /usr/local/docker/grafana/logs:/var/log/grafana
    ports:
      - "3000:3000"

docker-compose.yml 的文件路径下,使用 docker compose 启动

docker compose up -d

访问 http://你的ip:3000, 成功进入 web 页面 image.png

开启 https 和匿名访问

1. 开启 https

如果你的 web 页面想要通过外网访问,最好开启 https
将你的证书文件 your_server.crt 和证书密钥 your_server.key 上传至路径 /usr/local/docker/grafana/conf 下,然后修改挂载目录下的配置文件 grafana.ini

[server]
protocol = https        # 默认配置文件第32行,这里改成https
cert_file = /etc/grafana/your_server.crt    # 默认配置文件第64行,你的证书文件
cert_key = /etc/grafana/your_server.key     # 默认配置文件第65行,你的证书密钥
2. 开启匿名访问

由于 Grafana 的常用方式是将配置好的 Grafana 图嵌入到系统页面中,
所以需要实现免登录访问,
同样是修改配置文件 grafana.ini
搜索 [auth.anonymous] 配置块,将其下的匿名访问控制 enabled 设置为 true,组织权限设置为 Viewer(该权限为默认一般不用改)

[auth.anonymous]
# enable anonymous access
enabled = true
 
# specify organization name that should be used for unauthenticated users
org_name = Main Org.
 
# specify role for unauthenticated users
org_role = Viewer

所有配置文件修改完成之后,重启容器,即可实现上述功能

连接数据源

  1. 跳转至路径首页——>连接——>数据源,选择添加新数据源 image.png
  2. 选择 InfluxDB image.png

数据源设置

  • Name:数据源名称,任意填写
  • Query Language:选择 Flux,2.x 版本必须选这个,1.x 选择 influxQL
  • URL:http://your_ip:8086
  • Organization:填写你的 org 名称
  • Token:填写你 telegraf 的 token,我备注创建的可对bucket读写的token
  • Default Bucket:填写 jmeter

image.png

image.png

设置完成之后,点击 Save&test,测试连接数据源,连接结果会提示 image.png

新建仪表板

连接数据源成功后需要新建一个仪表板
路径跳转至首页 ——> 仪表板,选择新建

image.png

这里我选择导入一个模板 image.png

这里可以通过加载 json 文件,或者输入模板 id 进行加载,模板 id 可以在官网查找 image.png

这里我选择填入 id19950,因为我已经导入了,所以报警。 image.png 保存后成功创建面板

jmeter(v5.6.3)

连接 influxDB

  1. 添加一个Thread Group image.png
  2. 给刚刚添加的Thread group添加一个Backend Listener(后端监听器) image.png

监听器设置

  • 后端监听器实现:Jmeter 压测指标监听器的实现类,按使用的数据上报协议进行选择。本文使用 influxdb 协议上报压测指标数据,因此选择 org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient
  • 异步队列大小:指标处理一般队列大小,除非遇到性能问题,否则保持默认 5000 不变。
  • influxdbMetricsSender:metric sender 的实现类,保持默认即可。
  • influxdbUrl: http://你的influx服务器地址/api/v2/write?org=你的Organizations名称&bucket=你的Bucket名称
  • application:你的 application name
  • measurement:你的 bucket name
  • summaryOnly:选择 true 的话就只保留汇总数据结果,false 会将每个 transaction 都分别记录
  • samplersRegex:保留 blank 或填 .* 表示上报所有 sampler 压测 metric。若按需上报,此处指定 sampler 的名称正则表达式。
  • percentiles:指定上报的百分位数据。
  • eventTags:可指定 tag,如制定则存储在 events measurement 中。
  • influxdbToken: 填写你 telegraf 的 token。

image.png

演示

如果只是照着上面的配置,并不会有实际的数据,需要使用jmeter对你的项目进行接口测试,才会有真实数据。 如下,我先添加两个HTTP请求,然后进行测试,可以查看数据成功写入 influxDB, 然后展示在 grafana 的面板上: image.png

image.png

image.png

image.png

参考:基于jmeter+InfluxDB(2.x)+Grafana方案,搭建实时可视化压测监控平台