k6按URL追踪指标方案失效,求单URL维度指标采集实现方法
k6按URL维度追踪指标失效问题及解决方案
我在跟进Stack Overflow上的相关问题时,发现提供的解决方案无效:按URL拆分的内置指标(如http_req_duration{url:1})全部显示为0。以下是我整合后的脚本及测试结果,需要实现按URL维度追踪响应时间、状态码、成功率等指标,并输出到时序数据库或CSV文件。
我的测试脚本
import http from 'k6/http'; import { Trend, Counter, Rate } from 'k6/metrics'; import { sleep } from 'k6'; // 定义要测试的URL标识 const urls = [ "1", "2", "5", ]; // 初始化每个URL的自定义指标 const urlMetrics = {}; urls.forEach(url => { urlMetrics[url] = { responseTime: new Trend(`response_time_${url}`), }; }); export const options = { thresholds: Object.fromEntries( ['http_req_duration', 'http_reqs', 'http_req_failed', 'data_sent', 'data_received'] .flatMap(metric => urls.map(url => [ `${metric}{url:${url}}`, []]))), }; export default function () { // 发送HTTP请求 urls.forEach(url => { const fullurl = `https://postman-echo.com/delay/${url}`; const resp = http.get(fullurl); // 更新自定义指标 urlMetrics[url].responseTime.add(resp.timings.duration); sleep(0.2); }); sleep(1); }
测试结果(关键部分)
http_req_duration..............: avg=3.26s min=1.3s med=2.2s max=6.28s p(90)=5.47s p(95)=5.87s { expected_response:true }...: avg=3.26s min=1.3s med=2.2s max=6.28s p(90)=5.47s p(95)=5.87s { url:1 }....................: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s { url:2 }....................: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s { url:5 }....................: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s http_reqs......................: 3 0.249713/s { url:1 }....................: 0 0/s { url:2 }....................: 0 0/s { url:5 }....................: 0 0/s response_time_1................: avg=1300.799654 min=1300.799654 med=1300.799654 max=1300.799654 p(90)=1300.799654 p(95)=1300.799654 response_time_2................: avg=2205.401012 min=2205.401012 med=2205.401012 max=2205.401012 p(90)=2205.401012 p(95)=2205.401012 response_time_5................: avg=6287.894391 min=6287.894391 med=6287.894391 max=6287.894391 p(90)=6287.894391 p(95)=6287.894391
问题原因及解决方案
原因
k6内置指标默认不会自动关联你定义的短URL标识(如"1"、"2"),之前的脚本未给请求添加自定义标签,导致{url:1}这类过滤条件匹配不到任何数据,因此显示为0。
修正步骤
- 给请求添加自定义标签:发送HTTP请求时,通过
tags参数指定url标签值,让内置指标关联到对应的短URL标识。 - 完善自定义指标:补充状态码计数器、请求失败率等需要按URL追踪的指标。
- 配置输出方式:使用k6的输出选项将数据导出到CSV或时序数据库。
修正后的完整脚本
import http from 'k6/http'; import { Trend, Counter, Rate } from 'k6/metrics'; import { sleep } from 'k6'; const urls = ["1", "2", "5"]; // 初始化每个URL的自定义指标:响应时间、状态码计数器、失败率 const urlMetrics = {}; urls.forEach(url => { urlMetrics[url] = { responseTime: new Trend(`response_time_${url}`), statusCodes: new Counter(`status_codes_${url}`), failedRate: new Rate(`failed_rate_${url}`) }; }); export const options = { thresholds: Object.fromEntries( ['http_req_duration', 'http_reqs', 'http_req_failed'] .flatMap(metric => urls.map(url => [`${metric}{url:${url}}`, []])) ), }; export default function () { urls.forEach(url => { const fullurl = `https://postman-echo.com/delay/${url}`; // 发送请求时添加自定义url标签 const resp = http.get(fullurl, { tags: { url: url } }); // 更新自定义指标 urlMetrics[url].responseTime.add(resp.timings.duration); urlMetrics[url].statusCodes.add(1, { status: resp.status }); urlMetrics[url].failedRate.add(resp.status >= 400); sleep(0.2); }); sleep(1); }
数据导出方法
导出到CSV:运行测试时添加
--out参数指定CSV文件路径:k6 run your-script.js --out csv=test-results.csvCSV文件会包含所有指标及对应的
url标签,可直接用表格工具分析。导出到时序数据库(以InfluxDB为例):确保InfluxDB已运行,执行命令:
k6 run your-script.js --out influxdb=http://localhost:8086/k6之后可通过Grafana等工具连接InfluxDB,按URL维度可视化指标数据。
内容的提问来源于stack exchange,提问作者xpt
相关产品推荐
相关产品推荐

