JMeter+InfluxDB+Grafana搭建实时性能监控平台实战指南
2026/7/4 12:06:25 网站建设 项目流程

1. 项目概述与核心价值

最近在做一个内部系统的性能压测,用JMeter跑脚本看报告是常规操作,但每次盯着那个黑乎乎的聚合报告,或者导出一堆CSV文件再拉进Excel里做图表,总觉得效率太低,反馈也不够直观。尤其是在做长时间稳定性测试或者需要实时观察系统表现的时候,这种滞后性就更让人头疼。后来研究了一下,发现把JMeter的测试数据实时推送到InfluxDB时序数据库,再用Grafana这个强大的可视化工具做图表展示,能完美解决这个问题。整个方案在Windows上跑起来也相当顺畅,今天就详细拆解一下这个“JMeter + InfluxDB + Grafana”可视化监控平台的搭建全过程。

这个平台的核心价值在于,它能将性能测试从“事后分析”转变为“实时监控”。你不再需要等测试跑完才能看结果,而是在压测进行的同时,就能在一个酷炫的仪表盘上看到实时的TPS(每秒事务数)、响应时间、错误率等关键指标的变化曲线。这对于定位性能瓶颈、观察系统在压力下的稳态表现、以及及时终止异常测试场景,都有巨大的帮助。无论是开发自测、测试人员做性能验证,还是给领导做演示,一个实时更新的可视化大屏,其说服力和效率都远超静态报告。

2. 环境准备与组件选型解析

2.1 组件角色与协作关系

在动手之前,我们先理清这三个核心组件各自扮演什么角色,以及它们是如何协同工作的。

  1. JMeter:压力发起端与数据生产者。它通过运行测试计划,模拟用户请求对目标系统施加压力。同时,我们需要配置一个叫Backend Listener的监听器,它的作用就是将测试过程中实时产生的性能数据(如响应时间、吞吐量)发送出去。
  2. InfluxDB:高性能时序数据库,充当数据仓库。它专门为处理带时间戳的数据而优化,非常适合存储性能监控指标。JMeter的Backend Listener会将数据以HTTP协议写入InfluxDB中指定的数据库(Database)和测量(Measurement,类似于SQL中的表)。
  3. 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是绿色软件,无需安装。

  1. 启动InfluxDB: 进入解压后的目录,你会看到influxd.exe(服务端守护进程)和influx.exe(命令行客户端)。要启动数据库服务,最简单的方法是打开命令提示符(CMD)或PowerShell,导航到该目录,然后运行:

    .\influxd.exe

    首次运行会在当前目录下生成一个data文件夹和一个meta文件夹,用于存储数据和元数据。保持这个命令行窗口打开,服务就在运行了。你会看到日志输出,显示服务已启动在8086端口。

  2. 验证安装: 另开一个命令行窗口,同样导航到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的关键一步。

  1. 在Grafana左侧导航栏,点击齿轮图标进入Configuration->Data Sources
  2. 点击Add data source按钮。
  3. 在列表中选择InfluxDB
  4. 进入配置页面,填写以下关键信息:
    • 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是标准方法)。
  5. 最关键的一步:点击页面底部的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

  1. 打开你的JMeter测试计划(.jmx文件)。
  2. 在你想监听的线程组上(或者直接在测试计划下添加,以监控所有线程组),右键Add->Listener->Backend Listener
  3. 在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。它也会作为标签,方便区分多次测试。

