4. k6 核心指标:内置指标与自定义指标

在 k6 压测中,指标(Metric)是衡量系统性能与稳定性的核心数据单元。k6 将指标分为内置指标和自定义指标两大类。内置指标由 k6 运行时自动采集,覆盖请求耗时、失败率、虚拟用户数等基础维度;自定义指标则允许测试脚本按业务逻辑定义专属度量,如队列深度、缓存命中率、业务成功率等。

本章将系统梳理这两类指标的定义、采集方式、适用场景,并通过对比表格和结构图帮助你在 P95 阈值校准实战中精准选型。

4.1 内置指标:开箱即用的性能基线

k6 内置指标在每次测试执行时自动记录,无需额外声明。以下四个指标是 P95 阈值校准中最常用的核心指标。

指标名称 类型 含义 P95 校准中的用途
http_req_duration Trend(趋势) HTTP 请求从发出到收到完整响应的总耗时(ms) 直接作为 P95 阈值计算的目标指标
http_req_failed Rate(比率) HTTP 请求失败的比例(基于非 2xx/3xx 状态码或超时) 作为阈值失效条件:失败率超过 1% 时 P95 阈值自动失效
vus Gauge(瞬时值) 当前时刻活跃的虚拟用户数 判断压测水位是否达到目标并发数
iterations Counter(计数器) 脚本迭代(VU 执行一次完整函数)的总次数 计算吞吐量(iterations / 时间),辅助判断压测是否达到稳态
实战提示:在 P95 阈值校准中,http_req_duration 是主指标,http_req_failed 是门禁指标。只有当失败率低于预设阈值(如 1%)时,P95 耗时数据才被视为有效。

4.2 自定义指标:按业务逻辑定义度量

当内置指标无法覆盖业务语义时(如“下单成功率”“缓存命中率”“队列等待时间”),k6 提供四种自定义指标类型:Trend、Counter、Gauge、Rate。它们与内置指标的类型系统完全一致,但由测试脚本显式创建和上报。

类型 数据结构 典型场景 P95 校准中的角色
Trend 记录一组数值,可计算 min/max/avg/p(95)/p(99) 业务耗时、数据库查询耗时、外部 API 调用耗时 扩展 P95 阈值到业务层,如“下单业务 P95 耗时”
Counter 单调递增的计数器 请求总数、错误总数、订单总数 计算吞吐量或错误率分母
Gauge 记录当前瞬时值 连接池大小、队列深度、内存使用率 监控压测过程中的资源水位
Rate 记录“成功/总次数”的比率 业务成功率、缓存命中率、接口可用率 作为 P95 阈值的辅助判定条件
选型原则:需要计算百分位(如 P95)时用 Trend;需要统计总量时用 Counter;需要监控瞬时状态时用 Gauge;需要关注比率时用 Rate。切勿将 Trend 当作 Counter 使用,否则百分位计算会失真。

4.3 指标类型与数据流结构

下图展示了 k6 指标从采集到输出的完整数据流,以及内置指标与自定义指标在其中的位置关系。

k6 指标数据流与类型结构 测试脚本 内置指标自动采集 自定义指标手动上报 k6 指标引擎 类型分类与聚合 百分位 / 计数 / 比率计算 报告 / 阈值引擎 P95 阈值判定 通过 / 失败输出 Trend http_req_duration Counter iterations Gauge vus Rate http_req_failed P95 阈值校准中的指标分工 主指标:Trend(http_req_duration / 业务耗时) 辅助指标:Rate(失败率)、Counter(吞吐量)、Gauge(并发水位)

4.4 自定义指标代码实战

以下示例展示如何在 k6 脚本中创建并使用四种自定义指标,并配合阈值进行 P95 校准。

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

// 自定义指标声明
const businessDuration = new Trend('business_duration');   // 业务耗时
const orderCount = new Counter('order_total');             // 订单总数
const queueDepth = new Gauge('queue_depth');               // 队列深度
const bizSuccessRate = new Rate('biz_success_rate');       // 业务成功率

export const options = {
  vus: 10,
  duration: '30s',
  thresholds: {
    // 内置指标阈值
    http_req_duration: ['p(95)<2000'],
    http_req_failed: ['rate<0.01'],
    // 自定义指标阈值
    business_duration: ['p(95)<1500'],
    biz_success_rate: ['rate>0.99'],
  },
};

export default function () {
  const start = Date.now();

  // 模拟业务请求
  const res = http.get('https://test.k6.io');
  const success = check(res, { 'status is 200': (r) => r.status === 200 });

  // 上报业务耗时(Trend)
  const elapsed = Date.now() - start;
  businessDuration.add(elapsed);

  // 上报订单总数(Counter)
  orderCount.add(1);

  // 上报队列深度(Gauge)—— 模拟从响应头获取
  const depth = parseInt(res.headers['X-Queue-Depth'] || '0');
  queueDepth.add(depth);

  // 上报业务成功率(Rate)
  bizSuccessRate.add(success);

  sleep(1);
}
常见误区:自定义指标名称不要与内置指标重名(如不要定义名为 http_req_duration 的 Trend),否则会导致数据覆盖或阈值冲突。建议使用业务前缀,如 order_、payment_、search_。

4.5 指标选型决策流程

在 P95 阈值校准实战中,面对一个具体的业务场景,可以按以下流程快速确定指标类型:

  1. 判断是否需要百分位统计(P50/P95/P99)?
    是 → 使用 Trend;否 → 进入下一步。
  2. 判断是否关注“当前瞬时值”?
    是 → 使用 Gauge;否 → 进入下一步。
  3. 判断是否关注“成功/总次数”的比率?
    是 → 使用 Rate;否 → 使用 Counter。
实战案例:在“下单链路 P95 校准”中,order_create_duration(Trend)是主指标,order_success_rate(Rate)是门禁指标,order_total(Counter)用于计算吞吐量,db_connection_pool(Gauge)用于监控数据库连接水位。四个指标协同完成一次完整的 P95 阈值校准。

4.6 本章小结

  • 内置指标:http_req_duration(Trend)、http_req_failed(Rate)、vus(Gauge)、iterations(Counter)是 P95 校准的四大基础指标。
  • 自定义指标:Trend 用于百分位统计,Counter 用于总量计数,Gauge 用于瞬时监控,Rate 用于比率判定。
  • 选型原则:按“是否需要百分位 → 是否瞬时值 → 是否比率”的决策树快速定位。
  • 阈值绑定:自定义指标同样支持 thresholds 配置,可与内置指标一起构成完整的 P95 校准体系。