name: slo-sli-error-budget description: 在定义SLOs、选择SLIs或实施错误预算政策时使用。涵盖可靠性目标、SLI选择和错误预算管理。 allowed-tools: Read, Glob, Grep
SLOs、SLIs和错误预算
定义服务级别目标、选择有意义的指标以及通过错误预算管理可靠性的模式和实践。
何时使用此技能
- 为服务定义SLOs
- 选择适当的SLIs
- 实施错误预算政策
- 平衡可靠性和速度
- 设置基于SLO的警报
核心概念
SLI(服务级别指标)
SLI = 服务级别的定量测量
测量内容:
- 可用性:% 成功请求
- 延迟:% 请求快于阈值
- 吞吐量:每秒请求数
- 错误率:% 失败请求
公式:
SLI = (良好事件 / 总事件) × 100%
示例:
可用性SLI = (成功请求 / 总请求) × 100%
= (99,500 / 100,000) × 100%
= 99.5%
SLO(服务级别目标)
SLO = SLI的目标值
格式:SLI >= 目标值 在时间窗口内
示例:
- 99.9% 的请求在30天内成功
- 95% 的请求在7天内完成时间 <200ms
- 99.95% 可用性按月测量
组件:
┌─────────────────────────────────────────────────────┐
│ SLO = SLI + 目标值 + 时间窗口 │
│ │
│ "99.9% 的HTTP请求返回非5xx响应 │
│ 在滚动30天窗口内" │
└─────────────────────────────────────────────────────┘
错误预算
错误预算 = 允许的不可靠性
如果SLO = 99.9% 可用性:
错误预算 = 100% - 99.9% = 0.1%
超过30天:
总分钟数 = 30 × 24 × 60 = 43,200
错误预算 = 43,200 × 0.001 = 43.2分钟
或以请求计(假设每月100万请求):
错误预算 = 1,000,000 × 0.001 = 1,000个失败请求
预算消耗:
┌────────────────────────────────────────────────────┐
│ 剩余错误预算:65% │
│ ████████████████████░░░░░░░░░░ │
│ 已消耗:35% (15分钟 / 43.2分钟) │
│ 窗口中剩余天数:12 │
└────────────────────────────────────────────────────┘
选择SLIs
SLI类别
1. 基于请求的SLIs:
- 可用性(成功率)
- 延迟(响应时间)
- 质量(正确响应率)
2. 基于处理的SLIs:
- 吞吐量
- 新鲜度(数据陈旧度)
- 覆盖率(% 数据处理)
3. 基于存储的SLIs:
- 持久性
- 数据可用性
SLI选择框架
针对每个用户旅程:
1. 识别关键交互
└── 用户关心什么?
2. 映射到可测量信号
└── 我们可以测量什么?
3. 定义好与坏
└── 什么是可接受的?
4. 与用户/利益相关者验证
└── 这符合期望吗?
良好SLI特征
✅ 良好SLIs:
- 直接反映用户体验
- 可测量和可观察
- 简单易懂
- 违反时可采取行动
❌ 不良SLIs:
- 内部指标(CPU、内存)
- 太复杂难以解释
- 无法可靠测量
- 没有清晰的好/坏阈值
按服务类型SLI示例
API服务:
- 可用性:% 非5xx响应
- 延迟:% 请求 < 200ms
- 质量:% 有效响应
数据管道:
- 新鲜度:% 数据 < 10分钟旧
- 覆盖率:% 记录处理
- 正确性:% 匹配预期
存储服务:
- 持久性:% 对象未丢失
- 可用性:% 成功读取
- 延迟:% 读取 < 50ms
Web应用程序:
- 页面加载:% 页面 < 3秒
- 交互性:% 交互 < 100ms
- 核心Web指标:LCP、FID、CLS
设置SLO目标
目标选择方法
1. 测量当前性能:
基线是什么?
2. 理解用户期望:
用户需要什么?
3. 考虑业务约束:
可靠性的成本是什么?
4. 从保守开始:
最好超过而非错过
5. 基于数据迭代:
随着学习调整
SLO目标指南
服务类型 | 可用性 | 延迟(p99)
--------------------|--------------|---------------
内部API | 99.5% | 500ms
外部API | 99.9% | 200ms
支付系统 | 99.99% | 300ms
静态内容 | 99.95% | 100ms
批处理 | 99% | -
"九"级标尺:
99% = 每月7.2小时停机
99.9% = 每月43.8分钟
99.99% = 每月4.38分钟
时间窗口
滚动 vs 日历:
滚动(推荐):
- 30天滚动窗口
- 平滑,无悬崖效应
- 始终相关
日历:
- 每月重置
- 与业务周期对齐
- 创建"预算重置"行为
窗口选择:
短(7天):更敏感,反馈更快
长(30天):更稳定,趋势更平滑
错误预算政策
政策组件
错误预算政策定义:
1. 何时采取行动
└── 预算阈值(75%、50%、25%、0%)
2. 采取什么行动
└── 冻结功能、专注于可靠性
3. 谁决定
└── 团队、管理层、升级路径
4. 如何恢复
└── 恢复预算的步骤
示例政策
OrderService的错误预算政策
剩余预算 | 所需行动
-----------------|------------------------------------------
> 50% | 正常开发、自由部署
25-50% | 审查部署、增加测试
10-25% | 冻结非关键功能
< 10% | 全员专注于可靠性、无新功能
0%(耗尽) | 需要事后分析、领导审查
升级:
- 预算 < 25%:提醒团队领导
- 预算 < 10%:提醒工程经理
- 预算耗尽:宣布事件
预算恢复
当预算耗尽时:
1. 停止非关键部署
2. 专注于稳定性改进
3. 进行彻底的事后分析
4. 实施预防措施
5. 预算恢复时恢复正常工作
预算恢复通过:
- 时间流逝(滚动窗口)
- 可靠性改进
- SLO调整(如果合适)
多窗口SLOs
为何多窗口?
单窗口问题:
- 长窗口:检测问题慢
- 短窗口:对峰值太敏感
解决方案:多窗口
快速消耗:短窗口(1小时)
- 快速检测重大中断
- 高紧急警报
缓慢消耗:长窗口(30天)
- 检测逐渐退化
- 低紧急度、更多上下文
多窗口配置
警报配置:
快速消耗(立即寻呼):
- 30天预算在1小时内消耗2%
- 30天预算在6小时内消耗5%
缓慢消耗(工单):
- 30天预算在3天内消耗10%
- 30天预算在7天内消耗20%
计算:
如果30天预算 = 43.2分钟
1小时内2% = 0.864分钟 = 52秒错误
→ 重大中断,立即寻呼
基于SLO的警报
警报设计
传统警报:
- CPU > 80% → 警报
- 错误率 > 1% → 警报
- 延迟 > 500ms → 警报
→ 常常嘈杂,可能不反映用户影响
基于SLO的警报:
- 错误预算消耗率太高 → 警报
→ 直接与用户影响挂钩
→ 更少、更有意义的警报
消耗率计算
消耗率 = 预算消耗速率
如果预算应持续30天:
正常消耗率 = 1x(每天消耗3.33%)
快速消耗率 = 14.4x
→ 每天消耗48% → 2天内耗尽
→ 寻呼:重大事件
缓慢消耗率 = 3x
→ 每天消耗10% → 10天内耗尽
→ 工单:需要关注
仪表板设计
显示的关键指标
SLO仪表板组件:
1. 当前SLI值
└── "99.85%可用性(目标:99.9%)"
2. 剩余错误预算
└── 带阈值的条形图
3. 消耗率趋势
└── 随时间线图
4. 预算耗尽时间
└── "按当前速率:15天"
5. 历史SLO合规性
└── 我们多久满足SLO?
6. 关键错误贡献者
└── 什么在消耗预算?
可视化示例
┌─────────────────────────────────────────────────────┐
│ OrderService SLO仪表板 │
├─────────────────────────────────────────────────────┤
│ 可用性SLI:99.87% 目标:99.9% ⚠️ │
│ ██████████████████████████████████████░░░░ 99.87% │
│ │
│ 错误预算(30天): │
│ ████████████████░░░░░░░░░░░░░░ 55%剩余 │
│ 已消耗:19.4分钟 / 43.2分钟 │
│ │
│ 消耗率:1.3x(轻微超支) │
│ ──────────────────────────────── │
│ ↑ 现在 │
│ │
│ 顶部预算消耗者: │
│ 1. 数据库超时(8.2分钟) │
│ 2. 支付网关错误(5.1分钟) │
│ 3. 速率限制(3.8分钟) │
└─────────────────────────────────────────────────────┘
实施检查表
入门
1. [ ] 识别关键用户旅程
2. [ ] 为每个旅程定义SLIs
3. [ ] 设置初始SLO目标(保守)
4. [ ] 实施SLI测量
5. [ ] 创建错误预算跟踪
6. [ ] 设置消耗率警报
7. [ ] 创建SLO仪表板
8. [ ] 定义错误预算政策
9. [ ] 与利益相关者沟通
10. [ ] 基于学习迭代
常见陷阱
1. SLOs太多
→ 专注于3-5个关键SLOs
2. 不切实际的目标
→ 从可实现的开始,随时间收紧
3. 内部指标作为SLIs
→ 使用面向用户的指标
4. 没有错误预算政策
→ 政策使SLOs可操作
5. 直接基于SLI警报
→ 基于消耗率警报
最佳实践
1. 以用户为中心的SLIs
测量用户体验
2. 保守的初始目标
最好超过而非错过
3. 文档化的错误预算政策
每个人都知道规则
4. 定期SLO审查
季度审查和调整
5. 无责文化
专注于学习,而非责备
6. 自动化跟踪
SLI/SLO计算必须可靠
相关技能
observability-patterns- 指标和监控distributed-tracing- 基于跟踪的SLIsincident-response- 在事件中使用SLOs