3. CI/CD 流水线 SLI 口径设计原则:四大黄金信号的映射
在构建可观测的 CI/CD 流水线时,Google SRE 提出的四大黄金信号——可用性 (Availability)、延迟 (Latency)、吞吐量 (Throughput) 和 错误率 (Error Rate)——是定义 SLI(服务等级指标)的基石。然而,流水线并非单一服务,而是一个由多个阶段(代码提交、构建、测试、部署)组成的异步工作流。将黄金信号直接套用会导致口径混乱。
本章的核心任务是:将四大黄金信号逐一映射到 CI/CD 流水线的每个关键阶段,定义出可测量、可对比、可告警的 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 数量、数据库连接池大小)关联分析。当吞吐量下降时,通常意味着资源成为瓶颈或存在锁竞争。
3.4 错误率 (Error Rate):阶段失败率与异常比例
错误率是四大信号中最直观的,但也是最容易被误用的。在流水线中,错误率必须按失败原因进行分类,否则无法指导改进。
| 错误类型 | SLI 口径示例 | 典型原因 |
|---|---|---|
| 基础设施错误 | 构建阶段因 Agent 故障失败率 | 磁盘空间不足、网络超时 |
| 代码质量错误 | 单元测试阶段失败率 | 测试断言失败、编译错误 |
| 权限错误 | 部署阶段因 RBAC 拒绝失败率 | K8s RoleBinding 缺失、Secret 未授权 |
| 环境配置错误 | 集成测试阶段因环境变量缺失失败率 | 配置漂移、密钥过期 |
3.5 四大信号在流水线中的协同映射关系
以下 SVG 图展示了四大黄金信号如何映射到 CI/CD 流水线的不同阶段,并形成可观测的 SLI 数据流。每个阶段都对应一组特定的信号口径,而非全流水线共享同一套指标。
3.6 口径设计检查清单
在定义每个 SLI 时,请使用以下清单进行自检,确保口径符合四大黄金信号的映射原则:
- 阶段归属: 该 SLI 是否明确属于某个流水线阶段(检出、构建、测试、部署)?
- 信号分类: 该 SLI 属于可用性、延迟、吞吐量还是错误率?是否存在交叉混淆?
- 测量可行性: 该 SLI 是否可以通过现有工具(Prometheus、Datadog、ELK)直接采集?是否需要额外埋点?
- 区分失败原因: 错误率 SLI 是否按基础设施、代码、权限、配置进行了分类?
- 区分延迟类型: 延迟 SLI 是否区分了执行延迟和排队延迟?