三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Windows下搭建JMeter+InfluxDB+Grafana实时性能监控平台

Windows下搭建JMeter+InfluxDB+Grafana实时性能监控平台

1. 项目概述:为什么需要这个监控平台?

做性能测试的朋友应该都深有体会,光跑完脚本、拿到JMeter的聚合报告是远远不够的。那堆数字表格,看着就头大,更别提在压测过程中实时观察TPS、响应时间、错误率的曲线变化了。老板或者项目组问你“现在系统表现怎么样?瓶颈在哪?”,你总不能现场打开一个CSV文件去数吧?这就是为什么我们需要一个像样的性能监控看板。

今天要聊的,就是在Windows环境下,把JMeter、InfluxDB和Grafana这三兄弟攒到一起,搭建一个实时、可视化的性能监控平台。简单来说,JMeter负责“干活”(发请求、产生数据),InfluxDB负责“存数据”(专门为时序数据优化的数据库),Grafana负责“秀出来”(把数据变成酷炫的图表和仪表盘)。这个组合在测试圈里非常经典,因为它开源、免费、功能强大,而且各司其职,配合起来相当丝滑。

无论你是测试工程师、开发人员还是运维,只要涉及到需要评估系统在高负载下的表现,这个平台都能让你从“盲人摸象”变成“全局在握”。接下来,我会手把手带你走通整个搭建和配置流程,并分享一些我踩过的坑和调优技巧。

2. 平台架构与核心组件选型解析

2.1 为什么是JMeter + InfluxDB + Grafana?

在动手之前,我们先搞清楚为什么选它们,而不是其他组合。理解背后的“为什么”,配置时才能更得心应手。

JMeter:这个没得说,Apache旗下的老牌开源性能测试工具,功能全面,社区活跃。它本身可以通过“后端监听器”将测试结果实时发送到数据库,这是整个数据流的起点。虽然JMeter 5.0之后自带了一些简单的图表,但用于生产级监控和汇报还远远不够。

InfluxDB:这是整个架构的数据中枢。性能测试数据天生就是时序数据——每个时间点对应着请求数、响应时间、错误数等指标。InfluxDB是专为处理时序数据而设计的数据库,写入和查询速度极快,特别适合这种高频、带时间戳的数据流。相比传统的关系型数据库(如MySQL),它在存储效率和查询性能上优势明显。我们用它的1.x版本就足够了,稳定且资源占用相对友好。

Grafana:数据可视化领域的“瑞士军刀”。它不生产数据,只是数据的搬运工和美容师。Grafana支持多种数据源,其中就包括InfluxDB。它能把InfluxDB里冷冰冰的数字,通过丰富的图表(折线图、柱状图、仪表盘、热图等)和灵活的仪表盘布局,变成直观、美观的监控大屏。你可以自定义监控项,设置报警阈值,非常适合在压测时投屏到电视上,让整个团队对系统状态一目了然。

这个组合的优势在于解耦专业化。JMeter专注压测生成,InfluxDB专注高效存储,Grafana专注炫酷展示。任何一个组件出问题或需要升级,都不会严重影响其他部分。

2.2 Windows环境下的特殊考量

虽然这个组合在Linux服务器上部署更常见,但在Windows下搭建,对于很多开发测试人员来说,是更贴近实际工作环境的起点。Windows下需要注意几点:

  1. 路径与权限:Windows的路径使用反斜杠\,且对空格和特殊字符更敏感。在配置文件和命令行中要特别注意。安装时尽量选择无空格、较短的路径(如D:\Apps\)。
  2. 服务管理:InfluxDB和Grafana在Windows下通常以控制台应用或Windows服务方式运行。我们需要学会如何通过命令行启动、停止它们,并配置开机自启。
  3. 端口占用:这三个工具都会占用端口。JMeter的GUI本身不占固定端口,但后端监听器会向InfluxDB的端口发送数据。InfluxDB默认使用8086(HTTP API)和8088(管理端口)。Grafana默认使用3000。确保这些端口没有被其他程序(如Skype、某些虚拟机软件)占用。
  4. 防火墙:如果需要在局域网内其他机器访问Grafana看板,需要在Windows防火墙中放行对应端口(如3000)。

3. 分步搭建:从零开始构建监控平台

3.1 第一步:基础环境准备与组件下载

工欲善其事,必先利其器。我们先确保基础环境并下载好所有需要的软件。

