2. SLI 与 SLO 基础:定义服务等级指标、服务等级目标与误差预算

在可观测性工程与 SRE 实践中,SLI、SLO 与误差预算构成了服务质量管理最核心的三角模型。理解三者的定义与计算公式,是后续利用 PromQL 进行误差预算台账数据偏差排查的前提。

2.1 服务等级指标(SLI)

SLI(Service Level Indicator) 是对服务某个特定维度的量化测量,通常表示为一段时间内的比率或计数。SLI 的选择必须直接反映用户的真实体验。

2.1.1 常见 SLI 类型

SLI 类别 典型指标 测量方式
可用性 请求成功率 成功请求数 / 总请求数
延迟 P99 响应时间 排序后第 99 百分位的响应耗时
吞吐量 每秒请求数(QPS) 单位时间内的请求计数
错误率 5xx 错误占比 HTTP 5xx 响应数 / 总响应数
饱和度 CPU/内存使用率 已使用资源 / 总资源容量

2.1.2 SLI 计算公式

对于最常见的可用性 SLI,其通用计算公式为:

SLI = (Good Events / Total Events) × 100%

其中:

  • Good Events:符合成功标准的请求或操作次数
  • Total Events:在测量窗口内的总请求或操作次数
实践要点:SLI 的测量窗口通常选择滚动时间窗口(如 1 分钟、5 分钟),而非固定日历窗口,以便与 PromQL 的 rate() 和 increase() 函数自然对齐。

2.2 服务等级目标(SLO)

SLO(Service Level Objective) 是为 SLI 设定的目标阈值,表示服务所有者承诺在一段较长时间内(通常为 28 天或 30 天)SLI 应达到的水平。SLO 是 SLI 的边界值,也是误差预算计算的基准。

2.2.1 SLO 表达形式

SLO 通常以 "SLI ≤ 阈值" 或 "SLI ≥ 阈值" 的形式定义:

示例:
- 可用性 SLO:99.9%(三个九)
- 延迟 SLO:P99 延迟 ≤ 200ms
- 错误率 SLO:5xx 错误率 ≤ 0.1%

2.2.2 SLO 与 SLI 的关系

  • SLI 是测量值,SLO 是目标值
  • 一个 SLO 必须绑定一个 SLI,但一个 SLI 可以有多个不同严格程度的 SLO
  • SLO 的达成情况决定了服务是否处于 "合规" 状态
关键概念:SLO 不是 SLA(Service Level Agreement)。SLA 是带有惩罚条款的合同承诺,通常比内部 SLO 更宽松。SRE 实践中,内部 SLO 应比对外 SLA 更严格,以预留安全缓冲。

2.3 误差预算(Error Budget)

误差预算 是 SLO 未覆盖的可容忍失败额度。它量化了服务在遵守 SLO 的前提下,允许出现多少次失败或多少时间的不可用。

2.3.1 误差预算计算公式

误差预算的通用计算公式为:

Error Budget = (1 - SLO) × Total Events (或 Total Time)

对于基于请求计数的 SLO:

Error Budget = (1 - SLO) × Total Requests in Window

对于基于时间窗口的 SLO:

Error Budget = (1 - SLO) × Window Duration

2.3.2 误差预算消耗计算

实际消耗的误差预算为:

Budget Consumed = Total Bad Events in Window
或
Budget Consumed = (1 - SLI_actual) × Total Events

剩余误差预算:

Budget Remaining = Error Budget - Budget Consumed

2.3.3 误差预算率

在 PromQL 监控中,更常用的是误差预算消耗率:

Error Budget Burn Rate = Budget Consumed / Error Budget × 100%

当消耗率超过 100% 时,表示 SLO 已被违反。

常见误区:误差预算不是"剩余可用失败次数"的简单计数。在滚动窗口中,误差预算会随时间推移而"刷新"。PromQL 的 rate() 函数天然适合计算滚动窗口内的误差预算消耗速率。

2.4 SLI / SLO / 误差预算关系图

下图展示了三者之间的核心关系与数据流向:

SLI / SLO / 误差预算关系图 服务等级指标 SLI 服务等级目标 SLO 误差预算 Error Budget 测量 计算 核心公式 SLI = Good Events / Total Events × 100% Error Budget = (1 - SLO) × Total Events SRE 实践流程 ① 定义 SLI → ② 设定 SLO → ③ 计算误差预算 → ④ 监控消耗速率 → ⑤ 触发告警或决策 PromQL 作用点:使用 rate() / increase() 实时计算 SLI,并与 SLO 阈值比较,推导剩余误差预算

2.5 典型 SLO 与误差预算示例

以下表格展示了不同 SLO 等级对应的误差预算额度:

SLO 等级 SLI 目标 30 天误差预算 日均允许失败 典型场景
99.9%(三个九) 可用性 ≥ 99.9% 43.2 分钟 1.44 分钟 内部工具、开发环境
99.99%(四个九) 可用性 ≥ 99.99% 4.32 分钟 8.64 秒 核心业务 API
99.999%(五个九) 可用性 ≥ 99.999% 25.9 秒 0.86 秒 金融交易、实时通信
PromQL 映射提示:在 Prometheus 中,误差预算通常以 比率 形式存储。例如,可用性 SLI 可表示为 rate(http_requests_total{status="success"}[5m]) / rate(http_requests_total[5m]),而误差预算消耗率则通过 (1 - SLI) / (1 - SLO) 计算得出。

2.6 本章小结

  • SLI 是服务的量化测量指标,必须可观测、可计算
  • SLO 是 SLI 的目标边界,定义了服务的"健康"范围
  • 误差预算 = (1 - SLO) × 总事件数,是服务可容忍的失败额度
  • 三者的关系构成了 SRE 数据驱动决策的基础,也是 PromQL 聚合查询在误差预算台账中发挥价值的起点