服务等级目标与错误预算的制定方法
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 校验。
合上页面,先回答,再展开对照。