Java环境(JMeter依赖): JMeter是基于Java开发的,所以必须先安装JDK。推荐使用JDK 8或JDK 11(LTS长期支持版本),这两个版本与JMeter的兼容性最广。

  • 前往Oracle官网或Adoptium等开源站点下载Windows x64 Installer。
  • 安装后,需要配置系统环境变量JAVA_HOME,指向你的JDK安装目录(例如C:\Program Files\Java\jdk-11.0.xx),并将%JAVA_HOME%\bin添加到Path变量中。
  • 验证:打开命令提示符(CMD),输入java -version,能正确显示版本信息即可。

注意:不建议使用过新(如JDK 17+)或过旧的JDK,可能会遇到JMeter启动或插件兼容性问题。如果公司有统一要求,请以公司要求为准。

下载三大组件

  1. Apache JMeter:去官网( https://jmeter.apache.org/ )下载最新的Binaries压缩包(如apache-jmeter-5.6.3.zip)。解压到任意目录,例如D:\Tools\apache-jmeter-5.6.3。这就是JMeter的家了,里面bin目录下的jmeter.bat就是启动脚本。
  2. InfluxDB:前往InfluxData官网下载Windows版本的1.x归档版本。我推荐使用1.8.x,因为它非常稳定。下载influxdb-1.8.10_windows_amd64.zip,解压到一个目录,如D:\Apps\influxdb-1.8.10。里面会有一个influxd.exe(数据库守护进程)和influx.exe(命令行客户端)。
  3. Grafana:前往Grafana官网下载Windows版本。选择“Windows”标签页,下载.zip压缩包(如grafana-10.2.3.windows-amd64.zip)。解压到目录,如D:\Apps\grafana-10.2.3。主要可执行文件在bin目录下。

3.2 第二步:配置与启动InfluxDB

InfluxDB是我们的数据仓库,需要先把它跑起来并做好初始化。

1. 修改配置文件(可选但推荐): 进入InfluxDB解压目录,你会看到一个默认的配置文件influxdb.conf。对于初次使用,大部分默认设置即可。但我们可以修改两个关键点以便管理:

  • 用记事本或VS Code打开influxdb.conf
  • 找到[http]部分,确认enabled = truebind-address = ":8086"。这个端口就是JMeter和Grafana要连接的端口。
  • 找到[meta][data][wal]部分下的dir配置项。它们默认指向解压目录内的metadatawal文件夹。如果你想将数据存放到其他磁盘(如D盘),可以修改这些路径,例如dir = "D:/influxdb/data"注意:InfluxDB配置文件中的路径建议使用正斜杠/,或者将反斜杠\转义为\\

2. 启动InfluxDB服务: 打开命令提示符(CMD),使用管理员身份运行,避免权限问题。切换到InfluxDB的解压目录。

  • 首次初始化并启动:influxd.exe -config influxdb.conf
  • 如果看到类似[httpd] 127.0.0.1:8086 - 127.0.0.1:8086 [httpd] log: listening on [::]:8086的日志,说明启动成功,正在监听8086端口。

实操心得:第一次启动可能会稍慢,因为它要初始化数据库结构。不要关闭这个CMD窗口,关闭就意味着停止了InfluxDB服务。对于长期使用,建议将其配置为Windows服务,开机自启。可以使用NSSM(Non-Sucking Service Manager)这个工具来将influxd.exe安装为服务,网上教程很多,这里不展开。

3. 创建数据库: 保持上一步的CMD窗口运行,新开一个CMD窗口,切换到InfluxDB目录。

  • 连接本地InfluxDB:influx.exe -host 127.0.0.1 -port 8086
  • 成功后会进入InfluxDB的CLI,提示符为>
  • 创建一个专门给JMeter用的数据库,比如叫jmeterCREATE DATABASE jmeter
  • 验证一下:SHOW DATABASES,你应该能看到jmeter在列表中。
  • 输入exit退出CLI。

至此,你的数据仓库InfluxDB已经就绪,正在等待接收JMeter发来的数据。

3.3 第三步:配置JMeter的后端监听器

现在我们来配置JMeter,让它把压测结果“喂”给InfluxDB。

1. 启动JMeter GUI: 进入你的JMeter解压目录,双击bin文件夹下的jmeter.bat启动图形界面。建议先创建一个简单的测试计划来验证配置。

2. 添加后端监听器

  • 在测试计划上右键,添加->监听器->后端监听器
  • 在右侧的“后端监听器实现”下拉框中,选择InfluxDBBackendListenerClient。这是JMeter 3.2版本后内置的监听器,专门用于对接InfluxDB。

3. 配置关键参数: 这是核心步骤,参数配错会导致数据发送失败。

  • influxdbMetricsSender:保持默认的org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender
  • influxdbUrl:填入InfluxDB的HTTP写入地址。格式为:http://你的InfluxDB IP:8086/write?db=数据库名。因为我们都在本机,所以是:http://127.0.0.1:8086/write?db=jmeter务必确认数据库名jmeter和你刚才创建的一致
  • application:自定义应用名称,这个会作为数据的一个标签(tag),方便在Grafana里区分不同项目的测试数据。例如填MyWebApp
  • measurement:保持默认jmeter即可,这是InfluxDB中存储这些数据的表(在InfluxDB里叫Measurement)的名字。
  • summaryOnly:通常设置为false。如果为true,则只发送聚合数据(如整个测试的均值、最大值等),不会发送每个采样器的详细数据。为了实时监控,我们需要看到每个时间点的细节,所以选false
  • samplersRegex.+。这是一个正则表达式,匹配哪些采样器的数据需要发送。.+表示所有采样器。
  • percentiles:可以设置需要发送的百分位数,例如90;95;99,表示发送90%、95%、99%响应时间。用分号分隔。

其他参数可以暂时保持默认。一个配置示例如下图(此处为文字描述,实际界面为表格):

参数名参数值说明
influxdbMetricsSenderorg.apache.jmeter...HttpMetricsSender发送器实现类
influxdbUrlhttp://127.0.0.1:8086/write?db=jmeter核心配置,确保IP、端口、库名正确
applicationMyWebApp应用标签,用于区分
measurementjmeterInfluxDB中的表名
summaryOnlyfalse发送详细数据
samplersRegex.+匹配所有采样器

4. 运行测试验证: 添加一个线程组和一个HTTP请求采样器(随便请求一个如http://httpbin.org/get的公共API),然后运行测试。观察JMeter的日志(查看jmeter.log文件,位于bin目录),如果没有报错,并且看到类似INFO o.a.j.v.b.i.HttpMetricsSender: Metrics sent to influxDB的日志,说明数据发送成功。

5. 在InfluxDB中验证数据: 回到之前连接InfluxDB CLI的CMD窗口。

  • 连接并切换到jmeter数据库:influx.exe -host 127.0.0.1 -port 8086 -database jmeter
  • 查看有哪些Measurement:SHOW MEASUREMENTS。你应该能看到jmeter
  • 查询最近几条数据看看:SELECT * FROM jmeter WHERE application='MyWebApp' ORDER BY time DESC LIMIT 5。 如果能看到返回了带有时间戳、responseTimeerrorCounthits等字段的数据行,恭喜你,JMeter到InfluxDB的通道打通了!

3.4 第四步:安装、配置与启动Grafana

最后一步,我们把数据可视化。

1. 启动Grafana: 进入Grafana的解压目录,找到bin文件夹。双击grafana-server.exe。它会启动一个控制台应用,输出一堆日志。当看到“HTTP Server Listen”http://0.0.0.0:3000时,说明启动成功。

注意:同样,关闭这个窗口就会停止Grafana。长期使用建议也用NSSM配置成Windows服务。

2. 登录并添加数据源

  • 打开浏览器,访问http://localhost:3000
  • 首次登录,默认用户名和密码都是admin。登录后会强制要求修改密码,按提示操作即可。
  • 进入主界面后,点击左侧齿轮图标(Configuration) ->Data sources
  • 点击Add data source,选择InfluxDB
  • 配置数据源:
    • Name:起个名字,如JMeter_InfluxDB
    • HTTP->URL:填入InfluxDB的地址,http://localhost:8086注意,这里不是写入地址,不需要/write?db=xxx
    • InfluxDB Details->Database:填入我们创建的数据库名jmeter
    • HTTP->Access:选择Server (default)。这意味着查询由Grafana服务端发起。
    • 其他保持默认,点击最下方的Save & test。如果看到绿色提示框“Data source is working”,说明Grafana已经成功连上InfluxDB。

3. 导入JMeter仪表盘模板: 从头创建一个完整的监控仪表盘很费时间,好在Grafana社区有现成的、针对JMeter的仪表盘模板。

  • 点击左侧+号 ->Import
  • Import via grafana.com输入框中,输入模板ID5496(这是一个非常流行和全面的JMeter仪表盘模板),然后点击Load
  • 在下一步中,选择我们刚刚创建的数据源JMeter_InfluxDB,然后点击Import

瞬间,一个功能齐全、图表丰富的性能监控仪表盘就出现在你面前了!它通常包括:活跃线程数、响应时间(平均、中位数、百分位数)、吞吐量(TPS/每分钟请求数)、错误率、网络流量等关键指标的实时图表。

4. 平台调优与高级配置技巧

基础平台搭好了,但要让它好用、稳定,还需要一些优化和深入配置。

4.1 InfluxDB性能与数据管理

默认配置下,InfluxDB可能无法应对高并发、长时间的压测数据写入。

1. 调整批处理与队列大小: 回到JMeter的后端监听器配置。

  • queueSize:发送队列大小。默认5000。如果JMeter采样非常快(高并发),可以适当调大,比如10000,防止队列满导致数据丢失。
  • batchSize:批处理大小。默认1000。表示累积多少条数据后一次性发送给InfluxDB。增大此值(如2000)可以减少HTTP请求次数,提升效率,但会增加少量延迟。根据你的网络和压测强度调整。

2. InfluxDB数据保留策略(Retention Policy, RP): 压测数据通常不需要永久保存。InfluxDB默认的RP是autogen,永久保存。我们可以创建一个新的RP,例如只保留7天数据。

  • 在InfluxDB CLI中执行:CREATE RETENTION POLICY "one_week" ON "jmeter" DURATION 7d REPLICATION 1 DEFAULT
  • 这条命令在jmeter数据库创建了一个名为one_week、数据保留7天、副本数为1的RP,并设为默认。之后写入的数据7天后会自动删除。

3. 监控InfluxDB自身状态: InfluxDB自带一个_internal数据库,存储其内部运行指标。你可以在Grafana中再添加一个数据源指向这个库(URL相同,Database填_internal),然后导入相关的监控模板(如ID2125),来监控InfluxDB的CPU、内存、写入性能等,确保它不会成为瓶颈。

4.2 Grafana仪表盘定制与告警

1. 理解模板变量: 导入的模板ID 5496通常已经配置好了变量,比如applicationtransaction。在仪表盘左上角,你可以通过下拉框选择不同的应用(对应JMeter后端监听器里的application参数)和事务(对应JMeter采样器名称),实现动态过滤数据。这是Grafana非常强大的功能。

2. 自定义查询与面板: 如果你想监控某个特定接口的99%响应时间,可以新建一个面板。

  • 点击仪表盘标题 ->Edit-> 点击Add panel(加号图标)。
  • Query选项卡,数据源选择JMeter_InfluxDB,在FROM下拉框中选择jmeter
  • 写查询语句,例如:
    SELECT percentile("responseTime", 99) FROM "jmeter" WHERE ("application" = 'MyWebApp' AND "transaction" = '你的接口名') AND $timeFilter GROUP BY time(10s)
    • percentile("responseTime", 99)计算99%分位响应时间。
    • $timeFilter是Grafana的时间范围变量。
    • GROUP BY time(10s)每10秒聚合一次数据。
  • 在右侧设置面板标题、单位(ms)、图表类型(Graph)等。

3. 设置告警(Alerting): 当错误率飙升或响应时间超阈值时,你需要立即知道。Grafana的告警功能可以帮到你。

  • 编辑任何一个图表面板(如错误率图表)。
  • 切换到Alert选项卡,点击Create alert
  • 定义规则:比如WHEN avg() OF query(A, 1m, now) IS ABOVE 0.05,表示当最近1分钟的平均错误率超过5%时触发。
  • Notifications部分,可以配置告警通道,如邮件、Slack、钉钉、Webhook等。你需要先在Alerting->Notification channels中配置好对应的通道。
  • 这样,一旦系统在压测中出现异常,告警信息就能及时推送到你指定的地方。

4.3 JMeter分布式测试与监控整合

单机JMeter可能无法产生足够大的压力,或者受限于本机网络、端口数。这时需要用到JMeter的分布式测试(Master-Slave模式)。

1. 架构变化

  • Master机:运行JMeter GUI,控制测试,并且运行InfluxDB和Grafana。它负责收集所有Slave的数据并展示。
  • Slave机:只运行JMeter的jmeter-server.bat(无GUI模式),接收Master指令,执行测试脚本,并将结果回传给Master

2. 关键配置

  • 在所有Slave机的jmeter.properties文件中,配置后端监听器,将其influxdbUrl指向Master机的InfluxDB地址(如http://master_ip:8086/write?db=jmeter)。
  • 在Master机的JMeter中,修改测试计划,确保其后端监听器的influxdbUrl也指向本机的InfluxDB。
  • 运行测试时,在Master的GUI中,通过运行->远程启动来指定Slave机。

这样,所有Slave产生的数据都会统一写入到Master机的InfluxDB中,在Grafana上看到的就是聚合了所有压力机的全局视图。

5. 常见问题排查与实战心得

搭建和使用过程中,你肯定会遇到各种问题。这里把我踩过的坑和解决方法总结一下。

5.1 数据写入失败(JMeter到InfluxDB)

现象:JMeter日志中大量报错,如Failed to send metrics to influxDB,或者InfluxDB中查询不到数据。

排查步骤

  1. 检查网络连通性:在运行JMeter的机器上,用浏览器或curl命令访问http://influxdb_ip:8086/ping。InfluxDB如果正常运行,会返回204 No Content。如果连不上,检查InfluxDB是否启动、防火墙是否放行8086端口。
  2. 检查URL和数据库:反复核对JMeter后端监听器中的influxdbUrl。确保IP、端口、数据库名db=jmeter完全正确。特别注意:URL中不能有空格,数据库名要和你用CREATE DATABASE创建的名称严格一致(大小写敏感)
  3. 检查InfluxDB日志:查看InfluxDB启动的控制台窗口或日志文件(默认在解压目录),看是否有关于写入错误的报错信息。常见错误是“database not found”。
  4. 降低JMeter发送频率:临时将batchSize设为100queueSize设为1000,减少单次发送压力,看是否缓解。

5.2 Grafana图表无数据或显示“No data”

现象:Grafana面板显示“No data to show”。

排查步骤

  1. 检查数据源连接:在Grafana的Data Sources设置里,对JMeter_InfluxDB再次点击Save & test,确认连接成功。
  2. 检查查询语句和时间范围
    • 确认面板的查询语句中,FROM选择了正确的measurement(jmeter)。
    • 确认WHERE条件中的application标签值,是否和JMeter发送的数据一致。大小写必须完全匹配
    • 检查Grafana右上角的时间范围选择器。是不是选到了未来时间或者很久以前?选择Last 1 hourLast 5 minutes试试。
  3. 在InfluxDB中直接查询:用InfluxDB CLI执行Grafana面板上显示的查询语句(可以在面板编辑状态点击Query inspector看到原始语句),看是否能返回数据。这是最直接的验证方法。

5.3 平台资源占用过高

现象:压测过程中,本机卡顿,InfluxDB或Grafana响应变慢。

优化建议

  1. 分离部署:这是最根本的解决方案。将InfluxDB和Grafana部署到一台独立的、配置较好的Linux服务器上。JMeter Master/Slave也尽量用独立机器。Windows本机只作为控制端和查看端。
  2. 调整InfluxDB配置:在influxdb.conf中,可以调整[http]部分的max-concurrent-write-limitmax-enqueued-write-limit,限制并发写入队列,防止内存爆掉。根据机器内存调整[cache-max-memory-size]
  3. 精简Grafana仪表盘:一个仪表盘上不要放置过多面板,特别是刷新间隔短、查询复杂的面板。非核心监控项可以放到另一个仪表盘,或延长刷新间隔。
  4. 清理旧数据:如前所述,设置合理的数据保留策略,定期自动清理过期数据,释放磁盘空间。

5.4 关于时间戳同步

潜在问题:如果JMeter压力机、InfluxDB服务器、Grafana服务器分布在不同的机器上,且系统时间不同步,会导致Grafana图表上的时间轴错乱。

解决方案:确保所有机器使用NTP服务进行时间同步。在Windows上,可以设置自动与Internet时间服务器同步。在生产环境中,务必保证所有服务器时间一致。

最后,这个平台搭建起来只是第一步,真正的价值在于用它去发现性能问题、定位瓶颈。多跑几次测试,熟悉每个图表的含义,尝试定制自己的监控面板,设置关键的告警阈值。当你能够指着实时变化的图表,清晰地说出“当前TPS达到1200,平均响应时间稳定在200ms,但95分位响应时间在500ms以上,说明有部分请求较慢,需要结合应用日志进一步分析”时,这个平台才真正成为了你手中的利器。

← 返回列表