4. 误差预算定义:服务等级目标(SLO)、服务等级指标(SLI)、误差预算的计算公式与消耗机制
在制品供应链的可观测性体系中,误差预算(Error Budget)是连接开发速度与系统可靠性的核心量化工具。它通过将抽象的“可靠性”转化为可消耗的“预算”,使团队能够在功能迭代与稳定性保障之间做出数据驱动的决策。本节将系统定义服务等级指标(SLI)、服务等级目标(SLO)以及误差预算的计算与消耗机制。
4.1 核心概念定义
| 术语 | 英文 | 定义 | 制品供应链示例 |
|---|---|---|---|
| 服务等级指标(SLI) | Service Level Indicator | 对服务某个维度(如延迟、错误率、吞吐量)的量化测量值。 | 制品签名验证的成功率、镜像拉取的P99延迟、SBOM生成请求的错误率。 |
| 服务等级目标(SLO) | Service Level Objective | 为SLI设定的目标阈值或范围,是团队承诺的可靠性边界。 | 制品签名验证成功率 ≥ 99.9%(月度);镜像拉取P99延迟 ≤ 200ms(滚动窗口)。 |
| 误差预算(Error Budget) | Error Budget | 在SLO允许范围内,系统可以“出错”或“不可用”的总时间或总次数。 | 月度内允许的签名验证失败总次数 = 总请求数 × (1 - 99.9%)。 |
关键原则:误差预算 = 1 - SLO。SLO越严格(如99.99%),误差预算越少(0.01%);SLO越宽松(如99%),误差预算越多(1%)。
4.2 误差预算计算公式
误差预算的计算基于选定的时间窗口(通常为28天或30天滚动窗口),其通用公式如下:
Error Budget = Total Events × (1 - SLO)
其中:
- Total Events:在时间窗口内,SLI测量的总事件数(如总请求数、总操作次数)。
- SLO:以小数表示的服务等级目标(如 0.999 表示 99.9%)。
实际消耗量 = Total Events - Successful Events
剩余预算 = Error Budget - 实际消耗量
基于时间的误差预算(适用于可用性类SLI):
Error Budget (seconds) = Time Window (seconds) × (1 - SLO)
示例:30天窗口(2,592,000秒),SLO为99.9%
Error Budget = 2,592,000 × 0.001 = 2,592 秒 ≈ 43.2 分钟
基于计数的误差预算(适用于成功率类SLI):
Error Budget (count) = Total Requests × (1 - SLO)
示例:月度总请求 1,000,000 次,SLO为99.99%
Error Budget = 1,000,000 × 0.0001 = 100 次失败
4.3 误差预算消耗机制
误差预算的消耗并非简单的“用尽即停止”,而是遵循一套动态的、可观测的消耗与告警机制。在制品供应链中,每个环节的故障都会消耗对应的误差预算。
4.3.1 消耗触发条件
- SLI 违反:当某个时间窗口内的SLI测量值低于SLO阈值时,开始消耗预算。
- 持续消耗:只要SLI处于违反状态,预算持续消耗,直到SLI恢复到SLO范围内。
- 多维度消耗:不同的SLI(如延迟、错误率)拥有独立的误差预算池,互不干扰。
4.3.2 消耗速率与燃烧率(Burn Rate)
燃烧率是衡量误差预算消耗速度的关键指标,用于提前预警而非事后补救。
Burn Rate = 实际消耗的误差预算 / 时间窗口内允许消耗的预算
- Burn Rate = 1:预算消耗速度与SLO允许的速度一致(正常)。
- Burn Rate > 1:预算消耗过快,需要告警。
- Burn Rate < 1:预算消耗较慢,系统表现优于SLO。
| 燃烧率范围 | 告警级别 | 响应动作 |
|---|---|---|
| 1 ~ 2 | 低(Info) | 记录日志,观察趋势 |
| 2 ~ 5 | 中(Warning) | 触发工单,人工介入排查 |
| 5 ~ 10 | 高(Critical) | 立即响应,考虑回滚或限流 |
| > 10 | 紧急(Pager) | 全链路应急,启动故障恢复流程 |
实践建议:在OpenTelemetry中,可以将燃烧率作为自定义指标(Custom Metric)导出,通过Prometheus等监控系统设置多级告警规则,实现误差预算的实时预警。
4.4 误差预算消耗与恢复流程
下图展示了在制品供应链中,误差预算从消耗到恢复的完整闭环流程:
4.5 制品供应链中的误差预算台账设计
在基于OpenTelemetry的制品供应链中,误差预算台账需要记录每个制品的每个环节的预算消耗情况。台账的核心字段设计如下:
| 字段 | 类型 | 说明 | OpenTelemetry属性示例 |
|---|---|---|---|
| 制品ID | string | 制品的唯一标识(如镜像摘要、包名) | artifact.id |
| 供应链环节 | string | 当前环节名称(如签名、扫描、部署) | supply.chain.stage |
| SLI名称 | string | 测量的指标名称 | sli.name |
| SLO目标 | float | 目标值(如 99.9) | slo.target |
| 时间窗口 | string | 滚动窗口大小(如 28d) | error.budget.window |
| 总预算 | float | 窗口内允许的最大失败次数/时间 | error.budget.total |
| 已消耗预算 | float | 当前已消耗的预算量 | error.budget.consumed |
| 剩余预算 | float | 总预算 - 已消耗预算 | error.budget.remaining |
| 燃烧率 | float | 当前消耗速率 | error.budget.burn_rate |
| 状态 | string | 健康/警告/紧急/耗尽 | error.budget.status |
避坑指南:不要为每个制品单独设置SLO,这会导致台账爆炸。正确的做法是按制品类型(如容器镜像、Helm Chart、Java JAR)或供应链环节(如签名服务、扫描服务)聚合SLO,每个聚合维度维护一个误差预算台账。
4.6 误差预算的消耗策略与决策
当误差预算被消耗时,团队需要根据剩余预算做出不同的决策:
- 预算充足(剩余 > 50%):正常发布新功能,无需额外审批。
- 预算中等(剩余 20% ~ 50%):发布需附带稳定性说明,优先修复已知问题。
- 预算紧张(剩余 5% ~ 20%):冻结非关键发布,成立应急小组排查根因。
- 预算耗尽(剩余 ≤ 0%):停止所有变更,全量回滚至上一个稳定版本,启动事故复盘。
通过OpenTelemetry的Span Link和Metric Export,可以将上述决策逻辑自动化:当误差预算剩余低于阈值时,自动在CI/CD流水线中阻断高风险制品的部署,并将决策事件记录到审计日志中。