SLI / SLO / 错误预算与事故响应与 Postmortem
0. 元信息
- 主题路径:
docs/topics/observability-and-sre/subtopics/slo-and-incident-response/README.md - 父主题:
observability-and-sre - 主分类:工程技术
- 辅助分类:项目与职业能力
- 适合对象:理解三支柱、能写后端服务、想做值班与事故响应的开发者
- 建议周期:1~2 周(每周 8~10 小时,含 1 次模拟事故)
- 前置知识:
observability-and-sre父主题;metrics-logs-traces;Prometheus / Grafana 基础 - 最终目标:能为一个服务定义 SLI / SLO 与错误预算、设计 burn rate 多窗口告警、在事故中担任 IC 写 Postmortem
1. 学习路线
SLI / SLO / SLA 三者区别
→ 选 SLI(可用性 / 延迟 / 吞吐)
→ 4 个 9 反推月度预算
→ burn rate 单窗口与多窗口
→ Prometheus 多窗口告警规则
→ 告警分级(Sev 1~4)+ 抑制 / 静音
→ on-call 轮值与疲劳治理
→ Incident Response(IC / Comms / Ops / Postmortem)
→ blameless Postmortem 与 action items
2. 阶段周数分配(34 周,每天 1.52 小时)
精简子主题按”SLO → 告警 → 响应 → 复盘”四段推进。
| 阶段 | 主题 | 周数 | 备注 |
|---|---|---|---|
| 1 | SLI / SLO / SLA 与错误预算 | 0.5 周 | 4 个 9 反推预算 |
| 2 | burn rate 与多窗口告警 | 1 周 | Prometheus 多窗口规则 |
| 3 | 告警分级与 on-call | 0.5 周 | Sev 1~4 / 抑制 / 静音 |
| 4 | Incident Response 流程 | 1 周 | IC / Comms / Ops |
| 5 | blameless Postmortem | 0.5 周 | action items 跟踪 |
| 6 | 综合演练(真实告警 + 复盘) | 1 周 | 含 README + 复盘 |
选 3 周方案时把第 4/5 阶段压成 1 周。每周留 0.5 天复盘。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1 | SLI / SLO / SLA | 一份对比表 + 公式 | 能解释三者边界 |
| 2 | 选 SLI | 3 个 SLI(可用性 / 延迟 / 吞吐) | 能用 histogram_quantile 算 P99 |
| 3 | 4 个 9 反推 | 月度预算表 | 能算 (1 - 99.9%) × 月分钟 = 43.2m |
| 4 | burn rate 单窗口 | 一条 PromQL burn rate | 能讲清「燃烧速度」 |
| 5 | burn rate 多窗口 | 1h + 6h + 24h + 3d 多窗口告警 | 4 条 alert rule |
| 6 | 告警分级 | Sev 1~4 + 抑制规则 | Alertmanager 路由配置 |
| 7 | on-call 轮值 | 值班表 + 疲劳治理 | Sev 1 / Sev 2/3 区分 |
| 8 | Incident Response | IC / Comms / Ops / 状态页 | 模拟一次 30 分钟 IC |
| 9 | Postmortem | blameless 时间线 + action items | 1 份 Postmortem |
关键陷阱:SLO 设完不看板;Postmortem 写成追责;on-call 噪声淹没;告警不分级;burn rate 阈值随手设。
4. 第一周任务
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 用公式 (1 - SLO) × 月分钟算 4 个 9 预算 | 一份预算表 |
| Day 2 | 写 PromQL histogram_quantile(0.99, ...) 算 P99 | 一条 PromQL |
| Day 3 | 写 burn rate 多窗口告警(Google SRE Workbook 模板) | 4 条 alert rule |
| Day 4 | 配置 Alertmanager 路由 / 抑制 / 静音 | Alertmanager 配置 |
| Day 5 | 设计值班表 + 告警分级表 | 值班表 + Sev 表 |
| Day 6 | 写 IR 流程(IC / Comms / Ops)一页文档 | IR 流程文档 |
| Day 7 | 步骤 A:跑通「最小 SLO + 告警 + IR」闭环;步骤 B:模拟 1 次 P0 事故,写 Postmortem | 闭环 + Postmortem |
5. 阶段通用验收
- 不看答案独立写出 SLO 文档与告警规则;
- 用自己的话解释 SLI / SLO / SLA;
- 画一张图:SLI → SLO → 错误预算 → burn rate → 告警;
- 测试正常路径、burn rate 超阈值、Sev 1 事故;
- 至少准备 3 组自定义 SLI;
- 记录 P99、错误率、SLO 命中率、预算剩余;
- 能修改既有服务加 SLO、加告警、加 Postmortem。
6. 最终验收
- 独立画出 SLO → burn rate → 告警时序图;
- 完成至少 6 个实验;
- 主持 30 分钟 IC 会议;
- 写 1 份 blameless Postmortem。
7. 综合项目
为微服务 Demo 定义 3 个 SLO(API 可用性 99.9% / API P99 < 500ms / Worker 错误率 < 1%)、设计 burn rate 告警、模拟一次 Sev 1 事故、写 Postmortem。成果合入父主题首选综合项目。
本主题贡献
SLO 不是写完就完事,burn rate 多窗口告警 + IC 分工 + blameless Postmortem 才让错误预算真生效。本子主题专门补齐”4 个 9 怎么反推预算”、“多窗口 burn rate 阈值怎么选”、“IC / Comms / Ops 三角色怎么演练”三件 SRE 必答题,并把 Sev 分级 + Alertmanager 抑制做成可落地的告警降噪闭环。
3 职责
- 用 SLI 公式(availability / latency / throughput)选 3 个核心 SLI,按 (1 - SLO) × 月分钟反推错误预算。
- 用 burn rate 多窗口告警(1h + 6h + 24h + 3d)覆盖快/慢燃烧场景,配 Alertmanager 路由 + 抑制 + 静音。
- 主导一次 Sev 1 IC(IC / Comms / Ops 分工),写 1 份 blameless Postmortem,action items 带 DRI + deadline。
4 交付物
- 一份 SLO 文档(3 个 SLI + 目标 + 月度预算 + burn rate 阈值表),含 (1 - SLO) × 月分钟公式与 99.9% / 99.99% 预算对比。
- 一份 Prometheus 多窗口告警规则(Google SRE Workbook 模板,1h×14.4 / 6h×6 / 24h×1 / 3d×1),含
histogram_quantile算 P99 SLI。 - 一份 Alertmanager 路由 + 抑制(page vs ticket 分流),含 Sev 1/2/3/4 值班表与 on-call fatigue 治理规则。
- 一份 Postmortem(时间线 / 影响 / 5 Whys / action items with DRI),含 blameless 文化要点与 action items 跟踪闭环。
3 指标
- SLO 命中率 ≥ 99.9%(30 天滚动窗口 burn rate < 1)。
- burn rate 多窗口告警误报率 < 5%(页告警真阳性 / 总页告警)。
- Postmortem action items 闭环率 ≥ 80%(deadline 内完成 / 总 action items)。
Google SRE Book、Google SRE Workbook、Rob Ewaschuk: Implementing SLOs、Prometheus Alerting Rules。复制前核对 LICENSE。
8. 推荐资料
Google SRE Book、Google SRE Workbook、Rob Ewaschuk: Implementing SLOs、Prometheus Alerting Rules。复制前核对 LICENSE。
9. 学习资料汇聚(v0.3 自包含)
9.1 背景与动机
SRE(Site Reliability Engineering)2003 年由 Google 创立。SLO(Service Level Objective)是 SRE 的核心创新:用 SLI 量化服务、用 SLO 设目标、用 Error Budget 把业务决策与技术决策绑定。4 个 9(99.99%)对应的月度预算是 4.3 分钟,这迫使团队认真权衡可用性与发布速度。
事故响应(Incident Response)是 SRE 第二大实践:明确 IC(Incident Commander)角色、Comms(通信)、Ops(操作)分工,避免多人抢麦克风。Postmortem(事后分析)blameless 文化来自 NASA 与医疗事故复盘,目的是追责系统而非个人。
今天 SLO 与 IR 已是分布式系统团队的事实标准。
9.2 概念地图
flowchart LR
SLI[SLI: 延迟 / 错误率 / 吞吐] --> SLO[SLO: 99.9%]
SLO --> Budget[Error Budget = (1 - SLO) × 月分钟]
Budget --> Burn[burn rate = 当前 / 预算]
Burn --> Alert[Burn Rate 多窗口告警]
Alert --> IC[IC 启动]
IC --> Comms[状态页 / Slack #incident]
IC --> Ops[Ops 修复]
Ops --> Resolve[解决]
Resolve --> PM[Postmortem]
PM --> ActionItems[Action Items with DRI]
ActionItems -.防止复发.-> SLI
9.3 基础知识讲解
9.3.1 论文 / 规范
| 资料 | 用法 |
|---|---|
| Google, SRE Book | 第 1~4 章 |
| Google, SRE Workbook | 第 4~5 章 |
| Rob Ewaschuk, Implementing SLOs | SLO 反推 4 个 9 |
9.3.2 书
| 书 | 用法 |
|---|---|
| Betsy Beyer et al., SRE Book | 第 1 |
| Niall Murphy et al., SRE Workbook | IR / Postmortem |
9.3.3 博客 / 文档
| 资料 | 用法 |
|---|---|
| Google SRE Blog | 一手 Postmortem |
| Prometheus Alerting | 多窗口模板 |
| Grafana SLO 文档 | SLO 看板 |
9.3.4 人物
| 人物 | 关注点 |
|---|---|
| Ben Treynor Sloss | Google SRE 创始人 |
| Rob Ewaschuk | SLO 反推 4 个 9 |
| Betsy Beyer | SRE Book 编辑 |
| Niall Murphy | SRE Workbook |
9.3.5 方法
- SLI-first:先选 SLI 再设 SLO;
- Multi-window burn rate:1h + 6h + 24h + 3d;
- Blameless Postmortem:追系统不追人;
- Action items with DRI:每条有负责人 + deadline;
- Sev-based routing:Sev 1 走 PagerDuty,Sev 2/3 走 Slack。
9.3.6 重点训练材料
- SRE Book 第 1
4 + 811 章 - SRE Workbook 第 4~5 章
- Rob Ewaschuk Implementing SLOs
- Prometheus 多窗口告警模板
9.4 经典问题与经典案例
| # | 问题 | 最简答案 |
|---|---|---|
| 1 | SLI 怎么选 | 延迟 / 错误率 / 饱和度 |
| 2 | 4 个 9 怎么算 | (1 - SLO) × 月分钟 |
| 3 | burn rate 怎么算 | 当前错误率 / SLO 错误率 |
| 4 | 多窗口怎么设 | 1h + 6h + 24h + 3d |
| 5 | Sev 怎么分 | 影响 × 紧急 × 范围 |
| 6 | IC 谁当 | 按服务 ownership 轮值 |
| 7 | Postmortem 怎么写 | 时间线 + 影响 + 根因 + action items |
| 8 | blameless 怎么落地 | 培训 + 模板 + 评审 |
| 9 | on-call 疲劳怎么治 | Sev 1 值班轮值 + 噪声抑制 |
| 10 | 预算耗尽怎么办 | 暂停非必要 feature 发布 |
9.5 学习难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| SLI 公式选错 | 业务指标理解偏差 | 用 RED + 业务对话 |
| burn rate 多窗口 | 公式复杂 | 用 SRE Workbook 模板 |
| Postmortem blameless | 文化阻力 | 培训 + 评审 + 模板 |
| IC 角色冲突 | 多人抢决策 | 明确分工 + 演练 |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 版本 | 组织 | 状态 |
|---|---|---|---|
| SLI / SLO / Error Budget | 概念 | Google SRE | 公开 |
| Alertmanager | 0.27+ | Prometheus | 活跃 |
| PagerDuty / OpsGenie | SaaS | 商用 | 闭源 |
9.6.2 Scope
SLO 是量化锚点;Alertmanager 是路由与抑制;Postmortem 是反馈环。
9.6.3 Structure
Prometheus 告警规则:expr + for + labels + annotations。Alertmanager 配置:route / inhibit_rules / silence。Postmortem 模板:时间线 + 影响 + 根因 + action items。
9.6.4 Ecosystem
告警:Alertmanager / PagerDuty / OpsGenie / Grafana Alerting。事故管理:incident.io / FireHydrant。Postmortem:Confluence / Notion。
9.6.5 Depth Tiers
| 层级 | 能力 |
|---|---|
| L0 | 知道 SLI / SLO |
| L1 | 能读懂 SLO 文档 |
| L2 | 能写 SLO + 告警规则 |
| L3 | 能主持 IR + 写 Postmortem |
| L4 | 能设计 SLO 体系与事故管理流程 |
本子主题目标:L3。
9.6.6 Source
- Google SRE Book
- Google SRE Workbook
- Prometheus Alerting
- 引用版本快照日期:2026-07-30。
10. 常见误区
- SLO 设完不看板;
- Postmortem 写成追责报告;
- on-call 噪声淹没;
- 告警不分级;
- burn rate 阈值随手设;
- IC 没人主导,会议拉跨;
- 错误预算耗尽也不停 feature;
- blameless 文化缺失;
- action items 没 DRI;
- 不复盘。
11. 所有知识点分类(统一规则)
- 编程语言;2. 数据结构与算法;3. 计算机基础;4. 工程技术;5. Web 与后端;6. 前端与客户端;7. 数据与人工智能;8. 项目与职业能力;9. 安全与可靠性。
本计划归属:工程技术 主 + 项目与职业能力 / 安全与可靠性 辅。
代码块 1:Prometheus 多窗口 burn rate 告警
# alerts/slo_burnrate.yaml
groups:
- name: slo.burnrate
rules:
- alert: SLO_BurnRate_High
expr: |
(
sum(rate(http_requests_total{job="api",status=~"5..",code!~"5xx-noisy"}[1h]))
/
sum(rate(http_requests_total{job="api"}[1h]))
) > (14.4 * 0.001)
and
(
sum(rate(http_requests_total{job="api",status=~"5..",code!~"5xx-noisy"}[6h]))
/
sum(rate(http_requests_total{job="api"}[6h]))
) > (14.4 * 0.001)
for: 2m
labels: { severity: page, slo: api-availability }
annotations:
summary: "API SLO burn rate 14.4x over 1h+6h"
runbook: "https://wiki/runbooks/slo-api-availability"
- alert: SLO_BurnRate_Medium
expr: |
(
sum(rate(http_requests_total{job="api",status=~"5.."}[24h]))
/
sum(rate(http_requests_total{job="api"}[24h]))
) > 1
for: 5m
labels: { severity: ticket, slo: api-availability }
代码块 2:Alertmanager 路由 + 抑制
# alertmanager.yml
route:
receiver: 'default'
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
routes:
- matchers: [{ severity = "page" }]
receiver: 'pagerduty'
group_wait: 10s
- matchers: [{ severity = "ticket" }]
receiver: 'slack-tickets'
inhibit_rules:
- source_matchers: [severity="page"]
target_matchers: [severity="ticket"]
equal: ['alertname', 'cluster']
receivers:
- name: 'default'
slack_configs: [{ api_url: 'https://hooks.slack.com/...', channel: '#alerts' }]
- name: 'pagerduty'
pagerduty_configs: [{ service_key: '...' }]
- name: 'slack-tickets'
slack_configs: [{ channel: '#tickets' }]
代码块 3:Postmortem 模板
# Postmortem: <incident title>
Date: 2026-07-31
Authors: <IC>, <Comms Lead>
Status: Draft / Reviewed / Final
## Summary
一两句描述事故。
## Impact
- 用户影响:N 个用户 / M 分钟
- SLO 影响:消耗 X% 错误预算
- 业务影响:订单/营收
## Timeline (UTC)
- T+0 检测
- T+2m IC 上线
- T+5m 缓解(回滚)
- T+12m 解决
- T+30m 状态页恢复
## Root Cause
5 Whys + 故障树。
## What Went Well
- IC 决策快
- Runbook 完整
## What Went Wrong
- 检测延迟 2m
- 回滚脚本过期
## Action Items
| ID | Action | DRI | Deadline | Status |
|---|---|---|---|---|
| A1 | 升级告警检测 | @alice | 2026-08-15 | open |
| A2 | 回滚脚本重写 | @bob | 2026-08-30 | open |
代码块 4:SLO 文档示例
# slo/api-availability.yaml
service: api
description: API HTTP 5xx 错误率低于 0.1%
slis:
- name: availability
spec:
type: http_5xx_ratio
threshold: 0.001
slo:
target: 0.999
window: 30d
error_budget:
total_minutes: 43.2 # (1 - 0.999) × 30 × 24 × 60
burn_rate_alerts:
- window: 1h
threshold: 14.4 # 2% 预算 / 5 分钟
- window: 6h
threshold: 6