其他参数如usernamepassword,如果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仪表盘模板,它已经设计好了所有关键图表和查询。

  1. 在Grafana左侧导航栏,点击Dashboards->New->Import
  2. Import via grafana.com输入框中,输入模板ID5496,然后点击Load
  3. 在下一步中,选择我们之前创建的数据源JMeter_InfluxDB
  4. 点击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 time
  • SELECT 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 启动服务与准备测试

  1. 启动InfluxDB: 在它的目录下,运行.\influxd.exe,确保服务在8086端口运行。
  2. 启动Grafana: 如果已安装为服务,它应该已在运行。访问http://localhost:3000确保能登录。
  3. 配置JMeter: 打开你的测试脚本,确保已正确添加并配置了Backend Listener(指向http://localhost:8086/write?db=jmeter)。
  4. 打开Grafana仪表盘: 进入你导入的JMeter仪表盘(ID: 5496)。将仪表盘右上角的时间范围选择器设置为“Last 5 minutes”“Last 1 hour”,并点击刷新图标设置为自动刷新,例如每5秒或10秒。这样图表就会自动更新。

7.2 执行压测并观察仪表盘

  1. 在JMeter中,点击运行按钮(绿色三角形)开始你的性能测试。
  2. 立即切换到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图表没有数据或数据更新严重延迟。
  • 排查步骤
    1. 检查InfluxDB写入: 在JMeter运行期间,用InfluxDB客户端连接,执行USE jmeter然后SHOW SERIESSELECT * FROM jmeter LIMIT 10。如果能看到数据,说明JMeter写入成功。
    2. 检查Backend Listener间隔: JMeter的Backend Listener默认每30秒发送一次数据。对于需要秒级监控的场景,这个间隔可能太长。你可以在JMeter的jmeter.properties文件中修改backend_influxdb.send_interval属性(单位为秒),例如改为5。注意:设置过短会增加JMeter和InfluxDB的负担。
    3. 检查Grafana查询和时间范围: 确认Grafana仪表盘选择的时间范围覆盖了压测时间段,并且自动刷新已开启。
    4. 检查防火墙: 确保Windows防火墙没有阻止JMeter(发送端)对localhost:8086的访问,或者InfluxDB对8086端口的监听。

8.2 InfluxDB 磁盘空间增长过快

性能测试,尤其是长时间高并发的测试,会产生海量数据点。InfluxDB数据文件可能会迅速膨胀。

  • 解决方案:设置数据保留策略(Retention Policy)。 InfluxDB的数据保留策略决定了数据保存多久。默认是永久保存。我们可以为jmeter数据库创建一个保留7天的策略。 在InfluxDB客户端中执行:
    USE jmeter CREATE RETENTION POLICY "one_week" ON "jmeter" DURATION 7d REPLICATION 1 DEFAULT
    这条命令创建了一个名为one_week的策略,数据保留7天,副本数为1(单机),并设置为默认策略。之后新写入的数据7天后会自动删除。对于历史数据,可以使用ALTER RETENTION POLICY ...来修改。

8.3 JMeter 自身资源消耗过高

当并发数很大时,Backend Listener频繁计算和发送数据可能会消耗不少CPU和内存,从而影响压测机本身的性能,导致测试结果失真。

  • 优化建议
    1. 调整发送间隔: 如上所述,适当增大backend_influxdb.send_interval,减少发送频率。
    2. 使用异步队列: Backend Listener默认使用异步队列来缓冲和发送数据,确保它不会阻塞测试线程。通常不需要改动。
    3. 分离监控与压测机: 在生产级压测中,最佳实践是使用独立的机器(或容器)运行InfluxDB和Grafana,甚至使用独立的“从属JMeter服务器”来发送监控数据,避免与主压测机资源竞争。
    4. 精简发送的数据: 在Backend Listener中,通过samplersRegex只监控关键的业务采样器,而不是所有.*

8.4 Grafana 图表查询慢或卡顿

当时间范围拉得很长(比如看过去一周的数据),而数据量又极大时,图表加载可能会变慢。

  • 优化建议
    1. 利用InfluxDB的连续查询(Continuous Query)降采样: 可以创建一个CQ,将高频的原始数据(比如每秒一个点)聚合成低频的汇总数据(比如每分钟一个平均值),并存入一个新的measurement。在Grafana中,查看长时间趋势时,就查询这个降采样后的低精度数据;查看近期细节时,再查询原始数据。这能极大提升查询性能。
    2. 优化Grafana查询: 避免在查询中使用GROUP BY过于细粒度的标签,或者返回过多的时间序列。确保查询的WHERE条件能有效利用索引(在InfluxDB中,tag是索引的)。
    3. 调整时间间隔: 在Grafana面板的查询设置中,可以使用$__interval宏,它会根据当前选中的时间范围自动调整查询分组的时间间隔,避免在查看长时间范围时查询过于密集的数据点。

搭建这个可视化监控平台,最深的体会是它彻底改变了性能测试的工作流。从“跑完再看”到“边跑边看”,这种实时性带来的掌控感是质的飞跃。初期可能会在版本兼容性(特别是InfluxDB 1.x vs 2.x)和网络配置上踩点小坑,但一旦打通,后续就是纯收益。对于复杂的测试场景,我强烈建议将这套环境容器化(Docker Compose),一键启动所有服务,环境隔离和部署会变得极其简单。另外,花点时间研究一下Grafana的告警功能,设置几个关键阈值(比如错误率>1%或P99响应时间>2秒),能让这个平台从“监控仪表盘”升级为“智能预警系统”,在测试出现异常时第一时间通知你,进一步提升效率。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询