← 中文资源

简体中文版本

用 k6 把 API 延迟预算变成 CI 门禁

把分位数阈值写进 k6 场景,在 CI 对暂存构建执行,p95 或错误率破预算即阻断合并。

阅读英文原文

目标

写在文档里的延迟预算会腐烂,写成 k6 阈值的延迟预算会执行。k6 按标签对每个端点独立评估分位数阈值,越界即非零退出,慢的 PR 变成一个红色检查而不是下季度才发现的趋势线。脚本就是需求,CI 运行就是审计,失败信息点名端点。

步骤要点

  1. 在 options.thresholds 里按 endpoint 标签声明阈值:search p95<300ms、detail p95<120ms、错误率<1%。
  2. 用 group+tags 给请求打端点类别标签,慢的 search 无法藏进快的均值里。
  3. CI 对候选构建环境执行 k6 run,任一阈值击穿即 job 失败、PR 被阻断。
  4. 失败时读 summary 的阈值明细:每个阈值带数值与通过标记,直接点名回归端点。
  5. 把 stages 调成 15s+30s 的轻量档,让门禁足够便宜以跑在每个 PR 上。

排错提示

共享 staging 导致阈值抖动,就为每个 PR 起一次性隔离环境或加预热阶段并放宽预算;首次运行因冷缓存失败就在测量前加 warmup stage 或在环境准备步预热数据;门禁太慢会被禁用,PR 跑轻量档、主干跑全量档,两档共享同一 thresholds 对象。

适用边界

阈值度量的是暂存环境而非生产拓扑,预算相对生产目标要保守;k6 度量 HTTP 行为,队列型异步端点需要场景专用探针。

代码示例

export const options = {
  thresholds: {
    "http_req_duration{endpoint:search}": ["p(95)<300"],
    "http_req_duration{endpoint:detail}": ["p(95)<120"],
    "http_req_failed": ["rate<0.01"],
  },
};