做压测最烦的是什么?我觉得不是脚本写不出来,而是跑完一两个小时,最后只能拿到一份聚合报告,整个过程里系统到底发生了什么,全靠猜。哪怕你盯着 JMeter 的 GUI 看,那个数字也是跳来跳去,看不出趋势,更没法回溯异常是从哪一秒开始的。如果你也有这种感觉,那这篇文章应该能帮到你。
我要说的是一个在 Windows 环境下,用 JMeter 配合 InfluxDB 和 Grafana 搭建实时监控平台的完整过程。这套组合解决的核心问题只有一个:压测过程中的吞吐量、响应时间、错误率、线程数等关键指标,全部以秒级刷新的图表形式呈现在你面前,压测还没结束,你就能看到系统是否已经到达瓶颈。适合的人群很明确:正在做性能测试的工程师、负责压测环境运维的同学,以及需要经常跟领导汇报压测进展但又拿不出过程曲线的倒霉蛋。全文没有任何虚的,全是实操过的步骤和踩坑记录。
1. 整体方案设计思路——为什么非要用 InfluxDB + Grafana
1.1 先看看常见的 JMeter 结果收集方式有什么毛病
很多人刚接触性能测试时,默认就是看 JMeter 自带的聚合报告(Aggregate Report),或者跑完生成一份 HTML 报告。这两种方式不是不能用,但它们的短板非常明显。
聚合报告是测试彻底结束后才统计出来的平均数据。它告诉你整个压测期间平均响应时间是多少,但回答不了这几个问题:系统是在第几分钟开始变慢的?数据库连接池是什么时候被耗尽的?错误率飙升的时候,并发线程数是多少?我见过不少同学拿着聚合报告去定位性能瓶颈,结果只能看到"平均耗时 3 秒"这种粗颗粒度指标,完全不知道瓶颈出现的准确时间点,排查起来大海捞针。
HTML 报告比聚合报告好一点,它有时间趋势图,但生成时机依然是压测结束之后。你没法在压测进行中实时发现问题,更没法在脚本还在跑的时候就判断"是不是应该停掉压测,避免把系统打挂"。做压测的人都知道,在线系统经不起你盲跑一晚上,出一个事故就是大事故。所以,实时的指标可视化,不是锦上添花,而是刚需。
1.2 数据收集方案对比:时序数据库才是正确答案
有人可能第一反应是"我可以把 JMeter 的结果写进 MySQL,然后自己写个查询页面"。理论上确实可行,但注意,JMeter 在高并发压测下,每秒会生成成千上万条采样数据。用 MySQL 这种关系型数据库来存时序数据,写入性能首先就是瓶颈,再加上你还要自己写后端接口、写前端图表,工作量直接翻倍,到最后你都不知道自己是在做压测还是在做开发。
InfluxDB 是专门为时序数据设计的数据库,它最擅长处理的就是"时间戳 + 指标 + 标签"这种结构的数据。JMeter 每产生一条采样结果,都可以实时推送给它,它的写入吞吐量完全扛得住。Grafana 则是目前最流行的开源可视化平台,它原生支持 InfluxDB 作为数据源,配置好之后,你只需要拖拽几下就能生成实时刷新的图表,完全不需要自己写图表代码。
这套组合在行业内已经是事实标准,尤其在性能测试监控领域。Stack Overflow 的开发者调查里也能看到,InfluxDB + Grafana 是最常用的监控组合之一。更重要的是,JMeter 官方自带一个叫做 Backend Listener 的后端监听器,里面内置了 InfluxDB 的发送实现,也就是说,从 JMeter 到 InfluxDB 这一段,官方已经帮你打通了,你要做的只是配参数。
1.3 完整数据流转链路
在这里先把这个架构的整体数据走向梳理清楚,后面配置的时候你就不会迷茫。
JMeter 在压测过程中,每完成一次采样(Sampler),Backend Listener 就会把聚合后的指标数据通过 HTTP 或 UDP 协议发送到 InfluxDB 的接口。InfluxDB 把这些数据按照时间戳存储在指定的数据库(1.x 版本)或桶(2.x 版本)中。Grafana 作为 web 服务运行在另一个端口上,它通过配置好的数据源连接 InfluxDB,用 InfluxQL 或 Flux 查询语句读取数据,最后渲染成折线图、柱状图、仪表盘等可视化面板,并在浏览器里以 1 秒到 5 秒的间隔自动刷新。
整个链路的数据格式非常统一:每条数据都包含 measurement(类似关系型数据库的表名),以及一组 field(实际的指标值)和 tag(用于过滤的属性标签)。JMeter 发送的数据里,measurement 默认叫 jmeter,field 包括响应时间、吞吐量、错误率等,tag 包括测试计划名称、采样器名称等。理解了这个结构,你在 Grafana 里写查询语句时就能有的放矢。
2. 环境准备与基础安装——先把地基打牢
2.1 工具清单与版本匹配说明
在 Windows 上搭建这套平台,需要准备以下工具,我直接给出我验证过的版本组合:
| 工具 | 推荐版本 | 说明 |
|---|---|---|
| JDK | 8 或 11 | JMeter 的运行基础,建议用 11,兼容性更好 |
| JMeter | 5.4.1 及以上 | 5.x 版本都对 InfluxDB 有良好支持 |
| InfluxDB | 1.8.10 | 最稳妥的版本,官方内置 HTTP 写入接口,配置简单 |
| Grafana | 9.x 或 10.x | 对 InfluxDB 1.x 数据源支持非常成熟 |
为什么我推荐 InfluxDB 1.8 而不是 2.x?原因在于 JMeter 的 Backend Listener 和 1.x 的兼容性最好。2.x 引入了桶(Bucket)和令牌(Token)认证,配置方式完全变了,而且 1.8 至今仍有很长的生命周期支持。如果你非要上 2.x,也不是不行,但配置难度会明显上升,后面我会专门用一节来讲两者的差别,帮你在选型上少踩坑。
版本选择上还有一个细节:Grafana 的版本迭代非常快,9.x 到 10.x 的界面和告警规则配置略有差异。我个人推荐直接用 10.x,因为它的告警系统更完善,但如果你熟悉旧版,用 9.x 也完全没问题,下面讲的配置步骤在两个版本里都适用。
2.2 Windows 下 InfluxDB 的安装与启动细节
InfluxDB 是绿色软件,不需要安装向导。下载 zip 包后解压到指定目录,比如 D:\tools\influxdb-1.8.10。解压后目录里会有一个 influxd.exe,这就是数据库服务端,还有一个 influx.exe,这是命令行客户端。
启动前需要先改配置文件。默认情况下 InfluxDB 会读取解压目录下的 influxdb.conf,但 1.8 版本如果不指定配置文件,它也会使用内置的默认配置直接启动。为了把数据落到指定位置,我习惯先编辑配置文件,找到 [meta] 和 [data] 两个配置段,修改 dir 参数指向统一的数据目录。
我实际用的配置文件核心改动如下:
[meta] dir = "D:/data/influxdb/meta" [data] dir = "D:/data/influxdb/data" wal-dir = "D:/data/influxdb/wal" [http] bind-address = ":8086" enabled = true修改完配置后,用命令行启动服务:
D:\tools\influxdb-1.8.10\influxd.exe -config D:\tools\influxdb-1.8.10\influxdb.conf注意,HTTP 服务的默认端口是 8086,这个端口在 JMeter 配置、Grafana 数据源配置中都要用到。确认能启动后,可以等下一节讲 Windows 服务化的时候再用工具把它做成开机自启,现在先保持前台运行,便于看日志。
2.3 Windows 下 Grafana 的安装与初始化
Grafana 在 Windows 上的安装有两种方式:一种是用官方提供的 Windows Installer(.msi),另一种是下载绿色版 zip 解压。我个人更喜欢 zip 方式,因为方便迁移和备份配置。
解压后目录里有一个 bin 文件夹,里面有 grafana-server.exe 和 grafana-cli.exe。启动命令:
D:\tools\grafana-10.0.3\bin\grafana-server.exe默认情况下它会监听 3000 端口。启动成功后,浏览器访问 http://localhost:3000 ,首次登录的用户名和密码都是 admin,登录后会强制让你修改密码。这步没什么难度,但要注意,如果你不想每次都手动启动 Grafana,后面也得让它服务化。
还有一个小细节:Grafana 的配置文件是 conf/defaults.ini,一般不直接改它,而是复制一份 custom.ini 来覆盖配置。比如要改端口、改数据目录、配置邮件告警,都在 custom.ini 里操作。
2.4 端口规划与 Windows 防火墙的坑
这一节非常重要。JMeter、InfluxDB、Grafana 三者联调的时候,端口规划一旦没做好,排查起来极其痛苦。
我的建议是固定一套端口约定:
| 服务 | 默认端口 | 说明 |
|---|---|---|
| InfluxDB HTTP API | 8086 | JMeter 发送数据的入口 |
| Grafana Web | 3000 | 浏览器访问看板 |
| Grafana HTTP 探测 | 未开启 | 无需放开 |
| JMeter GUI | 无 | 无网络监听 |
如果你用的是 InfluxDB 1.x,还有 8088 端口用于备份和 RPC 服务,但一般不用对外开放。Windows 防火墙默认会拦截外网访问,如果你的客户端和服务器不在同一台机器上,就必须在防火墙里放行 8086 和 3000 端口。放行有两种做法,一种是在控制面板里新建入站规则,另一种是直接用命令行:
netsh advfirewall firewall add rule name="InfluxDB" dir=in action=allow protocol=TCP localport=8086 netsh advfirewall firewall add rule name="Grafana" dir=in action=allow protocol=TCP localport=3000我在第一次联调的时候就因为忘记了防火墙,导致客户端访问不了 Grafana,查了半天才发现问题。
3. 数据链路配置与联调——从 InfluxDB 到 JMeter 再到 Grafana
3.1 在 InfluxDB 中创建数据库与用户
InfluxDB 启动后,打开命令行客户端 influx.exe,连接到本机实例。注意,一定要先确认 HTTP 服务已经起来了,否则会提示连接失败。
influx -host 127.0.0.1 -port 8086进入命令行后,依次执行:
CREATE DATABASE jmeter CREATE USER jmeter_user WITH PASSWORD 'yourpassword' GRANT ALL ON jmeter TO jmeter_user这里的 jmeter 就是 JMeter 数据要写入的数据库名。如果你喜欢用别的名字也没问题,但要记得后面 JMeter 的 URL 里也要改成对应的名字,别这里建了 A,JMeter 里写 B,那数据肯定写不进去。
验证一下当前数据库:
SHOW DATABASES你就能看到 jmeter 数据库出现在列表里。这一步的产物是:你知道了数据库名、用户名、密码,以及 HTTP API 端口,这四个信息就是整个链路的核心凭证。
3.2 配置 JMeter 的 Backend Listener
在 JMeter 的测试计划里,右键添加路径是:测试计划 -> 添加 -> 监听器 -> Backend Listener。
添加完成后,右侧会出现一堆配置选项,核心需要修改的参数如下:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| backend_listener_class | org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient | 选择 InfluxDB 实现 |
| influxdbUrl | http://127.0.0.1:8086/write?db=jmeter | 指向 InfluxDB 的写入接口 |
| application | 比如 perf_test_demo | 测试项目标识,会作为 tag 写入 |
| measurement | jmeter | 数据库中的表名 |
| samplersRegex | .* | 匹配需要汇报的采样器,默认全部 |
| useRegexForSamplerList | true | 是否用正则匹配采样器 |
| percentiles | 90;95;99 | 要记录的响应时间百分位 |
| summaryOnly | false | 是否只发送聚合汇总数据 |
配置里的 influxdbUrl 格式是重中之重。这个 URL 里的 /write?db=jmeter 是 InfluxDB 1.x 的 HTTP 写入接口标准格式。db 参数的值必须和刚才建的数据库名完全一致,我建议写绝对地址,不要用 localhost,因为 JMeter 和 InfluxDB 有可能不在同一台机器上。
samplersRegex 这个参数容易被忽略。如果你的测试计划里包含多个 Sampler,比如 /api/login 和 /api/order,但只关心某几个接口的指标,正则就派上用场了。默认的 .* 表示所有采样器都上报,如果你只想知道 login 接口的情况,可以填 /api/login.* 并要求 useRegexForSamplerList 为 true。
要有心理准备:这些参数名称比较长,Value 列表也很长,经常看到有人复制配置时把行数搞错,导致数据完全没发出去。每次改完配置,建议在压测启动的一瞬间就观察 InfluxDB 的日志有没有收到写入请求,这样能最快发现配置问题。
3.3 不用 JMeter,先用 curl 验证写入链路
这一步是我特别想强调的调优方法:在接入 JMeter 之前,先用 curl 或 Postman 手动往 InfluxDB 写一条数据,确认数据库写入链路是通的,再让 JMeter 介入。这个顺序能帮你把"数据库问题"和"JMeter 配置问题"清晰隔离。
以 Windows 的 cmd 或 PowerShell 为例:
curl -i -XPOST "http://127.0.0.1:8086/write?db=jmeter" --data-binary "jmeter,application=testtool,testPlan=hello count=1,total=100,hit=1"这条命令的含义是:向 InfluxDB 发送一行 line protocol 格式的数据,measurement 为 jmeter,tag 里有 application 和 testPlan,field 里有 count、total、hit。如果返回 HTTP 204,说明写入成功。
然后在 influx 命令行里执行:
USE jmeter SELECT * FROM jmeter你能看到刚才那条数据。到这里,数据库链路已经打通,接下来再启动 JMeter,你就知道如果 Grafana 没数据,问题一定出在 JMeter 侧或 Grafana 查询侧,而不是 InfluxDB。
3.4 启动 JMeter 压测并观察数据落地
在 JMeter 里配置好 Backend Listener 后,运行一个最简单的测试计划,比如一个 HTTP 请求,循环跑 100 次,线程数设为 10。压测进行中,在 influx 命令行执行:
SELECT * FROM jmeter ORDER BY time DESC LIMIT 10你就能看到持续不断有新数据写入。每条数据都包含类似下面的字段:
| time | application | responseTime | throughput | errorCount | status |
|---|---|---|---|---|---|
| 2024-11-20T10:30:00Z | perf_test_demo | 125 | 12.5 | 0 | OK |
到这里,数据链路联调完成。接下来才是重头戏:让 Grafana 把这些数据变成图表。
4. Grafana 仪表盘制作与常用查询——把裸数据变成可视化看板
4.1 在 Grafana 中添加 InfluxDB 数据源
浏览器登录 Grafana 后,鼠标放到左侧齿轮图标上,选择 Data Sources,点击 Add data source,找到 InfluxDB 类型。
需要填的配置项有这些:
| 配置项 | 填什么 |
|---|---|
| Name | 随意,比如 JMeter-InfluxDB |
| Query Language | 这里选择 InfluxQL |
| URL | http://127.0.0.1:8086 |
| Database | jmeter |
| User | jmeter_user |
| Password | 你设的密码 |
| HTTP Method | POST(默认即可) |
注意 Query Language 选项非常关键。Grafana 10.x 默认支持 Flux 和 InfluxQL 两种查询语法,对 InfluxDB 1.x 来说,必须选 InfluxQL,因为 1.x 本身就是 InfluxQL 体系。如果选错,后面写查询语句会各种报错。
填写完点击 Save & Test,如果配置正确,会提示 Data source is working。到了这一步,说明 Grafana 已经能读取 InfluxDB 里的压测数据了。
4.2 导入现成看板还是从零搭建?我的建议
这是一个经常被问到的选择题。社区确实有一堆现成的 JMeter 监控看板模板,在 Grafana 官网的 Dashboards 市场里搜索 jmeter 就能看到不少,比较常见的有 5496、4022、11556 等编号。直接导入省时省力,几秒钟就能看到完整的图表矩阵。
但我的建议是:模板可以导入,但一定要把模板的查询语句逐条看一遍。因为你不知道模板作者的版本、命名、指标定义方式和你是否一致。比如有些模板假设数据里包含命中数(hit)字段,有些则用的是 count 字段,名称对不上,图自然就是空的。我自己就遇到过导入一个评分很高的模板,结果 80% 的图都没数据,最后只能一个个面板重新改查询语句。
导入模板的方法是:左侧点击 Dashboards -> Import,在 Import via panel id 输入框里输入模板编号,然后选择数据源,点击 Import。它会把所有面板一次性创建好。
4.3 手工创建三个核心面板:吞吐量、响应时间、错误率
如果不想用模板,或者模板不适合,手工建面板才是真正掌握这套方案的关键。在 Grafana 里,新建 Dashboard,点击 New Panel,进入面板编辑页。
第一个面板:每秒事务数(Throughput)
Query 部分,选择 InfluxDB 数据源,查询语句写成:
SELECT mean("hit") / 60 FROM "jmeter" WHERE $timeFilter GROUP BY time(1s)这里的关键逻辑是:JMeter 发送的指标里,hit 表示本秒内完成的请求数,但因为 Backend Listener 默认是每 5 秒聚合一次,所以要除以 60(或除以相应的聚合周期)得到每秒事务数。实际取值要根据你的上报频率调整,如果你的 Grafana 面板上数字明显偏高,大概率就是没除以这个聚合窗口。
第二个面板:响应时间(RT)
SELECT mean("p99") FROM "jmeter" WHERE $timeFilter GROUP BY time(10s)这里的 p99 是 JMeter 的 Backend Listener 按照你配置的百分位参数算出来的 99 分位响应时间。也可以把 mean("p90") 和 mean("p95") 同时查出来,用两条查询语句叠加在一张图上,展示不同分位的响应时间曲线,这对判断系统稳定性的帮助远大于只看平均值。
第三个面板:错误率
SELECT sum("errorCount") / sum("count") * 100 FROM "jmeter" WHERE $timeFilter GROUP BY time(10s)错误率计算的核心是要把 errorCount 求和除以总请求数 count 求和,再乘以 100 变成百分比。注意这里不能用 mean,因为错误率是一个比例,对比例做算术平均没有意义,必须分别聚合分子和分母再相除。
这三个面板建好后,把右下角的 Refresh 间隔设为 1s 或 5s,再把时间范围选成 Last 30 minutes,一张实时刷新的监控效果就出来了。压测过程中,你就能盯着这些曲线观察系统状态,而不是事后翻报告。
4.4 设置阈值与告警,让看板主动通知你
Grafana 的看板是给人看的,但你不能 24 小时盯着显示器。所以告警是必须的。在 Grafana 10.x 中,告警规则的配置在左侧菜单 Alerting 下。
以响应时间告警为例。在 Alerting 页面点击 New alert rule,配置项如下:
- Rule name:响应时间异常告警
- Conditions:查询语句沿用面板里的查询,然后设置一个阈值,比如 p99 大于 2000(单位是毫秒),持续 1 分钟就触发
- Evaluation behavior:每 30 秒评估一次,等待时间 0 秒
- Notifications:选择通知渠道,比如邮件、Webhook
我个人实际中使用最有效的是 Webhook 通知,把告警消息推到某个群机器人。这样压测只要一出现异常,手机立刻就能收到推送,不用一直坐在电脑旁边。触发告警的条件设置建议先用比较宽的值,比如响应时间大于 3000 毫秒,观察一两次正常触发后再收紧,避免告警风暴把自己搞烦。
5. 常见问题排查与避坑清单——每一个坑都是真金白银换来的
5.1 Grafana 面板迟迟不出数据,排查顺序是这样的
我见过太多次有人在群里问"为什么我的 Grafana 没有数据",多半是链路里的某个环节配错了。排查时我坚持一条原则:自底向上,从数据产生端开始逐层检查。
顺序如下:
- 确认 JMeter 是否真的在跑,Backend Listener 有没有加到测试计划里(很多人忘记加,或者加了但测试计划没保存就关了)。
- 确认 InfluxDB 里有没有数据。执行 SELECT * FROM jmeter ORDER BY time DESC LIMIT 5,如果返回空,说明数据根本没到数据库,问题出在 JMeter 或 URL 配置。
- 确认 InfluxDB 的 HTTP 最大写入大小有没有超过限制,如果单次写入太大可能返回 413,但这种情况极少。
- 确认 Grafana 数据源配置里的 Database 和 InfluxDB 里的库名一致。
- 确认面板的查询语句里有没有带时间过滤器,Grafana 每个面板默认都会加上 $timeFilter,如果你复制了别人的查询语句但没带这个变量,结果往往是把所有历史数据都聚合了,看起来只有孤零零一个点。
- 确认面板右上角的时间范围不是可选到了老数据区间,有时候你选了 Last 5 minutes,但压测 10 分钟前就停了,自然没数据。
这条链路排查下来,90% 的问题都出在第 2 步或第 5 步。
5.2 时区问题导致时间轴偏移,图看着就是不对
Windows 默认时区是 CST(中国标准时间),而 InfluxDB 和 Grafana 默认使用 UTC 时区存储和展示时间。有时你会发现数据明明写入了,但图表上的时间点跟你实际压测的时间对不上,整体晚了 8 个小时。
解决办法分两处:一是 InfluxDB 的数据存储本身就带时区偏移,不要管它,因为它是按 UTC 存储的,这没有错;二是 Grafana 的展示时区可以调整,打开 Grafana 的 Preferences,把 Timezone 改成标准时间(或者直接选为浏览器的本地时区)。面板右上角也可以临时设置。改完之后,时间轴就对了。
一个小技巧:如果你用 curl 手写 line protocol 插入数据,时间戳一定要带时区信息,否则 InfluxDB 默认按 UTC 处理。比如用本地时间 10:00:00 写入,没带时区,它以为是 UTC 的 10:00,显示出来自然会"未来"8 小时。手写数据验证时最容易犯这个错。
5.3 InfluxDB 1.x 和 2.x 的差异,千万别混着配
数据源选型时,如果你不小心下了 2.x 版本,就能体会到什么叫配置痛苦。这里帮大家把差别几个要点列清楚:
| 维度 | InfluxDB 1.x | InfluxDB 2.x |
|---|---|---|
| 数据组织单位 | database | bucket |
| 认证方式 | 用户名 + 密码 | Token(API Token) |
| 写接口 | POST /write?db=xxx | POST /api/v2/write?bucket=xxx&org=xxx |
| 查询语法 | InfluxQL | Flux(也支持 InfluxQL 但通过兼容 API) |
| 可视化集成难易度 | 非常顺滑 | 需要处理 token 和 org 配置 |
如果你已经下了 2.x,也不是不能用,JMeter 5.4 以上的 Influxdb Backend Listener 也能发送数据到 2.x,但要额外配置 token。我的建议是,除非你的团队已经全面使用 2.x 并且有完善的运维支撑,否则在 Windows 本地搭建还是老老实实上 1.8。稳定压倒一切。
5.4 Windows 下把服务做成开机自启,防止重启后全都要手动打开
InfluxDB 和 Grafana 都是 exe 程序,如果不处理,电脑重启之后你得手动依次启动,非常烦人。我的做法是用工具把两个程序注册成 Windows 服务。
这里推荐用一款名为 NSSM 的小工具(Non-Sucking Service Manager),它专门用来把任意 exe 注册为服务。把 NSSM 解压后,打开管理员命令行:
nssm install InfluxDB它会弹出一个窗口,在 Application Path 里选择 influxd.exe,在 Arguments 里填上 -config D:\tools\influxdb-1.8.10\influxdb.conf,然后点击 Install service。Grafana 同理。
注册完成后,在服务管理器里把这两个服务启动类型设为"自动",这样每次开机就会自动拉起整个监控平台。不用再记着先去启动两个黑窗口了。
还有一个额外的建议:建议把 InfluxDB 的日志输出重定向到文件,这样排查故障时可以直接看日志文件,不用每次打开命令行窗口看滚动输出。NSSM 的 I/O 配置页里可以设置输出到 D:\logs\influxdb.log。
5.5 压测过程中 InfluxDB 写入压力过大怎么办
当并发线程数很高时,JMeter 的 Backend Listener 默认是每 5 秒聚合一次发送,这个频率在绝大多数场景下足够。但如果你把采样器上报粒度调得非常细,或者线程数突破几千,InfluxDB 的写入压力会明显上升。
如果发现 InfluxDB 的 CPU 占用过高,第一反应不是加机器,而是调整 JMeter 的聚合周期。在 Backend Listener 配置里,有一项是 interval(默认单位毫秒,默认值 5000),你可以把它调大到 10000,即每 10 秒聚合发送一次。这样写入压力直接减半,图表依然有实时性,完全够用。
另外,InfluxDB 的默认 HTTP 写入并发数是有限的,如果并发量实在太高,可以调整配置文件里的 max-concurrent-write-limit,但一般情况下你真的用不到这个参数。大多数压测场景,1.8 版本单机写入几万点每秒毫无压力。
5.6 Backend Listener 上报的数据字段含义
最后补充一个自研看板时一定会用到的字段速查表。JMeter 的 Influxdb Backend Listener 上报的数据,核心字段如下:
| 字段名 | 含义 |
|---|---|
| time | 时间戳 |
| application | 通过配置项 application 指定的应用名,用于区分不同项目 |
| count | 聚合周期内完成的请求总数 |
| errorCount | 聚合周期内的错误请求数 |
| hit | 聚合周期内命中的请求数(对于事务请求) |
| max | 最大响应时间 |
| min | 最小响应时间 |
| avg | 平均响应时间 |
| p90 / p95 / p99 | 90/95/99 分位响应时间 |
| responseTime | 总响应时间累计值 |
| throughput | 单位时间内的请求吞吐量 |
| status | 200 或 500 之类的状态码集合 |
这些字段就是你构造 Grafana 查询语句的原料。比如想看到 95 分位响应时间,直接 SELECT mean("p95") FROM "jmeter",想看到总错误率,就用 errorCount / count 组合。理解了字段,你就能根据自己的需求做出任何维度的图表,而不是只会抄模板。
最后再分享一个实际操作中的小技巧
这套平台我前前后后搭过不下十次,从最初的摸索到如今的顺手,最大的体会是:先把链路里每一环单独验证一遍,再连起来。很多人喜欢一步到位全部装好再配置,结果出了问题根本不知道从哪查起。我每次在新电脑上搭建,顺序严格固定:先装 InfluxDB,用 curl 手动写一条数据,确认入库;再装 Grafana,连数据源,写查看语句确认能查出来;最后才去动 JMeter 的 Backend Listener。每一步都有明确验证点,半小时就能全部搞定。
如果你之后想把这套监控做得更完整,还可以往前端加一步,把 Grafana 看板嵌入到自己的项目管理平台里,或者用 Grafana 的分享功能生成一个只读链接发给同事。再往后,你还可以把它整合进定时压测任务,用脚本一键触发压测并自动生成监控报告。不过这些都是后话了,先把今天说的这几个环节配好,你的压测过程就不再是黑盒了。