2. SLI 基础概念:服务等级指标与四大黄金信号

SLI(Service Level Indicator,服务等级指标)是衡量系统或流水线某一维度服务质量的核心量化指标。在跨团队 CI/CD 流水线中,SLI 必须从“最终用户”视角(即开发人员提交代码到部署生效的完整体验)进行定义,而非仅关注基础设施层面的原始数据。

2.1 SLI 定义三要素

一个合格的 SLI 必须同时明确以下三个要素,否则无法在跨团队间形成统一口径:

要素 说明 流水线示例
测量窗口 SLI 数据聚合的时间范围 过去 5 分钟 / 过去 1 小时 / 最近 100 次构建
聚合方法 原始数据如何汇总为单一数值 平均值 / P50 / P95 / P99 / 成功率百分比
计数条件 哪些事件计入分母,哪些计入分子 仅统计“触发 CI 的 PR 构建”,排除手动重试
口径对齐关键: 不同团队对“构建失败”的定义可能不同——是“编译报错”算失败,还是“单元测试未通过”也算失败?SLI 定义阶段必须书面化这些计数条件,否则后续质量门禁将产生争议。

2.2 四大黄金信号在流水线中的映射

Google SRE 提出的四大黄金信号(延迟、流量、错误、饱和度)不仅适用于生产服务,同样可以系统化地映射到 CI/CD 流水线的各个阶段。以下表格展示了每个信号在流水线中的具体 SLI 定义:

黄金信号 流水线 SLI 名称 典型测量方式 数据来源
延迟 (Latency) 流水线端到端耗时 从代码提交到部署完成的 P95 耗时 CI/CD 平台 API + 时间戳埋点
流量 (Traffic) 构建并发量与吞吐量 每分钟启动的构建任务数 / 排队任务数 构建队列监控 + Runner 日志
错误 (Errors) 流水线失败率 失败构建数 / 总构建数(排除手动取消) CI/CD 平台 Webhook 事件
饱和度 (Saturation) 构建资源利用率 Runner CPU 使用率 / 并发槽位占用率 Kubernetes / 虚拟机监控
实践建议: 初期每个信号只选 1 个最核心的 SLI 进行采集,避免过度埋点。例如先聚焦“流水线失败率”和“端到端 P95 耗时”,待数据稳定后再扩展其他维度。

2.3 四大黄金信号映射关系图

下图展示了四大黄金信号如何从生产服务监控模型映射到 CI/CD 流水线的不同阶段,以及各信号之间的关联关系:

四大黄金信号在 CI/CD 流水线中的映射 四大黄金信号 → CI/CD 流水线 SLI 映射 生产服务四大信号 延迟 流量 错误 饱和度 流水线 SLI 指标 P95 端到端耗时 构建并发数 / 吞吐量 流水线失败率 Runner 资源利用率 流水线阶段 代码检出 → 编译 → 测试 构建队列 → 并行执行 全阶段(代码扫描 → 部署) Agent 节点 / 容器资源池 💡 映射原则: 每个黄金信号在流水线中至少对应一个可量化 SLI;延迟和错误是质量门禁的“硬指标”,流量和饱和度是容量规划的“软指标”。

2.4 各信号详细定义与流水线示例

2.4.1 延迟(Latency)

  • SLI 名称:流水线端到端耗时(Pipeline Lead Time)
  • 测量方式:从开发者触发构建(git push / PR merge)到流水线最终状态(成功/失败)的时间差,取 P95 或 P99 分位数。
  • 流水线示例:“过去 1 小时内,所有 PR 构建的 P95 耗时不超过 15 分钟。”
  • 常见陷阱:排队等待时间是否计入?建议明确区分“排队延迟”和“执行延迟”,分别定义 SLI。

2.4.2 流量(Traffic)

  • SLI 名称:构建并发数与吞吐量
  • 测量方式:每分钟/每小时启动的构建任务数,以及同时运行的构建任务峰值。
  • 流水线示例:“高峰期并发构建数不超过 Runner 池容量的 80%。”
  • 常见陷阱:流量激增可能导致 Runner 资源争抢,进而影响延迟 SLI。流量 SLI 通常用于容量规划而非质量门禁。

2.4.3 错误(Errors)

  • SLI 名称:流水线失败率(Pipeline Failure Rate)
  • 测量方式:失败构建数 / 总构建数 × 100%。需排除手动取消、超时自动取消等非故障场景。
  • 流水线示例:“最近 100 次构建中,失败率低于 5%。”
  • 常见陷阱:基础设施故障(如 Runner 宕机)导致的失败应与代码质量失败分开统计,否则会掩盖真实问题。

2.4.4 饱和度(Saturation)

  • SLI 名称:Runner 资源利用率
  • 测量方式:CPU 使用率、内存使用率、并发槽位占用率、磁盘 I/O 等待时间。
  • 流水线示例:“Runner 节点 CPU 平均利用率超过 85% 时触发扩容告警。”
  • 常见陷阱:饱和度 SLI 通常不直接用于质量门禁阻断,而是作为容量规划的输入。但极端饱和度(如 100%)会间接导致延迟和错误 SLI 劣化。
⚠️ 跨团队口径对齐警告: 不同团队可能对“错误”的定义不一致——A 团队将“单元测试失败”视为错误,B 团队仅将“编译失败”视为错误。在制定 SLI 口径时,必须使用统一的计数条件文档,并在流水线配置中通过标签(tag)或分类字段进行标记,否则质量门禁将产生误判。

2.5 SLI 采集与存储建议

为支撑后续的质量门禁计算,SLI 数据需要以结构化方式存储。推荐使用以下数据模型:

{
  "pipeline_id": "build-20250321-001",
  "team": "payment-team",
  "stage": "test",
  "sli_type": "latency",
  "value_ms": 34200,
  "p50_ms": 28500,
  "p95_ms": 62000,
  "timestamp": "2025-03-21T10:30:00Z",
  "tags": {
    "branch": "feature/payment-v2",
    "trigger": "pr_merge"
  }
}

每个 SLI 事件应包含团队标签、流水线阶段、信号类型和分位数数据,以便后续按团队、按阶段进行聚合分析。