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

如何用k6按URL维度采集并报告测试指标?含轮询及云平台问题

问题背景

需要用k6按单个URL维度采集并报告响应时间、状态码、成功率等详细指标,定义了URL数组并希望以轮询方式访问(保证各URL访问机会均等),但现有脚本输出结果异常(如快慢URL指标颠倒),怀疑脚本的顺序性与k6 VU并发执行存在冲突,需解决以下问题:

  1. 如何修正脚本使其正常工作?
  2. 如何实现按URL维度报告测试指标?
  3. 在k6云平台上,如何按URL维度展示指标(目前仅能看到一条responseTime曲线)?

现有脚本

import http from 'k6/http';
import { Trend, Counter, Rate } from 'k6/metrics';
import { sleep } from 'k6';

// Define URLs to test
const urls = [
    "https://example.com/page1",
    "https://example.com/page2",
    "https://example.com/page3"
];

// Initialize custom metrics for each URL
const urlMetrics = {};
urls.forEach(url => {
    urlMetrics[url] = {
        responseTime: new Trend(`response_time_${url}`),
    };
});

// Counter to track the current URL index for round-robin
let currentIndex = 0;

export default function () {
    // Get the current URL in a round-robin fashion
    const currentUrl = urls[currentIndex];
    currentIndex = (currentIndex + 1) % urls.length; // Cycle back to the start after the last URL

    // Perform the HTTP GET request
    const response = http.get(currentUrl);

    // Update custom metrics for the current URL
    urlMetrics[currentUrl].responseTime.add(response.timings.duration);

    // Optional: Add a small delay between requests to simulate realistic load
    sleep(1);
}

解决方案

1. 修正脚本使其正常工作

现有脚本的核心问题是全局currentIndex被所有VU共享,并发场景下多个VU会同时修改该变量,导致URL轮询逻辑混乱,指标统计异常。以下是两种可靠修正方案:

方案一:每个VU独立维护轮询索引

将currentIndex改为VU本地变量(每个VU会拥有自己的副本,互不干扰):

import http from 'k6/http';
import { Trend, Counter, Rate } from 'k6/metrics';
import { sleep } from 'k6';

const urls = [
    "https://example.com/page1",
    "https://example.com/page2",
    "https://example.com/page3"
];

// 每个VU独立的轮询索引,初始化时为0
let currentIndex = 0;

// 初始化各URL的完整指标:响应时间、成功率、状态码计数
const urlMetrics = {};
urls.forEach(url => {
    // 替换URL中的特殊字符,避免生成无效的指标名称
    const safeUrlName = url.replace(/[^a-zA-Z0-9]/g, '_');
    urlMetrics[url] = {
        responseTime: new Trend(`response_time_${safeUrlName}`),
        successRate: new Rate(`success_rate_${safeUrlName}`),
        status2xx: new Counter(`status_2xx_${safeUrlName}`),
        status4xx: new Counter(`status_4xx_${safeUrlName}`),
        status5xx: new Counter(`status_5xx_${safeUrlName}`),
    };
});

export default function () {
    // 当前VU独立执行轮询逻辑
    const currentUrl = urls[currentIndex];
    currentIndex = (currentIndex + 1) % urls.length;

    const response = http.get(currentUrl);

    // 更新当前URL的指标
    const metrics = urlMetrics[currentUrl];
    metrics.responseTime.add(response.timings.duration);
    metrics.successRate.add(response.status >= 200 && response.status < 300);
    if (response.status >= 200 && response.status < 300) {
        metrics.status2xx.add(1);
    } else if (response.status >= 400 && response.status < 500) {
        metrics.status4xx.add(1);
    } else if (response.status >= 500) {
        metrics.status5xx.add(1);
    }

    sleep(1);
}

方案二:利用__ITER实现全局均匀轮询

无需维护索引,直接通过当前VU的迭代次数取模URL数组长度,确保所有迭代的URL分配均匀:

// 替换default函数中的轮询逻辑
export default function () {
    // 按迭代次数轮询URL,全局分配均匀
    const currentUrl = urls[__ITER % urls.length];
    // 后续请求和指标更新逻辑同上
}

2. 按URL维度报告测试指标

有两种高效实现方式:

  • 自定义指标(推荐):如上述修正后的脚本,为每个URL创建独立的Trend(响应时间)、Rate(成功率)、Counter(状态码),指标名称包含URL的安全标识。k6终端输出、本地HTML报告会自动按指标名称分组,展示各URL的详细数据。
  • 利用默认指标的标签:k6自带的http_req_duration、http_req_failed等指标会自动携带url标签,无需自定义指标,只需在报告中按url标签过滤即可。例如执行测试时添加参数k6 run --tag url=* script.js,或在HTML报告的筛选栏选择url标签分组。

3. k6云平台按URL维度展示指标

k6云平台支持按标签或自定义指标分组展示,操作步骤如下:

  1. 使用默认HTTP指标:云平台默认采集的http_req_duration、http_req_failed等指标自带url标签,进入测试结果页面后点击「添加图表」,选择对应指标,在「分组依据」中选择url标签,即可生成各URL的响应时间/成功率曲线。
  2. 使用自定义指标:如果用了自定义指标,直接在图表中选择对应URL的指标(如response_time_https_example_com_page1),添加多个指标即可对比展示各URL的细分数据。
  3. 保存仪表盘:配置好图表后,点击「保存仪表盘」,可长期查看该测试或同类测试的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 06:29:59