ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用Grafana+InfluxDB+JMeter搭建实时压测监控体系

用Grafana+InfluxDB+JMeter搭建实时压测监控体系 用 Grafana InfluxDB JMeter 搭一套能实时看指标的压测监控体系JMeter 跑完压测只看聚合报告那你可能错过了一大半的信息。我之前也是这么干的脚本跑完盯着 Aggregate Report 和 Summary Report 看TPS、响应时间、错误率全都有但总觉得不够直观。特别是压测持续几分钟甚至几十分钟的时候中间哪一段出现尖刺、哪一段接口开始退化、系统是在哪个时间点开始扛不住的聚合报告根本说不清楚。后来我把执行结果实时写进 InfluxDB再用 Grafana 把曲线画出来效果完全不一样——压测一开跑图表实时往前推瓶颈出现的那一瞬间就能在 Dashboard 上看到。这篇就聊聊这套组合怎么搭以及我在实际使用中踩过的坑。这套东西适合谁如果你在用 JMeter 做接口测试、压力测试或者想给自己维护的服务加一套轻量的性能观测面板不需要额外买商业 APM 工具这套开源组合完全够用。InfluxDB 负责存时序数据Grafana 负责画图JMeter 负责产生负载和输出指标三者各司其职配合起来非常顺。为什么是 Grafana InfluxDB JMeter而不是别的方案先聊聊选型。很多人会问JMeter 自己的 HTML 报告也很好看为什么还要折腾 Grafana还有人说 Prometheus Grafana 不是更主流吗为什么要用 InfluxDB这几个问题我都被问过每次的答案都一样看场景。如果你只是做一次性的接口压测跑完拿结果JMeter 自带的 HTML 报告确实够了。它会生成响应时间分布图、TPS 趋势图、错误率饼图看起来很完整。但这类报告有个硬伤——它是事后生成的。压测是动态过程系统资源是一点点被吃掉的接口响应时间是一点点劣化的等到压测结束再去看报告你只能看到结果捕捉不到过程。而我们在做性能测试时最关心的恰恰是过程并发数从 100 涨到 500 的时候QPS 是线性增长还是缓慢下降内存吃满的那一刻GC 是不是开始频繁触发这些信息必须在压力测试进行的当口实时观察事后分析就晚了。再说 Prometheus。它和 Grafana 搭配确实很流行尤其是监控线上运行状态、服务器指标Prometheus 的拉取模型和告警生态都有优势。但 JMeter 的测试结果要接入 Prometheus中间需要额外的 Exporter 帮忙把数据转成 Prometheus 格式。虽然也有 jmeter-exporter 这类开源方案但配置路径更长又要管理 exporter 的自身状态对不熟悉 Prometheus 的人来说门槛偏高。InfluxDB 的优势在于它是个专门为时序数据设计的数据库写入吞吐很高和 JMeter 的对接是最顺的。JMeter 内置了 Backend Listener原生支持输出到 InfluxDB只要在 InfluxDB 里建好数据库JMeter 这边写几行配置就能把数据推过去中间不需要额外组件。Grafana 连 InfluxDB 更是标配数据源选一下面板导入就能用。这套链路可以说是压测监控里最省事的组合。方案实时性集成复杂度适用场景JMeter HTML报告低事后分析低一次性压测只看结果JMeter Prometheus Grafana高中需Exporter已有Prometheus生态要求统一监控体系JMeter InfluxDB Grafana高低内置支持性能测试专项快速搭建可视化面板整套链路的工作原理和核心概念在动手搭建之前建议先花两分钟理解这套链路的数据流。JMeter 是负载发生器模拟并发用户向目标系统发起请求。同时JMeter 内部有个Backend Listener后端监听器组件它能把测试过程中采集到的指标数据实时推送出去。我们把 InfluxDB 作为推送目标InfluxDB 收到数据后按时间序列写入存储。Grafana 再去 InfluxDB 里查询这些数据渲染成图表。这里要理解一个核心概念所有数据都是带时间戳的指标。JMeter 每跑一次采样sampleBackend Listener 就会往 InfluxDB 写一条记录字段包括metric、application、timestamp、value等。InfluxDB 里每条数据都天然带时间索引Grafana 查询时按时间范围过滤按时间粒度聚合就能画出平滑的趋势曲线。具体到 JMeter 的 Backend Listener它有两种实现InfluxdbBackendListenerClient和InfluxdbBackendListenerClient2。前者是旧版支持 InfluxDB 1.x 的写入协议后者是 2.x 版本新增的适配 InfluxDB 2.x 的 bucket 和 token 机制。我在生产环境里用的是 InfluxDB 1.8所以用的还是经典版。如果你的环境是 InfluxDB 2.x需要用InfluxdbBackendListenerClient2配置方式略有差异下文会分别讲。Grafana 这边最重要的概念是 Data Source 和 Dashboard。Data Source 就是告诉 Grafana 数据从哪来这里我们配置成 InfluxDB填好地址、数据库名、账号密码。Dashboard 是图表集合可以自己从零画也可以直接导入现成的 JSON 模板——JMeter 社区有非常成熟的面板模板导入后几乎不用改就能用。链路理清楚之后剩下的就是按顺序搭建。环境准备JMeter、InfluxDB、Grafana 的安装与版本选择先说版本这部分最容易出坑。InfluxDB 1.x 和 2.x 的存储模型完全不一样Grafana 8 和 Grafana 10 的配置界面也不同。为了保证后续操作能对上我直接说我在用的组合JMeter 5.6.3 InfluxDB 1.8.10 Grafana 10.1.2。这套组合经过了大量压测验证兼容性好社区资料也最全。有人会问都 2025 年了怎么还用 InfluxDB 1.x原因很简单1.x 支持 SQL 类查询学习成本低资源占用小一个压测输出场景完全够用。2.x 的 Flux 查询语言虽然更强大但上手门槛高而且 1.8 版本已经稳定运行了很久没必要追新。1.1 JMeter 安装JMeter 是个纯 Java 应用装它之前先确保机器上有 JDK。我用的是 JDK 11JMeter 5.x 要求 JDK 8这个组合没问题。到 Apache JMeter 官网下载apache-jmeter-5.6.3.tgz解压到任意目录比如/opt/jmeter。解压完成后验证一下环境/opt/jmeter/bin/jmeter -v如果能看到版本号输出说明安装成功。JMeter 不需要安装解压即用这个特性很方便你可以在压测机器上直接用它也可以在本地电脑装一个当控制器。1.2 InfluxDB 安装InfluxDB 1.8 的安装官方支持通过 apt 仓库也可以下载二进制包。我习惯直接用官方仓库以 Ubuntu 20.04 为例wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add - source /etc/lsb-release echo deb https://repos.influxdata.com/ubuntu ${DISTRIB_CODENAME} stable | sudo tee /etc/apt/sources.list.d/influxdb.list sudo apt-get update sudo apt-get install influxdb sudo systemctl enable influxdb sudo systemctl start influxdb启动后查看状态确认它跑起来了。InfluxDB 默认监听 8086 端口这个端口就是 JMeter 写入数据的入口。如果你是远程连接记得在防火墙上放行 8086。修改 InfluxDB 配置可选但建议至少把数据目录和日志目录确认一下。默认数据目录在/var/lib/influxdb如果压测数据量很大要确保磁盘空间足够。1.3 Grafana 安装Grafana 同样有官方 apt 仓库安装方式很标准sudo apt-get install -y software-properties-common sudo add-apt-repository deb https://packages.grafana.com/oss/deb stable main wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - sudo apt-get update sudo apt-get install grafana sudo systemctl enable grafana-server sudo systemctl start grafana-server启动后默认监听 3000 端口初始登录账号密码都是admin首次登录会提示修改密码。修改密码后进入主界面就可以开始配置了。以上三件套是基础环境。下面进入真正核心的部分打通数据链路。打通数据链路让 JMeter 把压测数据实时写进 InfluxDB这一步是整个体系的关键。很多教程直接把 JMeter 的 Backend Listener 配置截图一贴照抄就完事但实际配起来有几个细节容易出问题。2.1 在 InfluxDB 里创建 JMeter 专用数据库JMeter 的 InfluxDB 后端监听器默认会往一个名为jmeter的数据库里写数据所以我们先在 InfluxDB 里把这个库建好。用 InfluxDB 自带的命令行工具操作influx CREATE DATABASE jmeter CREATE USER jmeter WITH PASSWORD jmeter123 GRANT ALL ON jmeter TO jmeter SHOW DATABASES看到jmeter出现在列表里就说明创建成功。这里我给jmeter数据库单独建了一个用户并授权主要是为了避免所有服务共用admin账号权限更清晰。2.2 配置 JMeter 的 Backend Listener打开 JMeter在测试计划里添加一个线程组然后在线程组上右键选择添加 - 监听器 - 后端监听器。后端监听器界面里有两项配置需要特别注意backend_listener_class选择org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClientbackend_listener_parameters这是一串参数需要填 InfluxDB 的地址、数据库名、存储策略等最关键的参数配置如下influxdbMetricsSenderorg.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender influxdbUrlhttp://localhost:8086/write?dbjmeter applicationmy_perf_test measurementjmeter summaryOnlyfalse samplersRegex.* percentiles99;95;90 useRegexForSamplersListtrue逐项解释一下influxdbUrl写入数据的 HTTP 接口地址注意格式是/write?dbjmeterdb参数指向前一步创建的数据库application一个标签用来区分不同应用或不同测试场景的数据在 Grafana 面板上会按这个字段分组展示measurementInfluxDB 中的测量名可以理解为一张表名默认就是jmetersummaryOnly设为false时JMeter 会把每个 sampler 的结果都写入方便在 Grafana 上查每个接口的单独指标设为true时只写汇总数据。建议设falsesamplersRegex匹配 sampler 名称的正则表达式.*表示匹配所有 samplerpercentiles要统计的百分位响应时间我一般统计 90、95、99 三个档位填完后保存测试计划加一个简单的 HTTP 请求和一个循环控制器先跑一个 1 分钟的小测试验证数据链路是否通。2.3 验证数据是否写入了 InfluxDB跑测试的过程中回到 InfluxDB 命令行查询刚才建的jmeter数据库influx USE jmeter SHOW MEASUREMENTS SELECT * FROM jmeter WHERE applicationmy_perf_test ORDER BY time DESC LIMIT 10如果刚才的测试成功你会看到有记录返回字段包括time、application、sampler、elapsed、count、error等。只要看到数据链路就通了。这个验证步骤千万别省。我曾经看到过有人配置完后端监听器压测跑了一晚上结果 InfluxDB 里一条数据都没有——因为 influxdbUrl 里少写了数据库名写入请求一直 404 但 JMeter 不报错。所以压测开始后第一件事就是去 InfluxDB 里查一下有没有新数据进来。2.4 如果是 InfluxDB 2.x 该怎么配如果你的环境是 InfluxDB 2.xJMeter 后端监听器的配置略有不同。首先需要在 InfluxDB 2.x 里创建一个bucket类似 1.x 的数据库和一对token带写入权限。然后选择InfluxdbBackendListenerClient2作为实现类参数类似这样influxdbUrlhttp://localhost:8086/api/v2/write?bucketjmeterorgmyorgprecisionms tokenyour_written_token applicationmy_perf_test measurementjmeter注意 2.x 的写入 URL 是/api/v2/write格式和 1.x 完全不同。这个细节处最容易踩坑。Grafana 配置数据源连接和 Dashboard 导入数据链路通了接下来就是把数据可视化。Grafana 里需要做两件事配置 InfluxDB 数据源、导入现成的 Dashboard。3.1 配置 InfluxDB 数据源浏览器打开 Grafana登录后进左侧菜单的Configuration - Data Sources点击Add data source选择 InfluxDB。这里有几个关键字段URL填http://localhost:8086如果是远程 InfluxDB填对应 IPDatabase填jmeterUser填jmeterPassword填之前 InfluxDB 里创建的用户密码HTTP Method保持默认GET或POST都可以Version选择InfluxQL1.x 的查询语言填完点 Save Test如果显示绿色提示 Successfully queried the InfluxDB API说明数据源配置正确。这一步经常出问题的是 Database 没填或填错导致保存后测试失败。3.2 导入官方 Dashboard 模板Grafana 官网有个 Dashboard 市场搜索 JMeter会有很多现成面板。最成熟、使用最广的是由 InfluxData 官方维护的JMeter Dashboard模板 ID 是5496用 InfluxQL 版本。导入步骤左侧菜单Dashboards - Import输入模板 ID5496点击 Load然后选择刚才配置的 InfluxDB 数据源点击 Import。导入完成后面板上应该会显示各类图表包括Active Threads并发线程数趋势Response Times各采样点的平均响应时间和百分位响应时间Hits每秒请求数QPS 趋势Error Percentage错误率趋势Network Traffic网络吞吐量这些图表默认是按application字段过滤的面板顶部有一个下拉框叫 application你可以选择之前配置的application名称比如my_perf_test图表就会自动切到对应测试的数据。3.3 从零定制一个简单面板官方模板虽然好用但有时候默认图表不满足特定需求。比如我想监控某个特定接口的响应时间变化不想被其他接口干扰那就需要自己写 InfluxQL 查询。在 Grafana 里新建一个面板查询语句类似这样SELECT mean(value) FROM jmeter WHERE (application my_perf_test AND metric elapsed) AND $timeFilter GROUP BY time($__interval) fill(null)这里metric字段是 InfluxDB 里指标的类型标签JMeter 写入的数据中elapsed表示响应时间success表示成功次数failure表示失败次数。了解这些字段含义后你可以组合出无数种图表。压测过程中常见问题数据不写入、时间线错位、面板空白配置看起来不复杂但实际跑起来总会遇到各种莫名其妙的问题。我把自己踩过的坑整理一下按出现频率排序。4.1 JMeter 跑完了但 InfluxDB 里没数据这个坑出现的频率极高原因集中在三个地方influxdbUrl 拼错最常见的错误是漏掉?dbjmeter参数导致 HTTP 请求被 InfluxDB 拒绝。注意http://localhost:8086/write?dbjmeter这个完整格式。数据库没建Backend Listener 写入时如果数据库不存在InfluxDB 会返回 404 错误。虽然 JMeter 不报错但数据写不进去。先检查SHOW DATABASES。网络不通JMeter 和 InfluxDB 安装在不同机器时跨网络访问需要确认 8086 端口可达。可以先用 curl 直接在 JMeter 机器上测试curl -XPOST http://influxdb_ip:8086/write?dbjmeter --data-binary test metric1如果能写入成功说明网络没问题。4.2 Grafana 面板有图表但没有数据或者数据不更新这个问题通常和数据时间范围有关。Grafana 默认查询最近 5 分钟的数据如果你从面板右上角选择了错误的时间范围比如选了一个压测时间段之前的时间面板自然空白。把时间范围选为Last 30 minutes或Last hour就能看到数据。另一个原因是时区问题。InfluxDB 存储的时间戳默认是 UTC 时间如果系统时区是 UTC8面板上显示的曲线可能会比实际压测时间晚 8 个小时。解决办法是在 Grafana 面板的Settings里把时区改为Local time或者在 InfluxDB 配置里开启本地时间戳但一般改 Grafana 就足够了。4.3 数据写入太频繁导致 InfluxDB 压力过大Backend Listener 默认是每个采样点都写入如果并发数高、sampler 多写入量会非常大。实际压测 1000 并发时每秒可能产生上千条数据InfluxDB 在低配机器上可能扛不住。解决办法有两个方向一是调低写入频率。Backend Listener 参数中有个summaryOnly设为true时只写汇总数据大幅减少写入量。但这样会丢掉每个接口的独立指标需要具体场景权衡。二是在 InfluxDB 侧做采样降频。InfluxDB 1.x 支持 Continuous Query连续查询可以按一定时间窗口聚合数据并写入新 measurement。比如每 30 秒聚合一次把精度降低长期趋势查询就不必扫描全量数据。4.4 面板上出现大量空值和毛刺这是时序数据存储的常见现象。JMeter 写入频率是随请求频率变化的压测一开始没有请求时不会写入数据Grafana 查询时自动填充null趋势图上就会出现断档。可以用fill(null)或fill(0)来调整空值的填充方式。在 InfluxQL 查询语句末尾加上fill(number)比如fill(0)曲线就不会断裂显示为一条连续的零线看起来更舒服。毛刺问题主要是网络抖动或 JMeter 采样本身存在瞬时波动。如果目标是看整体趋势而不是每个采样点的精确值可以在 Grafana 图表面板里调整 Interval 或者用 InfluxDB 的聚合函数mean()配time($__interval)把每个时间槽内的数据求平均曲线会平滑很多。从能看到有用面板调优和指标解读实战导入面板只是第一步真正有价值的是会看图表、会调查询。我举个实际例子压测一个登录接口100 并发跑 10 分钟怎么从面板判断系统瓶颈面试压测时我通常盯四个图TPS 趋势、响应时间趋势、错误率、并发数。这几个指标不是孤立的要交叉着看。当并发数持续上升TPS 开始停滞甚至下降响应时间同步拉长——这是系统进入瓶颈期的信号。可能是数据库连接池打满了也可能是应用线程池耗尽。这种时候Grafana 面板已经给你指出了方向下一步就该去查应用日志和数据库慢查询。如果错误率突然抬头同时响应时间瞬间暴涨——大概率是触发了某个保护机制比如限流或熔断。这时候曲线图能帮我们精确定位到分钟级甚至秒级的时间点再针对那个时间段的日志做根因分析。如果把后端监听器的samplersRegex配置成只匹配某个接口的正则比如/login面板上就能看到单一接口的 TPS 和响应时间——这比看总体数据有用得多能精确评估一个核心链路的承载能力。面板调优方面我每次用这套组合都会做两件事。第一把percentiles参数加上默认只有平均值太容易被高延迟掩盖加上 95 和 99 百分位才能看到真实的长尾影响第二调整 Grafana 的Min time interval为 1s确保在高并发压测时能看清细粒度的波动不至于图表变糊。一点个人经验和最后的提醒这套组合我已经用了一年多从接口级小压测到几千并发的全链路压测都用它支撑。给我最大的感受是监控面板的意义不在于好看而在于让你在压测过程中始终知道系统正在发生什么。JMeter 的聚合报告是事后视角Grafana 是实时视角两者互补但实时视角对压测现场决策的帮助要大得多。如果你配置好了但第一次跑还是没有数据别急着怀疑工具不兼容。按顺序检查InfluxDB 数据库是否存在、JMeter 后端监听器的 URL 是否有错、Grafana 数据源的 database 字段是否填对、面板时间范围是否覆盖了压测时间。绝大多数问题都出在这四个环节。最后一个小技巧如果你有多个测试环境test env 和 staging可以在 JMeter 后端的application参数里填不同名字然后 Grafana 面板顶部下拉框切换一套压测数据源就变成了多个环境共用的监控中心。记得定期备份 Grafana 的 Dashboard JSON 文件免得环境重建时还得一个个图重新画。
返回列表