slo

服务等级目标与错误预算的制定方法

补充说明

SLO 是对某个 SLI 在时间窗口内要达到的目标,SLA 是对外承诺,SLI 是可测量的指标。三者顺序是 SLI → SLO → SLA,不要反过来。SLO 要从用户视角选指标:成功率、延迟、数据新鲜度,而不是 CPU 使用率。

窗口常用 28 天或 30 天。目标不要写 100%,否则没有错误预算,任何一次发布都变成违规。

常用示例

按服务等级定目标(28 天窗口):

等级 SLI SLO 允许不可用
核心交易 成功请求比例 99.95% 20.16 分钟
一般 API 成功请求比例 99.9% 40.32 分钟
报表导出 24 小时内完成 99% 6.72 小时

计算错误预算:

# 99.9% SLO,28 天窗口
awk 'BEGIN {printf "允许不可用: %.2f 分钟\n", 28*24*60*(1-0.999)}'
# 99.95% SLO
awk 'BEGIN {printf "允许不可用: %.2f 分钟\n", 28*24*60*(1-0.9995)}'

用 recording rule 固化 SLI,避免每次查询扫描原始指标:

groups:
- name: slo
  rules:
  - record: job:http_requests:ratio_rate5m
    expr: |
      sum by (job) (rate(http_requests_total{code!~"5.."}[5m]))
      / sum by (job) (rate(http_requests_total[5m]))
  - record: job:http_errors:ratio_rate5m
    expr: 1 - job:http_requests:ratio_rate5m

多窗口燃烧率告警(99.9% SLO):

groups:
- name: slo-burn
  rules:
  - alert: ErrorBudgetBurnFast
    expr: |
      job:http_errors:ratio_rate1h > 14.4 * 0.001
      and
      job:http_errors:ratio_rate5m > 14.4 * 0.001
    for: 2m
    labels:
      severity: page
  - alert: ErrorBudgetBurnSlow
    expr: |
      job:http_errors:ratio_rate6h > 6 * 0.001
      and
      job:http_errors:ratio_rate30m > 6 * 0.001
    for: 15m
    labels:
      severity: ticket

燃烧率 = 当前错误率 / (1 - SLO)。99.9% 时 14.4 倍燃烧率对应 1 小时消耗 2% 的 30 天预算。阈值不要凭感觉,按“多久耗尽预算”反推;告警里的 rate1h、rate6h、rate30m 记录规则按同一表达式换窗口生成,规则用 promtool check rules slo-rules.yml 校验。

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. 99.9% 的 SLO 在 28 天窗口里允许多长时间不可用?
  2. 燃烧率 14.4 倍意味着什么?
  3. 为什么核心服务不应该把 SLO 定成 100%?
答案
  1. 28 天共 40320 分钟,允许 0.1%,即 40.32 分钟。
  2. 错误消耗速度是预算允许速度的 14.4 倍;在 30 天窗口下,持续 1 小时会烧掉约 2% 的预算。
  3. 100% 没有错误预算,任何故障都越界;团队会为了避免“违规”而延迟发布、隐藏问题,也无法用预算做发布决策。

相关条目