
SRE基础:SLO与错误预算
SLI、SLO与SLA
SLI(服务等级指标):服务行为的量化度量
示例:请求延迟、错误率、可用性、吞吐量
SLO(服务等级目标):SLI的目标值
示例:99.9%的请求在30天内响应时间<500ms
SLA(服务等级协议):具有后果的法律/商业合同
SLO是内部目标;SLA是对客户的承诺
SLO应比SLA更严格(为事故留出缓冲)

定义良好的SLI
# 可用性SLI
sli:
name: api_availability
description: 成功HTTP响应与总请求的比率
formula: count(http_requests{status!~"5.."}) / count(http_requests)
# 延迟SLI
sli:
name: api_latency
description: 快于阈值的请求比例
formula: histogram_quantile(0.99, http_request_duration_seconds)
threshold: 500ms
# 良好的SLI:
# - 可直接测量
# - 与用户满意度成正比
# - 数量不宜过多(每个服务3-5个)
设定SLO
常见的SLO级别:
99% = 每月7.3小时停机时间(3个9)
99.9% = 每月43.8分钟(3.5个9)
99.95% = 每月21.9分钟
99.99% = 每月4.3分钟(4个9)
从保守开始:
1. 测量当前性能
2. 将SLO设定为当前性能的95%
3. 随着可靠性提升逐步收紧
SLO示例:
- 99.9%的结账请求成功
- 99.5%的API响应时间<200ms(P99)
- 错误率<0.1%(1小时平均值)

错误预算
错误预算 = 1 - SLO
SLO = 99.9%可用性
错误预算 = 0.1% = 每月43.8分钟
如果发生了20分钟停机:
已消耗:20/43.8 = 45.6%的预算
剩余:54.4%(23.8分钟)
基于预算的策略:
> 50%剩余:自由部署,进行实验
< 50%剩余:放缓发布,聚焦可靠性
预算耗尽:冻结功能,仅做可靠性工作
基于Prometheus的SLO监控
# SLO:99.9%可用性,30天窗口
# 用于高效查询的记录规则
groups:
- name: slo_rules
interval: 30s
rules:
# 1分钟错误率
- record: slo:api_errors:rate1m
expr: rate(http_requests_total{status=~"5.."}[1m]) / rate(http_requests_total[1m])
# 1小时错误率
- record: slo:api_errors:rate1h
expr: rate(http_requests_total{status=~"5.."}[1h]) / rate(http_requests_total[1h])
# 30天可用性
- record: slo:api_availability:30d
expr: 1 - (rate(http_requests_total{status=~"5.."}[30d]) / rate(http_requests_total[30d]))

燃烧速率告警
# 多窗口、多燃烧速率告警
# 当错误预算消耗过快时告警
groups:
- name: slo_alerts
rules:
# 快速燃烧:1小时内消耗2%预算(立即分页)
- alert: SLOBurnRateFast
expr: |
(slo:api_errors:rate1h > 14.4 * 0.001) # 14.4倍燃烧速率
and
(slo:api_errors:rate5m > 14.4 * 0.001)
for: 2m
labels:
severity: critical
annotations:
summary: "SLO以14倍速率燃烧 - 1小时内耗尽预算"
# 慢速燃烧:6小时内消耗5%预算(工单)
- alert: SLOBurnRateSlow
expr: |
(slo:api_errors:rate6h > 6 * 0.001)
and
(slo:api_errors:rate30m > 6 * 0.001)
for: 15m
labels:
severity: warning
annotations:
summary: "SLO以6倍速率燃烧 - 5天内耗尽预算"
错误预算策略
## 错误预算策略
**SLO**:99.9% API可用性(每月43.8分钟预算)
**预算健康时(剩余>50%)**:
- 每天多次部署
- 运行实验和A/B测试
- 接受新功能带来的可靠性风险
**预算有风险时(剩余10-50%)**:
- 代码冻结,除非关键修复
- 基础设施变更需双重审查
- 对重大事故进行事后复盘
**预算耗尽时(剩余<0%)**:
- 完全冻结功能
- 所有工程时间投入可靠性
- 每周与工程领导层评审
SLO将可靠性从一种感觉转变为可衡量的工程约束。