You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

修正步骤

  1. 给请求添加自定义标签:发送HTTP请求时,通过tags参数指定url标签值,让内置指标关联到对应的短URL标识。
  2. 完善自定义指标:补充状态码计数器、请求失败率等需要按URL追踪的指标。
  3. 配置输出方式:使用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.csv
    

    CSV文件会包含所有指标及对应的url标签,可直接用表格工具分析。

  • 导出到时序数据库(以InfluxDB为例):确保InfluxDB已运行,执行命令:

    k6 run your-script.js --out influxdb=http://localhost:8086/k6
    

    之后可通过Grafana等工具连接InfluxDB,按URL维度可视化指标数据。

内容的提问来源于stack exchange,提问作者xpt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:59:52