SLO(Service Level Objective)是SRE工程体系的核心实践,通过量化服务可靠性目标,将可用性从模糊的”高可用”描述转化为可测量、可管理的工程指标。SLO框架将服务可用性与错误预算结合,在可靠性和迭代速度之间建立明确的决策机制。Google SRE实践中,SLO驱动的告警体系可减少70%以上的无效告警,让工程团队聚焦于真正影响用户体验的事件。
SLO与SLI指标设计:从业务影响到技术度量
SLO落地第一步是定义SLI(Service Level Indicator),即可量化的服务质量指标。SLI设计遵循”用户视角”原则,从用户实际体验出发选择指标,而非从系统内部视角。常见SLI指标类型包括:
# SLI定义示例(YAML格式)
sli_definitions:
- name: request_success_rate
description: "成功HTTP响应占比"
metric: |
sum(rate(http_requests_total{status!~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
target: 0.999 # 99.9%成功率
- name: request_latency_p99
description: "P99请求延迟"
metric: |
histogram_quantile(0.99,
rate(http_request_duration_seconds_bucket[5m]))
target: 0.5 # 500ms以内
- name: availability
description: "服务可用性"
metric: |
1 - (
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
)
target: 0.9995 # 99.95%可用性
SLI指标选择要避免两个陷阱:一是过度关注平均值,P99/P999尾部延迟更能反映用户体验;二是指标过多,每个服务控制在3至5个核心SLI,覆盖可用性、延迟和吞吐三个维度即可。
错误预算计算与燃烧率告警机制
错误预算是SLO框架的核心概念。如果SLO目标为99.9%可用性,则30天窗口内的错误预算为:30天 x 24小时 x 3600秒 x 0.1% = 2592秒。只要服务不可用时间不超过2592秒,就未违反SLO。错误预算为工程团队提供了明确的发版节奏依据:预算充足时可以快速迭代上线,预算耗尽时必须暂停发版修复稳定性问题。
# 错误预算计算
window = 30 * 24 * 60 * 60 # 30天,单位秒
slo_target = 0.999
error_budget = window * (1 - slo_target)
print(f"30天错误预算: {error_budget}秒 = {error_budget/60:.1f}分钟")
# 输出: 30天错误预算: 2592.0秒 = 43.2分钟
# 多窗口错误预算消耗速率
# 短窗口(1小时)和长窗口(6小时)双重判断
# 避免短期波动误报,同时保证快速响应
燃烧率(Burn Rate)是错误预算消耗速度的度量指标。燃烧率=1表示按SLO允许的速度消耗错误预算,燃烧率=10表示消耗速度是预算的10倍,若持续则会在窗口结束前耗尽预算。基于燃烧率的多窗口告警策略是Google SRE推荐的标准方案:
# Prometheus告警规则:多窗口多燃烧率
groups:
- name: slo-alerts
rules:
# 快速燃烧告警:1小时内消耗2%月度预算
- alert: HighErrorRateFastBurn
expr: |
(
sum(rate(http_requests_total{status=~"5.."}[1h]))
/
sum(rate(http_requests_total[1h]))
) > (14.4 * 0.001)
and
(
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
) > (14.4 * 0.001)
for: 2m
labels:
severity: critical
slo_severity: page
annotations:
summary: "快速燃烧告警:1小时和5分钟窗口错误率均超阈值"
description: "燃烧率14.4,预计1小时内消耗2%月度错误预算"
# 慢速燃烧告警:6小时内消耗5%月度预算
- alert: HighErrorRateSlowBurn
expr: |
(
sum(rate(http_requests_total{status=~"5.."}[6h]))
/
sum(rate(http_requests_total[6h]))
) > (6 * 0.001)
and
(
sum(rate(http_requests_total{status=~"5.."}[1h]))
/
sum(rate(http_requests_total[1h]))
) > (6 * 0.001)
for: 15m
labels:
severity: warning
slo_severity: ticket
annotations:
summary: "慢速燃烧告警:6小时和1小时窗口错误率均超阈值"
description: "燃烧率6.0,预计6小时内消耗5%月度错误预算"
多窗口策略的核心思路:短窗口(5分钟/1小时)用于快速检测突发事件触发Page告警,长窗口(1小时/6小时)用于检测持续性问题触发Ticket工单。两个窗口同时满足条件才告警,有效减少短期波动的误报。
SLO仪表盘与错误预算可视化
SLO仪表盘需要展示当前可用性、错误预算消耗比例和燃烧率趋势。使用Grafana搭建SLO仪表盘的核心面板配置:
# Grafana面板JSON片段 - 错误预算消耗
{
"title": "错误预算消耗",
"type": "gauge",
"datasource": "Prometheus",
"targets": [{
"expr": "1 - (slo_error_budget_remaining)",
"legend": "已消耗预算比例"
}],
"fieldConfig": {
"defaults": {
"min": 0,
"max": 1,
"thresholds": {
"steps": [
{"color": "green", "value": 0},
{"color": "yellow", "value": 0.5},
{"color": "red", "value": 0.8}
]
}
}
}
}
# 错误预算剩余计算PromQL
# 30天窗口SLO剩余预算
1 - (
sum(rate(http_requests_total{status=~"5.."}[30d]))
/
sum(rate(http_requests_total[30d]))
) / (1 - 0.999)
SLO仪表盘的三个核心面板:可用性趋势(折线图对比SLO目标线和实际值)、错误预算消耗(仪表盘展示消耗百分比)、燃烧率趋势(柱状图展示多窗口燃烧率变化)。仪表盘按服务维度过滤,支持查看每个微服务的SLO达成状态。
SLO评审流程与持续优化机制
SLO不是一次性的设置工作,需要建立定期评审机制。Google推荐每月进行一次SLO评审,由SRE团队和产品团队共同参与,评审内容包括:
SLO月度评审清单:
1. SLO达成率统计
- 本月可用性是否达成SLO目标
- 错误预算消耗比例和消耗趋势
- 违约事件根因分析
2. SLO目标合理性评估
- 用户投诉量与SLO达成情况的关联
- 当前SLO目标是否过严或过松
- 是否需要调整SLO目标值
3. 告警有效性评估
- 告警数量趋势(期望逐月减少)
- 告警准确率(触发后确实存在问题的比例)
- 无效告警根因分析和优化
4. 错误预算决策执行
- 预算剩余是否允许下月正常发版
- 是否需要冻结发版集中修复稳定性
- 冻结发版的解除条件
SLO目标设定需要迭代调整。初始阶段可以参考行业基准(如99.9%可用性),运行3至6个月后根据实际数据调整:如果连续3个月SLO达成且用户无投诉,可考虑降低SLO目标释放更多发版预算;如果频繁违约且用户投诉增加,则需要提高SLO目标并增加稳定性投入。SLO框架的最终目标是建立数据驱动的可靠性决策机制,而非追求绝对的高可用数字。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/slo-fu-wu-deng-ji-mu-biao-she-ji-shi-zhan-cuo-wu-yu-suan-yu/