k6 性能测试可视化完整指南:让压测数字回答"能不能上线"
【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6
压测跑了两个小时,屏幕上一堆数字,第二天发布评审问"能不能上线",你只能回答"感觉还行"。k6 性能测试可视化要解决的就是这件事——把每次请求产生的指标变成能支撑决策的图表,让你下次用数据回答。
一条数据流的四个出口
k6 是一个用 Go 写的负载测试工具,压测脚本则是普通的 JavaScript 文件,会基本 JS 就能写脚本。测试启动后,每个虚拟用户(VU)执行脚本、发起请求并产生指标,引擎同时把这些指标分发到四个出口 📊:
- 终端实时输出:终端里实时刷新的统计,跑的时候肉眼看;
- 本地 k6 dashboard:内置的 Web 仪表板,不依赖任何外部服务;
- JSON / CSV 落盘:每个采样点逐条写入文件,便于离线回放或表格分析;
- InfluxDB + Grafana:实时写入 InfluxDB,在 Grafana 里拼成可长期保留的 k6 可视化面板。
单机扛不住负载时,k6 会拆成一个协调器和多个代理:协调器负责调度,代理负责产生流量、收集数据,指标最终汇总回协调器。
k6 到底在采集什么指标
内置指标:最常用的四组
k6 的指标采集默认全开,什么都不用配。最常看的四组:
http_req_duration响应时间:自动算 avg、p(95)、p(99) 等百分位;http_req_failed失败率:非 2xx/3xx 请求占比;http_reqs请求总数:就是吞吐量,可折算 rps;vus/vus_maxVU 状态:虚拟用户数量随时间的曲线。
另有checks通过率和data_sent/data_received流量,基本覆盖常见压测场景。
自定义指标:内置没覆盖的自己采
k6/metrics提供四种:Counter 累计、Gauge 瞬时值、Rate 成功率、Trend 时序。举个例子:
import http from "k6/http"; import { Trend, Rate } from "k6/metrics"; const loginDuration = new Trend("login_duration"); const loginFailed = new Rate("login_failed"); export default function () { const res = http.post("/login", { user: "u", pass: "p" }); loginDuration.add(res.timings.duration); loginFailed.add(res.status !== 200); }更多写法见 examples/custom_metrics.js。
30秒跑通:你的第一条可视化链路
⚡ 四步,每步只给最短必要内容。
第一步:安装
下载对应系统的二进制包放进 PATH,k6 version能出版本号即可。
第二步:写脚本
import http from "k6/http"; import { check } from "k6"; export const options = { vus: 10, duration: "30s" }; export default function () { const res = http.get("https://test-api.k6.io/"); check(res, { "status 200": (r) => r.status === 200 }); }第三步:选出口
k6 run --out json=results.json script.js换--out参数就切换出口:csv=results.csv落盘表格,influxdb=http://localhost:8086/k6实时写库,加--web-dashboard开本地仪表板。
第四步:看图表
本地仪表板随测试启动,直接呈现 p95、rps、VU 数与失败率的实时曲线。要建长期看板,把仓库里的 Grafana 默认仪表板模板 导入 Grafana,用 InfluxDB docker-compose 示例 把数据库拉起来。只落了 JSON 也不用白跑:k6 dashboard replay能把录制文件回放成仪表板,事后复盘。
别只看图:从数据到决策的三条军规 🎯
军规一:先立基线,再谈优化。"变快了"没有参照数字就是空话。把性能目标写成 k6 阈值放进脚本,越过阈值测试直接判失败、退出码非零:
export const options = { thresholds: { http_req_duration: ["p(95)<500"], checks: ["rate>0.99"], }, };这样 CI 不需要人盯图,阈值就是自动裁决。按标签细分指标的完整写法见 examples/thresholds.js。
军规二:按业务流程设计负载,而不是孤立接口。单个接口打满 1000 rps 只是实验室数字。真实用户的路径是"登录 → 列表 → 搜索 → 下单",压力要压在这条链路上,否则你会优化没人用的接口,漏掉真正的瓶颈。
军规三:图表要配得上问题。趋势图看 p(95) 随版本和负载怎么漂移;分布找"少数但致命"的长尾——avg 正常而 p(99) 突起,说明存在离群场景;对比图叠两个版本,直接定位回归。回答不了问题的图,就删掉它。
别把数字带到评审,把图和阈值带到评审。今天就把基线写出来,跑通第一条本地 dashboard 链路,下次发布会上的"能不能上线",就是一道有标准答案的题。
【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考