1. 项目概述与核心价值
最近在做一个内部系统的性能压测,用JMeter跑脚本看报告是常规操作,但每次盯着那个黑乎乎的聚合报告,或者导出一堆CSV文件再拉进Excel里做图表,总觉得效率太低,反馈也不够直观。尤其是在做长时间稳定性测试或者需要实时观察系统表现的时候,这种滞后性就更让人头疼。后来研究了一下,发现把JMeter的测试数据实时推送到InfluxDB时序数据库,再用Grafana这个强大的可视化工具做图表展示,能完美解决这个问题。整个方案在Windows上跑起来也相当顺畅,今天就详细拆解一下这个“JMeter + InfluxDB + Grafana”可视化监控平台的搭建全过程。
这个平台的核心价值在于,它能将性能测试从“事后分析”转变为“实时监控”。你不再需要等测试跑完才能看结果,而是在压测进行的同时,就能在一个酷炫的仪表盘上看到实时的TPS(每秒事务数)、响应时间、错误率等关键指标的变化曲线。这对于定位性能瓶颈、观察系统在压力下的稳态表现、以及及时终止异常测试场景,都有巨大的帮助。无论是开发自测、测试人员做性能验证,还是给领导做演示,一个实时更新的可视化大屏,其说服力和效率都远超静态报告。
2. 环境准备与组件选型解析
2.1 组件角色与协作关系
在动手之前,我们先理清这三个核心组件各自扮演什么角色,以及它们是如何协同工作的。
- JMeter:压力发起端与数据生产者。它通过运行测试计划,模拟用户请求对目标系统施加压力。同时,我们需要配置一个叫
Backend Listener的监听器,它的作用就是将测试过程中实时产生的性能数据(如响应时间、吞吐量)发送出去。 - InfluxDB:高性能时序数据库,充当数据仓库。它专门为处理带时间戳的数据而优化,非常适合存储性能监控指标。JMeter的
Backend Listener会将数据以HTTP协议写入InfluxDB中指定的数据库(Database)和测量(Measurement,类似于SQL中的表)。 - Grafana:数据可视化与仪表盘平台。它本身不存储数据,而是作为一个强大的“画板”,从InfluxDB中查询数据,并将查询结果以各种精美的图表(如折线图、仪表盘、热图)形式展示出来。我们可以自由地组合图表,构建一个完整的性能监控仪表盘。
整个数据流非常清晰:JMeter压测 -> 实时数据 -> InfluxDB存储 -> Grafana查询并绘图 -> 用户实时查看。
2.2 版本选择与下载
版本兼容性是成功的第一步,尤其是InfluxDB,其1.x和2.x版本在API和架构上有巨大差异。为了与JMeter的Backend Listener无缝对接,我们选择经过广泛验证的稳定组合。
- JMeter:建议使用较新的稳定版,如Apache JMeter 5.6.2或更高。从 Apache JMeter官网 下载
zip格式的二进制包即可。它需要Java环境,确保你的Windows上已安装JDK 8或11,并配置好JAVA_HOME环境变量。 - InfluxDB:这是关键!必须选择1.x版本。因为JMeter内置的
Backend Listener默认使用InfluxDB 1.x的写入协议(Line Protocol)和API。我们选择InfluxDB 1.8.10这个经典的稳定版本。你可以从InfluxData的官方发布页面找到历史版本进行下载。 - Grafana:选择最新的稳定版即可,如Grafana 10.x。它对数据源版本兼容性较好。从 Grafana官网 下载Windows版本的安装包(.exe)或压缩包(.zip)。
注意:切勿下载InfluxDB 2.x版本用于此项目。2.x版本使用了全新的API(Flux语言)和认证体系,与JMeter默认配置不兼容,需要大量额外改造,徒增复杂度。
3. InfluxDB 1.8 安装与配置详解
3.1 安装与启动
下载到的通常是一个名为influxdb-1.8.10_windows_amd64.zip的压缩包。将其解压到你喜欢的目录,例如D:\PerformanceTools\influxdb-1.8.10。InfluxDB是绿色软件,无需安装。
启动InfluxDB: 进入解压后的目录,你会看到
influxd.exe(服务端守护进程)和influx.exe(命令行客户端)。要启动数据库服务,最简单的方法是打开命令提示符(CMD)或PowerShell,导航到该目录,然后运行:.\influxd.exe首次运行会在当前目录下生成一个
data文件夹和一个meta文件夹,用于存储数据和元数据。保持这个命令行窗口打开,服务就在运行了。你会看到日志输出,显示服务已启动在8086端口。验证安装: 另开一个命令行窗口,同样导航到InfluxDB目录,运行客户端连接:
.\influx.exe成功进入后,会显示
>提示符。输入SHOW DATABASES,应该能看到一个内置的_internal数据库。这说明InfluxDB服务运行正常。
3.2 创建专属数据库与用户
虽然JMeter可以直接向默认数据库写数据,但为了管理和权限清晰,我们最好为性能测试创建一个专用数据库。
在上一步的influx命令行中,依次执行以下命令:
-- 创建一个名为 jmeter 的数据库,这个名字可以自定义,但后续配置需一致 CREATE DATABASE jmeter -- 切换到 jmeter 数据库 USE jmeter -- 查看当前数据库中的“表”(在InfluxDB中叫Measurement),初始应为空 SHOW MEASUREMENTS为了安全(虽然本地环境非必须),我们可以创建一个专属用户并授权。但在InfluxDB 1.8中,默认认证是关闭的。如果你需要开启,需修改配置文件influxdb.conf中的[http]部分,设置auth-enabled = true,然后重启服务。这里为了简化,我们暂不开启认证。后续在JMeter配置中,用户名密码留空即可。
实操心得:对于长期运行的压测监控,建议将InfluxDB配置为Windows服务,这样开机就能自动启动,无需手动打开命令行。可以使用
NSSM(Non-Sucking Service Manager)这类工具将influxd.exe安装为系统服务,非常方便。
4. Grafana 安装与数据源配置
4.1 安装与初次登录
如果你下载的是.exe安装包,直接双击运行,按向导安装即可。安装完成后,Grafana会作为服务在后台运行。如果下载的是.zip压缩包,解压后运行bin目录下的grafana-server.exe。
默认情况下,Grafana服务监听在3000端口。打开浏览器,访问http://localhost:3000。首次登录,默认用户名和密码都是admin。登录后,系统会强制要求你修改密码,请务必设置一个强密码并牢记。
4.2 添加 InfluxDB 数据源
这是连接Grafana和InfluxDB的关键一步。
- 在Grafana左侧导航栏,点击齿轮图标进入Configuration->Data Sources。
- 点击Add data source按钮。
- 在列表中选择InfluxDB。
- 进入配置页面,填写以下关键信息:
- Name: 给你这个数据源起个名字,例如
JMeter_InfluxDB。 - HTTP->URL: 填写InfluxDB的服务地址。因为都在本机,所以是
http://localhost:8086。 - InfluxDB Details->Database: 填写我们在InfluxDB中创建的数据库名
jmeter。 - InfluxDB Details->User/Password: 如果我们没有开启InfluxDB认证,这里留空。如果开启了,则填写创建的用户名和密码。
- InfluxDB Details->HTTP Method: 选择
GET。(对于查询,GET是标准方法)。
- Name: 给你这个数据源起个名字,例如
- 最关键的一步:点击页面底部的Save & test按钮。如果配置正确,你会看到绿色的提示框,显示“Data source is working”。这表示Grafana已经成功连接到InfluxDB的
jmeter数据库。
注意事项:如果测试失败,请检查:1) InfluxDB服务是否在运行(
http://localhost:8086能否访问);2) 数据库名jmeter是否拼写正确;3) 如果开启了认证,凭证是否正确。一个常见的坑是InfluxDB 1.x和2.x的API不兼容,确保你用的是1.x版本。
5. JMeter 配置:将数据写入 InfluxDB
现在,我们需要告诉JMeter,把压测数据发送到我们刚搭建好的InfluxDB里。
5.1 添加 Backend Listener
- 打开你的JMeter测试计划(.jmx文件)。
- 在你想监听的线程组上(或者直接在测试计划下添加,以监控所有线程组),右键Add->Listener->Backend Listener。
- 在Backend Listener的控制面板中,进行如下配置:
- Backend Listener implementation: 选择
org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient。这是JMeter内置的、专门用于InfluxDB 1.x的监听器实现。 - influxdbMetricsSender: 选择
org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender。 - influxdbUrl: 填写InfluxDB的写入地址,格式为
http://localhost:8086/write?db=jmeter。其中/write是InfluxDB 1.x的数据写入端点,db=jmeter指定了目标数据库。 - application: 可以自定义一个应用名,例如
MyPressureTest。这个值会作为measurement的一个标签(tag),方便你在Grafana中区分不同应用的测试数据。 - measurement: 保持默认
jmeter即可。这是InfluxDB中存储数据的主表名。 - summaryOnly: 通常保持
false。如果设为true,则只发送聚合数据(如平均值、百分位数),不发送每个采样器的详细数据。为了获得更细致的图表,建议用false。 - samplersRegex: 使用正则表达式来匹配需要发送数据的采样器。
.*表示发送所有采样器的数据。 - percentiles: 定义需要计算的百分位数,例如
90;95;99。这会在数据中生成P90、P95、P99等响应时间指标。 - testTitle: 为这次测试运行起个标题,例如
Stability_Test_01。它也会作为标签,方便区分多次测试。
- Backend Listener implementation: 选择
其他参数如username和password,如果InfluxDB未开启认证,则留空。
5.2 理解写入的数据结构
配置好后,JMeter在运行时会周期性地(默认每30秒)将一批数据发送到InfluxDB。写入的数据点(Point)主要包含以下字段:
- 测量(Measurement):
jmeter(或你自定义的名字)。 - 标签(Tags): 用于标识和过滤数据,例如
application=MyPressureTest,transaction=你的采样器名称,statut=ok/ko(请求成功或失败)。 - 字段(Fields): 具体的指标值,这是图表展示的核心,包括:
count: 请求数。avgResponseTime: 平均响应时间。maxResponseTime: 最大响应时间。minResponseTime: 最小响应时间。pct90ResponseTime: 90%响应时间(如果你配置了百分位数)。errorCount: 错误数。receivedBytes: 接收字节数。sentBytes: 发送字节数。throughput: 吞吐量(TPS)。
- 时间戳(Timestamp): 每个数据点都带有精确的时间戳。
这种结构使得在Grafana中,我们可以非常灵活地按transaction(接口名)分组查看,也可以按application(应用名)或statut(状态)进行过滤。
6. Grafana 仪表盘创建与核心图表配置
数据已经源源不断地从JMeter流入InfluxDB,现在是时候用Grafana把它们变成直观的图表了。我们可以从零开始搭建,但更高效的方法是导入社区现成的、为JMeter量身定制的仪表盘模板。
6.1 导入 JMeter 官方仪表盘模板
Grafana社区有一个非常流行的JMeter仪表盘模板,它已经设计好了所有关键图表和查询。
- 在Grafana左侧导航栏,点击Dashboards->New->Import。
- 在Import via grafana.com输入框中,输入模板ID
5496,然后点击Load。 - 在下一步中,选择我们之前创建的数据源
JMeter_InfluxDB。 - 点击Import。
瞬间,一个功能齐全的JMeter性能监控仪表盘就出现在你面前了。这个模板通常包含以下核心面板:
- Active Threads Over Time: 活跃线程数(并发用户数)随时间变化。
- Response Times Over Time (Percentiles): 响应时间百分位数(平均、P90、P95、P99)趋势。
- Transactions Per Second: 每秒事务数(TPS/吞吐量)。
- Response Codes Per Second: 每秒的HTTP状态码分布。
- Latency Over Time: 延迟时间趋势。
- Connect Time Over Time: 连接时间趋势。
- Bytes Throughput Over Time: 网络吞吐量(发送/接收字节数)。
- Response Time Distribution: 响应时间分布直方图。
6.2 核心图表原理与自定义
导入的模板开箱即用,但理解其背后的查询(Query)原理,能让你在需要时进行自定义。
以最关键的“Transactions Per Second”图表为例,我们看看它的InfluxDB查询是怎么写的。点击图表标题 -> Edit。
在查询编辑器(Query editor)中,你会看到类似如下的InfluxQL语句(InfluxDB 1.x的查询语言):
SELECT non_negative_derivative(mean("count"), 1s) AS "throughput" FROM "jmeter" WHERE $timeFilter GROUP BY time($__interval), "transaction", "statut" ORDER BY timeSELECT non_negative_derivative(mean("count"), 1s): 这是计算TPS的核心。count是累计请求数,non_negative_derivative函数计算其随时间的变化率(导数),即单位时间内的请求数,再通过1s参数归一化为“每秒”的速率。mean是取时间段内的平均值,使曲线更平滑。FROM "jmeter": 指定从jmeter这个measurement中查询。WHERE $timeFilter: Grafana的宏,自动应用你在仪表盘右上角选择的时间范围。GROUP BY time($__interval), "transaction", "statut": 按时间间隔(自动适配)、事务名和状态进行分组。这样图表就能同时展示不同接口、成功与失败请求的TPS曲线。ORDER BY time: 按时间排序。
你可以基于这个模板进行修改。例如,如果你只想看某个特定接口(如/api/login)的成功请求TPS,可以在WHERE条件中增加:AND "transaction" = '/api/login' AND "statut" = 'ok'。
实操心得:模板的查询语句通常已经过优化。不建议新手直接大改,但可以尝试复制一个面板,在新的副本上做实验。重点关注
GROUP BY后面的标签(tag),通过调整它们可以改变图表的分组和聚合维度。例如,去掉"statut"分组,就能看到接口的总TPS(成功+失败)。
7. 全流程联调与实战演示
现在,让我们把整个流程串起来,进行一次实战演练。
7.1 启动服务与准备测试
- 启动InfluxDB: 在它的目录下,运行
.\influxd.exe,确保服务在8086端口运行。 - 启动Grafana: 如果已安装为服务,它应该已在运行。访问
http://localhost:3000确保能登录。 - 配置JMeter: 打开你的测试脚本,确保已正确添加并配置了
Backend Listener(指向http://localhost:8086/write?db=jmeter)。 - 打开Grafana仪表盘: 进入你导入的JMeter仪表盘(ID: 5496)。将仪表盘右上角的时间范围选择器设置为“Last 5 minutes”或“Last 1 hour”,并点击刷新图标设置为自动刷新,例如每5秒或10秒。这样图表就会自动更新。
7.2 执行压测并观察仪表盘
- 在JMeter中,点击运行按钮(绿色三角形)开始你的性能测试。
- 立即切换到Grafana的仪表盘页面。你应该能在几秒到几十秒内(取决于Backend Listener的发送间隔),看到图表开始出现数据并动态更新。
- Active Threads图表会显示当前并发用户数。
- Transactions Per Second图表会展示实时的吞吐量曲线。
- Response Times Over Time图表会展示响应时间的变化,你可以清晰看到随着压测进行,响应时间是保持平稳还是逐步上升。
- Response Codes图表可以立刻帮你发现是否有大量错误(如5xx或4xx)产生。
这种实时反馈的能力是静态报告无法比拟的。你可以一边增加负载,一边观察系统的响应时间拐点;也可以在做稳定性测试时,长时间运行并观察各项指标是否平稳。
7.3 仪表盘个性化与告警设置
基础监控满足后,你可以进一步深化:
- 个性化布局: Grafana允许你自由拖拽、调整面板大小,也可以新增面板。例如,你可以新增一个“单值统计”(Stat)面板,显示当前整体的平均响应时间或错误率,让关键指标一目了然。
- 设置告警: Grafana强大的告警功能可以让你在指标异常时及时获知。例如,你可以为“平均响应时间”设置一条规则:当它在5分钟内持续超过500毫秒时,触发告警。告警渠道可以配置成邮件、Slack、钉钉、Webhook等。
- 进入仪表盘,编辑“Response Times Over Time”面板。
- 切换到Alert选项卡,创建告警规则。
- 设置条件,例如
WHEN avg() OF query(A, 5m, now) IS ABOVE 500。 - 在Notifications中配置告警渠道。
8. 常见问题、性能调优与深度排查
搭建和使用过程中,难免会遇到一些问题。这里记录一些典型的坑和解决方案。
8.1 数据延迟或不显示
- 症状: JMeter在运行,但Grafana图表没有数据或数据更新严重延迟。
- 排查步骤:
- 检查InfluxDB写入: 在JMeter运行期间,用InfluxDB客户端连接,执行
USE jmeter然后SHOW SERIES或SELECT * FROM jmeter LIMIT 10。如果能看到数据,说明JMeter写入成功。 - 检查Backend Listener间隔: JMeter的Backend Listener默认每30秒发送一次数据。对于需要秒级监控的场景,这个间隔可能太长。你可以在JMeter的
jmeter.properties文件中修改backend_influxdb.send_interval属性(单位为秒),例如改为5。注意:设置过短会增加JMeter和InfluxDB的负担。 - 检查Grafana查询和时间范围: 确认Grafana仪表盘选择的时间范围覆盖了压测时间段,并且自动刷新已开启。
- 检查防火墙: 确保Windows防火墙没有阻止JMeter(发送端)对
localhost:8086的访问,或者InfluxDB对8086端口的监听。
- 检查InfluxDB写入: 在JMeter运行期间,用InfluxDB客户端连接,执行
8.2 InfluxDB 磁盘空间增长过快
性能测试,尤其是长时间高并发的测试,会产生海量数据点。InfluxDB数据文件可能会迅速膨胀。
- 解决方案:设置数据保留策略(Retention Policy)。 InfluxDB的数据保留策略决定了数据保存多久。默认是永久保存。我们可以为
jmeter数据库创建一个保留7天的策略。 在InfluxDB客户端中执行:
这条命令创建了一个名为USE jmeter CREATE RETENTION POLICY "one_week" ON "jmeter" DURATION 7d REPLICATION 1 DEFAULTone_week的策略,数据保留7天,副本数为1(单机),并设置为默认策略。之后新写入的数据7天后会自动删除。对于历史数据,可以使用ALTER RETENTION POLICY ...来修改。
8.3 JMeter 自身资源消耗过高
当并发数很大时,Backend Listener频繁计算和发送数据可能会消耗不少CPU和内存,从而影响压测机本身的性能,导致测试结果失真。
- 优化建议:
- 调整发送间隔: 如上所述,适当增大
backend_influxdb.send_interval,减少发送频率。 - 使用异步队列: Backend Listener默认使用异步队列来缓冲和发送数据,确保它不会阻塞测试线程。通常不需要改动。
- 分离监控与压测机: 在生产级压测中,最佳实践是使用独立的机器(或容器)运行InfluxDB和Grafana,甚至使用独立的“从属JMeter服务器”来发送监控数据,避免与主压测机资源竞争。
- 精简发送的数据: 在Backend Listener中,通过
samplersRegex只监控关键的业务采样器,而不是所有.*。
- 调整发送间隔: 如上所述,适当增大
8.4 Grafana 图表查询慢或卡顿
当时间范围拉得很长(比如看过去一周的数据),而数据量又极大时,图表加载可能会变慢。
- 优化建议:
- 利用InfluxDB的连续查询(Continuous Query)降采样: 可以创建一个CQ,将高频的原始数据(比如每秒一个点)聚合成低频的汇总数据(比如每分钟一个平均值),并存入一个新的measurement。在Grafana中,查看长时间趋势时,就查询这个降采样后的低精度数据;查看近期细节时,再查询原始数据。这能极大提升查询性能。
- 优化Grafana查询: 避免在查询中使用
GROUP BY过于细粒度的标签,或者返回过多的时间序列。确保查询的WHERE条件能有效利用索引(在InfluxDB中,tag是索引的)。 - 调整时间间隔: 在Grafana面板的查询设置中,可以使用
$__interval宏,它会根据当前选中的时间范围自动调整查询分组的时间间隔,避免在查看长时间范围时查询过于密集的数据点。
搭建这个可视化监控平台,最深的体会是它彻底改变了性能测试的工作流。从“跑完再看”到“边跑边看”,这种实时性带来的掌控感是质的飞跃。初期可能会在版本兼容性(特别是InfluxDB 1.x vs 2.x)和网络配置上踩点小坑,但一旦打通,后续就是纯收益。对于复杂的测试场景,我强烈建议将这套环境容器化(Docker Compose),一键启动所有服务,环境隔离和部署会变得极其简单。另外,花点时间研究一下Grafana的告警功能,设置几个关键阈值(比如错误率>1%或P99响应时间>2秒),能让这个平台从“监控仪表盘”升级为“智能预警系统”,在测试出现异常时第一时间通知你,进一步提升效率。