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 误差预算消耗与恢复流程

下图展示了在制品供应链中,误差预算从消耗到恢复的完整闭环流程:

误差预算消耗与恢复闭环流程 SLI 数据采集 SLO 阈值比较 违反SLO? 消耗误差预算 计算燃烧率 触发告警/工单 恢复 & 预算重置 否:继续监控

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流水线中阻断高风险制品的部署,并将决策事件记录到审计日志中。