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下需要注意几点路径与权限Windows的路径使用反斜杠\且对空格和特殊字符更敏感。在配置文件和命令行中要特别注意。安装时尽量选择无空格、较短的路径如D:\Apps\。服务管理InfluxDB和Grafana在Windows下通常以控制台应用或Windows服务方式运行。我们需要学会如何通过命令行启动、停止它们并配置开机自启。端口占用这三个工具都会占用端口。JMeter的GUI本身不占固定端口但后端监听器会向InfluxDB的端口发送数据。InfluxDB默认使用8086HTTP API和8088管理端口。Grafana默认使用3000。确保这些端口没有被其他程序如Skype、某些虚拟机软件占用。防火墙如果需要在局域网内其他机器访问Grafana看板需要在Windows防火墙中放行对应端口如3000。3. 分步搭建从零开始构建监控平台3.1 第一步基础环境准备与组件下载工欲善其事必先利其器。我们先确保基础环境并下载好所有需要的软件。Java环境JMeter依赖 JMeter是基于Java开发的所以必须先安装JDK。推荐使用JDK 8或JDK 11LTS长期支持版本这两个版本与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启动或插件兼容性问题。如果公司有统一要求请以公司要求为准。下载三大组件Apache JMeter去官网 https://jmeter.apache.org/ 下载最新的Binaries压缩包如apache-jmeter-5.6.3.zip。解压到任意目录例如D:\Tools\apache-jmeter-5.6.3。这就是JMeter的家了里面bin目录下的jmeter.bat就是启动脚本。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命令行客户端。Grafana前往Grafana官网下载Windows版本。选择“Windows”标签页下载.zip压缩包如grafana-10.2.3.windows-amd64.zip。解压到目录如D:\Apps\grafana-10.2.3。主要可执行文件在bin目录下。3.2 第二步配置与启动InfluxDBInfluxDB是我们的数据仓库需要先把它跑起来并做好初始化。1. 修改配置文件可选但推荐 进入InfluxDB解压目录你会看到一个默认的配置文件influxdb.conf。对于初次使用大部分默认设置即可。但我们可以修改两个关键点以便管理用记事本或VS Code打开influxdb.conf。找到[http]部分确认enabled truebind-address :8086。这个端口就是JMeter和Grafana要连接的端口。找到[meta]、[data]和[wal]部分下的dir配置项。它们默认指向解压目录内的meta、data、wal文件夹。如果你想将数据存放到其他磁盘如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服务开机自启。可以使用NSSMNon-Sucking Service Manager这个工具来将influxd.exe安装为服务网上教程很多这里不展开。3. 创建数据库 保持上一步的CMD窗口运行新开一个CMD窗口切换到InfluxDB目录。连接本地InfluxDBinflux.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?dbjmeter。务必确认数据库名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?dbjmeter核心配置确保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查看有哪些MeasurementSHOW MEASUREMENTS。你应该能看到jmeter。查询最近几条数据看看SELECT * FROM jmeter WHERE applicationMyWebApp ORDER BY time DESC LIMIT 5。 如果能看到返回了带有时间戳、responseTime、errorCount、hits等字段的数据行恭喜你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?dbxxx。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通常已经配置好了变量比如application、transaction。在仪表盘左上角你可以通过下拉框选择不同的应用对应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?dbjmeter。在Master机的JMeter中修改测试计划确保其后端监听器的influxdbUrl也指向本机的InfluxDB。运行测试时在Master的GUI中通过运行-远程启动来指定Slave机。这样所有Slave产生的数据都会统一写入到Master机的InfluxDB中在Grafana上看到的就是聚合了所有压力机的全局视图。5. 常见问题排查与实战心得搭建和使用过程中你肯定会遇到各种问题。这里把我踩过的坑和解决方法总结一下。5.1 数据写入失败JMeter到InfluxDB现象JMeter日志中大量报错如Failed to send metrics to influxDB或者InfluxDB中查询不到数据。排查步骤检查网络连通性在运行JMeter的机器上用浏览器或curl命令访问http://influxdb_ip:8086/ping。InfluxDB如果正常运行会返回204 No Content。如果连不上检查InfluxDB是否启动、防火墙是否放行8086端口。检查URL和数据库反复核对JMeter后端监听器中的influxdbUrl。确保IP、端口、数据库名dbjmeter完全正确。特别注意URL中不能有空格数据库名要和你用CREATE DATABASE创建的名称严格一致大小写敏感。检查InfluxDB日志查看InfluxDB启动的控制台窗口或日志文件默认在解压目录看是否有关于写入错误的报错信息。常见错误是“database not found”。降低JMeter发送频率临时将batchSize设为100queueSize设为1000减少单次发送压力看是否缓解。5.2 Grafana图表无数据或显示“No data”现象Grafana面板显示“No data to show”。排查步骤检查数据源连接在Grafana的Data Sources设置里对JMeter_InfluxDB再次点击Save test确认连接成功。检查查询语句和时间范围确认面板的查询语句中FROM选择了正确的measurementjmeter。确认WHERE条件中的application标签值是否和JMeter发送的数据一致。大小写必须完全匹配。检查Grafana右上角的时间范围选择器。是不是选到了未来时间或者很久以前选择Last 1 hour或Last 5 minutes试试。在InfluxDB中直接查询用InfluxDB CLI执行Grafana面板上显示的查询语句可以在面板编辑状态点击Query inspector看到原始语句看是否能返回数据。这是最直接的验证方法。5.3 平台资源占用过高现象压测过程中本机卡顿InfluxDB或Grafana响应变慢。优化建议分离部署这是最根本的解决方案。将InfluxDB和Grafana部署到一台独立的、配置较好的Linux服务器上。JMeter Master/Slave也尽量用独立机器。Windows本机只作为控制端和查看端。调整InfluxDB配置在influxdb.conf中可以调整[http]部分的max-concurrent-write-limit和max-enqueued-write-limit限制并发写入队列防止内存爆掉。根据机器内存调整[cache-max-memory-size]。精简Grafana仪表盘一个仪表盘上不要放置过多面板特别是刷新间隔短、查询复杂的面板。非核心监控项可以放到另一个仪表盘或延长刷新间隔。清理旧数据如前所述设置合理的数据保留策略定期自动清理过期数据释放磁盘空间。5.4 关于时间戳同步潜在问题如果JMeter压力机、InfluxDB服务器、Grafana服务器分布在不同的机器上且系统时间不同步会导致Grafana图表上的时间轴错乱。解决方案确保所有机器使用NTP服务进行时间同步。在Windows上可以设置自动与Internet时间服务器同步。在生产环境中务必保证所有服务器时间一致。最后这个平台搭建起来只是第一步真正的价值在于用它去发现性能问题、定位瓶颈。多跑几次测试熟悉每个图表的含义尝试定制自己的监控面板设置关键的告警阈值。当你能够指着实时变化的图表清晰地说出“当前TPS达到1200平均响应时间稳定在200ms但95分位响应时间在500ms以上说明有部分请求较慢需要结合应用日志进一步分析”时这个平台才真正成为了你手中的利器。
返回列表