ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

如何搭建 k6 + Grafana 性能测试实时监控仪表盘:从零到曲线生长只要 3 条命令

如何搭建 k6 + Grafana 性能测试实时监控仪表盘:从零到曲线生长只要 3 条命令

如何搭建 k6 + Grafana 性能测试实时监控仪表盘:从零到曲线生长只要 3 条命令

【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6

刚跑完一轮 k6 压测,终端里滚过的只剩一行行数字,响应时间到底涨没涨、错误是什么时候冒出来的,全靠最后那个汇总回忆。这篇指南用 k6(JavaScript 写用例、Go 写内核的负载测试工具)搭配 InfluxDB 和 Grafana 这套开源组合,3 条命令搭起实时性能测试仪表盘——压测跑到一半,浏览器里的曲线就在同步生长,哪一秒变慢、哪一批请求挂了,一眼就能指出来。

场景:盯着终端数字,还是不知道卡在哪一步

压测最难受的时刻,是问题正在发生你却看不见。终端告诉你"有 5 个 VU 在干活",但回答不了:响应耗时是稳定在 200ms 附近,还是从第 30 秒开始一级一级往上爬?checks 通过率是全程 100%,还是某 10 秒间突然塌了下去?这些答案都藏在"指标 × 时间"里,而纯终端输出只给你瞬时快照。把指标实时画成曲线之后,"卡在哪一步"才变成一个可以指着图讨论的问题。

一句话看全貌:三个角色,一条数据流

整条链路只有三个角色,各司其职:

  • k6:发压并产生指标。响应时间、虚拟用户数、检查通过率这些内置指标定义在 metrics/builtin.go;
  • InfluxDB:负责存。它是时序数据库——专门存"随时间变化的数字"的数据库,天然适合压测指标这种高频打点数据;
  • Grafana:负责画。它定时查询 InfluxDB 里的同一份数据,把数字变成实时曲线。

k6 通过一个命令行参数把指标直接写进 InfluxDB,Grafana 再从同一个库里读,于是发压和看盘是同步的。数据导出由 k6 自带的输出模块实现,仓库里还附带拼好的容器化示例,不用自己写配置。

实操:3 条命令拉起环境并点亮仪表盘

前提是本机已装好 Docker、Docker Compose 和 k6 命令行。

第 1 步:克隆仓库,拿到现成的可视化示例

git clone https://gitcode.com/GitHub_Trending/k6/k6

做完这步你会得到 examples/docker-compose/influxdb-v1/ 目录,里面有拼好的docker-compose.yml、预配置的 Grafana 数据源和性能测试仪表盘,以及一个开箱即用的script.js。

第 2 步:一条命令拉起 InfluxDB 和 Grafana

cd k6/examples/docker-compose/influxdb-v1 && docker-compose up -d

这份编排做了三件事:InfluxDB 监听 8086 端口并自动创建名为k6的数据库;Grafana 开放 3000 端口、开启匿名管理员登录;grafana/目录下的配置文件把数据源和面板一次性挂好,你不需要手动点任何"添加数据源"。

做完这步你应该看到:docker-compose ps里两个容器都是 Up;浏览器打开http://localhost:3000/d/Le2Ku9NMk/k6-performance-test,能看到一块空的 k6 性能测试仪表盘——它正在等数据。

第 3 步:跑 k6,把指标写进 InfluxDB

k6 -i 20 --vus 5 --out influxdb=http://localhost:8086/k6 run script.js

这条命令让 5 个虚拟用户共发起 20 次请求,对示例站点做 GET,并顺带断言"状态码是 200""协议是 HTTP/2"。整条命令里唯一需要记住的是--out:它告诉 k6 把指标写到http://localhost:8086/k6,也就是 InfluxDB 的k6库。

做完这步你应该看到:终端滚动出实时请求流;此时刷新 Grafana 页面,空面板上开始出现vus和http-req duration两条曲线,并且随测试进行持续生长。

面板怎么读:判断系统正不正常的 3 个信号 📈

k6 导出的指标不少,新手盯住下面三个就够下判断,每个都按"正常形态 vs 异常形态"对照着看:

  • vus(虚拟用户数):正常形态是一条贴合压测设定的平线——本例固定 5,就该是平线;一旦出现剧烈波动或突然归零,说明脚本中途挂了或执行模型变了,先回终端查错误。
  • http_req_duration(响应时间):正常是一段稳定、窄幅的波动带,是判断瓶颈的核心;一旦出现持续抬高的台阶或尖刺,说明目标服务开始变慢,对照你设的阈值(比如 p95 < 500ms)判断是否越线。
  • checks(检查通过率):正常接近 100%;出现下凹意味着有请求没达标,配合终端里的失败项定位是哪个断言挂了。

还有个容易忽略的读数顺序:先看 vus 确认压力如预期,再看吞吐类指标确认请求真发出去了,最后才看耗时。顺序反了,容易把"根本没发压"误诊成"系统变快了"。

快速排障:屏幕不动的 3 种常见情况 🛠️

面板全程空白→ 原因:漏了--out参数,或写入地址里的库名和 InfluxDB 实际库名对不上(本例库名是k6)。 → 解法:核对命令含--out influxdb=http://localhost:8086/k6;再用docker-compose logs influxdb确认数据库初始化成功。

k6 一启动就报连不上输出端点→ 原因:docker-compose up -d之后容器还在拉镜像或启动中,8086 端口尚未就绪。 → 解法:跑docker-compose ps,等两个容器都显示 Up 再执行 k6。

曲线太"平滑",只有寥寥几个点→ 原因:示例只发 20 次请求,总时长可能不足几秒,样本太少画不出形态。 → 解法:加大-i,或改用duration 30s之类的时长配置,把观察窗口拉长。

延伸:从"能看到"到"会报警"

两个方向点到为止:

  1. 把阈值变成硬判定。在脚本的options.thresholds里声明http_req_duration: ["p(95)<500"],越线时 k6 以非零退出码结束,天然适合接进 CI,写法可参考 examples/thresholds.js。
  2. 自定义指标 + 自定义面板。用new Trend('my_metric')创建自己的指标(比如"下单接口耗时"),它会和内置指标一样进 InfluxDB,之后只需在 Grafana 新建面板、把查询改成你的指标名。

想要更完整的参数说明和全部内置指标列表,可以查阅 k6 与 Grafana 的官方文档;同一套"压测引擎 + 时序存储 + 可视化"的思路,仓库里还有一份 OpenTelemetry 版示例(examples/docker-compose/opentelemetry/),换个存储照着跑一遍即可。

【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表