3. CI/CD 流水线 SLI 口径设计原则:四大黄金信号的映射

在构建可观测的 CI/CD 流水线时,Google SRE 提出的四大黄金信号——可用性 (Availability)、延迟 (Latency)、吞吐量 (Throughput) 和 错误率 (Error Rate)——是定义 SLI(服务等级指标)的基石。然而,流水线并非单一服务,而是一个由多个阶段(代码提交、构建、测试、部署)组成的异步工作流。将黄金信号直接套用会导致口径混乱。

本章的核心任务是:将四大黄金信号逐一映射到 CI/CD 流水线的每个关键阶段,定义出可测量、可对比、可告警的 SLI 口径。 映射的核心原则是:每个信号必须对应一个明确的“阶段状态”或“阶段转换”,而非笼统的“流水线健康”。

核心原则: 四大黄金信号在流水线中的映射,必须遵循“阶段化”与“原子化”原则。每个 SLI 必须能追溯到具体的流水线阶段(如构建阶段、单元测试阶段),避免使用全流水线聚合指标作为唯一口径。

3.1 可用性 (Availability):阶段可执行性与环境就绪度

在传统服务中,可用性指服务是否正常响应。在 CI/CD 中,可用性映射为“流水线阶段是否能够按预期启动并执行”。一个阶段不可用,意味着该阶段因基础设施故障、权限缺失或资源耗尽而无法进入执行状态。

流水线阶段 可用性 SLI 口径 测量方式
代码检出 Git 仓库可访问率 Git clone 操作成功率 / 总尝试次数
构建阶段 构建环境就绪率 构建节点(Agent)分配成功率 / 总请求数
测试阶段 测试基础设施可用率 测试数据库 / 服务 Mock 启动成功率
部署阶段 目标环境可达率 K8s API / SSH 连接成功率
避坑提示: 不要将“流水线整体成功率”当作可用性。一个流水线因代码错误而失败,不代表流水线不可用。可用性只关注“能否开始执行”,不关注“执行结果是否通过”。

3.2 延迟 (Latency):阶段耗时与等待时间

延迟在流水线中分为两类:执行延迟(阶段实际运行耗时)和排队延迟(任务等待资源的时间)。SLI 口径必须区分这两者,因为优化手段完全不同。

  • 执行延迟 SLI: 阶段从开始执行到结束的时间。例如:构建阶段耗时 P50/P95、单元测试阶段耗时 P99。
  • 排队延迟 SLI: 任务进入队列到被调度执行的时间。例如:构建任务在 Agent 队列中的等待时间 P95。
  • 端到端延迟 SLI: 从代码提交到生产部署完成的总耗时。此指标受前两者共同影响。
# 示例:Prometheus 记录构建阶段执行延迟(Histogram 类型)
ci_build_duration_seconds{stage="compile", status="success"}
# 示例:记录排队延迟(Gauge 类型)
ci_queue_wait_seconds{queue_name="build_agents"}

3.3 吞吐量 (Throughput):阶段处理能力与并发量

吞吐量在流水线中映射为“单位时间内完成的阶段实例数”。它直接反映流水线的并发处理能力和资源瓶颈。

  • 构建吞吐量: 每分钟/每小时完成的构建任务数。
  • 部署吞吐量: 每天完成的部署次数(Deployments per Day, DPD)。
  • 测试吞吐量: 每小时执行的测试用例数(通常用于压力测试阶段)。

吞吐量 SLI 必须与并发资源(Agent 数量、数据库连接池大小)关联分析。当吞吐量下降时,通常意味着资源成为瓶颈或存在锁竞争。

注意: 吞吐量指标在流水线中容易与“频率”混淆。例如,“每天部署 10 次”是部署频率,而非吞吐量。吞吐量强调在给定时间窗口内实际完成的实例数,与排队长度和资源利用率强相关。

3.4 错误率 (Error Rate):阶段失败率与异常比例

错误率是四大信号中最直观的,但也是最容易被误用的。在流水线中,错误率必须按失败原因进行分类,否则无法指导改进。

错误类型 SLI 口径示例 典型原因
基础设施错误 构建阶段因 Agent 故障失败率 磁盘空间不足、网络超时
代码质量错误 单元测试阶段失败率 测试断言失败、编译错误
权限错误 部署阶段因 RBAC 拒绝失败率 K8s RoleBinding 缺失、Secret 未授权
环境配置错误 集成测试阶段因环境变量缺失失败率 配置漂移、密钥过期

3.5 四大信号在流水线中的协同映射关系

以下 SVG 图展示了四大黄金信号如何映射到 CI/CD 流水线的不同阶段,并形成可观测的 SLI 数据流。每个阶段都对应一组特定的信号口径,而非全流水线共享同一套指标。

CI/CD 流水线四大黄金信号映射架构图 四大黄金信号在 CI/CD 流水线中的阶段映射 代码提交 Git Push / PR 构建阶段 编译 / 打包 测试阶段 单元 / 集成 部署阶段 生产 / 预发布 可用性 (Availability) Git 可达 / Agent 就绪 / 环境可达 延迟 (Latency) 构建耗时 P95 / 排队等待 P95 吞吐量 (Throughput) 构建数/小时 / 部署数/天 错误率 (Error Rate) 基础设施 / 代码 / 权限错误率 映射原则:每个阶段至少对应一个黄金信号,且 SLI 口径必须阶段化、原子化 避免使用全流水线聚合指标,确保每个 SLI 都能追溯到具体的阶段和失败原因

3.6 口径设计检查清单

在定义每个 SLI 时,请使用以下清单进行自检,确保口径符合四大黄金信号的映射原则:

  • 阶段归属: 该 SLI 是否明确属于某个流水线阶段(检出、构建、测试、部署)?
  • 信号分类: 该 SLI 属于可用性、延迟、吞吐量还是错误率?是否存在交叉混淆?
  • 测量可行性: 该 SLI 是否可以通过现有工具(Prometheus、Datadog、ELK)直接采集?是否需要额外埋点?
  • 区分失败原因: 错误率 SLI 是否按基础设施、代码、权限、配置进行了分类?
  • 区分延迟类型: 延迟 SLI 是否区分了执行延迟和排队延迟?
最佳实践: 建议为每个阶段定义至少 2 个黄金信号。例如,构建阶段同时监控“可用性”(Agent 就绪率)和“延迟”(构建耗时 P95)。测试阶段同时监控“吞吐量”(用例执行速率)和“错误率”(测试失败率)。这种组合能提供更全面的阶段健康视图。