【可观测性工程】SLO 工程:错误预算、Burn Rate、多窗口多燃烧率告警

💡 原文中文,约22200字,阅读约需53分钟。
📝

内容提要

本文介绍SLO工程实践,核心是错误预算与Burn Rate告警。文章从SLI选择、错误预算计算、多窗口多燃烧率告警规则(3条Page+3条Ticket)到组织落地,提供Prometheus模板。强调SLO价值在于驱动日常决策,通过案例说明慢性退化如何耗尽预算,并给出落地清单与常见坑点。

🔎

延伸解读

错误预算的“沉默消耗”陷阱

文章案例显示,SLO 的主要威胁并非单次大事故,而是低于告警阈值的持续小退化。例如 Q3 十二次小发布,每次 p99 漂移 10ms、错误率微升,均未触发 CPU 告警,但累计耗尽预算。这提醒团队:仅配置高燃烧率 Page 规则不足以覆盖慢性问题,必须搭配长窗口低燃烧率的 Ticket 规则,并让预算剩余可见于日常决策。

多窗口多燃烧率告警的平衡逻辑

Google SRE Workbook 的 6 条规则(3 Page + 3 Ticket)通过短窗口高阈值抓突发、长窗口低阈值抓慢性退化,并设置 for 子句抑制瞬时尖峰。例如 1h 窗口 14.4× 燃烧率对应 2% 预算消耗,而 3d 窗口 1× 则对应持续 10% 消耗。这种设计在敏感性与误报率之间取得折中,避免告警疲劳或假安全感。

SLI 定义中的常见误区

文章强调可用性 SLI 应排除 429、401/403 等非服务端错误,并纳入超时;延迟 SLI 必须使用分位数而非均值,否则尾部退化无感。此外,SLI 数量宜控制在 2–4 个,过多等于没有。这些细节直接影响错误预算的准确性,若定义不当,可能导致预算被无关流量耗尽或掩盖真实故障。

SLO 落地的组织与流程要点

SLO 的价值在于驱动决策,因此需要书面化 Error Budget Policy,明确预算分区对应的发布策略(如剩余 <20% 冻结 feature),并建立月度评审会议。同时,Dashboard 应面向 PM/TL 设计,突出预算剩余和 Burn Rate 趋势,而非原始 PromQL。此外,告警规则需通过 promtool 校验并纳入 CI,避免静默失效。

Q&A

什么是错误预算?如何计算?

错误预算(Error Budget)是 SLO 的补集,即 1 减去 SLO 目标。例如,SLO 为 99.9% 时,错误预算为 0.1%,表示在 30 天滚动窗口内允许的失败请求比例。它用于控制发布节奏:预算充裕时可承担发布风险,预算紧张时冻结功能发布。

多窗口多燃烧率告警规则有哪些?

多窗口多燃烧率告警规则来自 Google SRE Workbook,共 6 条:3 条 Page 级(1h 窗口燃烧率≥14.4×、6h 窗口≥6×、3d 窗口≥1×)和 3 条 Ticket 级(6h、1d、3d 窗口燃烧率≥1×)。短窗口高燃烧率用于捕捉突发故障,长窗口低燃烧率用于捕捉慢性退化。

如何选择 SLI?一个服务应该定义几个 SLI?

SLI 是对服务某维度的实测值,如可用性、延迟、吞吐等。Google SRE Workbook 建议每个服务选择 2-4 个 SLI,过多会导致关注分散。选择时需根据服务类型确定,例如在线 API 关注可用性和延迟,批处理关注吞吐,存储关注持久性等。

SLO 与 SLA 有什么区别?

SLO 是服务内部设定的目标,如 30 天滚动窗口内可用性≥99.9%;SLA 是与客户签订的合同,违反时有经济赔偿等后果。SLO 通常比 SLA 更严格,以留出缓冲。SLO 由工程和产品团队关注,SLA 由法务和客户关注。

如何计算 Burn Rate?14.4 这个数字是怎么来的?

Burn Rate 是当前错误率与 SLO 允许错误率之比,公式为 error_rate / (1 - SLO)。14.4 来自 Google SRE Workbook:30 天有 720 小时,若 1 小时内以 14.4 倍速度消耗预算,则消耗 14.4/720 = 2% 的月预算,这是 Page 级告警的敏感度与误报率的折中。

SLO 工程中常见的坑有哪些?

常见坑包括:选 SLO 时不计算预算(如 99.9% 与 99.99% 预算差 10 倍);用均值代替分位数导致延迟退化无感;将 429 与 500 混算,导致预算被客户端限流烧掉;短窗口低燃烧率导致告警风暴;监控系统与业务同故障域导致 SLI 采集中断;各团队独立定义 SLO 无法相加等。

如何将 SLO 落地到组织?

落地步骤包括:选定 2-4 个 SLI 并文档化;与产品确认阈值;部署 Recording Rules 和告警规则;搭建 Grafana 面板展示预算剩余和 Burn Rate;制定书面 Error Budget Policy 并明确 override 流程;定期召开月度 SLO 评审会议;确保 Alertmanager 路由正确(Page 到 PagerDuty,Ticket 到 Jira)。

SLO 告警中 Page 和 Ticket 有什么区别?

Page 级告警用于紧急情况,需要立即响应,通常通过电话或 PagerDuty 通知值班人员;Ticket 级告警用于非紧急问题,通过 Jira 或 Slack 跟踪,不打扰 on-call。Page 规则使用短窗口高燃烧率(如 1h 14.4×),Ticket 规则使用长窗口低燃烧率(如 6h 1×)。

🏷️

标签

➡️

继续阅读