SLO实施Skill slo-implementation

这个技能专注于服务级别指标(SLI)和服务级别目标(SLO)的定义与实施,包括错误预算计算和警报设置。用于建立可靠性目标、实施站点可靠性工程(SRE)实践,以及测量服务性能。关键词:SLO, SLI, 错误预算, 可靠性, 监控, 警报, Prometheus, Grafana, SRE。

DevOps 0 次安装 0 次浏览 更新于 3/22/2026

name: slo-implementation description: 定义和实施服务级别指标(SLI)和服务级别目标(SLO),包括错误预算和警报。用于建立可靠性目标、实施站点可靠性工程(SRE)实践或测量服务性能。

SLO实施

定义和实施服务级别指标(SLI)、服务级别目标(SLO)和错误预算的框架。

目的

使用SLI、SLO和错误预算实施可衡量的可靠性目标,以平衡可靠性和创新速度。

何时使用

  • 定义服务可靠性目标
  • 测量用户感知的可靠性
  • 实施错误预算
  • 创建基于SLO的警报
  • 跟踪可靠性目标

SLI/SLO/SLA层次结构

SLA (服务级别协议)
  ↓ 与客户的合同
SLO (服务级别目标)
  ↓ 内部可靠性目标
SLI (服务级别指标)
  ↓ 实际测量

定义SLI

常见SLI类型

1. 可用性SLI

# 成功请求 / 总请求
sum(rate(http_requests_total{status!~"5.."}[28d]))
/
sum(rate(http_requests_total[28d]))

2. 延迟SLI

# 低于延迟阈值的请求 / 总请求
sum(rate(http_request_duration_seconds_bucket{le="0.5"}[28d]))
/
sum(rate(http_request_duration_seconds_count[28d]))

3. 持久性SLI

# 成功写入 / 总写入
sum(storage_writes_successful_total)
/
sum(storage_writes_total)

参考: 参见 references/slo-definitions.md

设置SLO目标

可用性SLO示例

SLO % 每月停机时间 每年停机时间
99% 7.2小时 3.65天
99.9% 43.2分钟 8.76小时
99.95% 21.6分钟 4.38小时
99.99% 4.32分钟 52.56分钟

选择合适的SLO

考虑因素:

  • 用户期望
  • 业务需求
  • 当前性能
  • 可靠性成本
  • 竞争对手基准

示例SLO:

slos:
  - name: api_availability
    target: 99.9
    window: 28d
    sli: |
      sum(rate(http_requests_total{status!~"5.."}[28d]))
      /
      sum(rate(http_requests_total[28d]))

  - name: api_latency_p95
    target: 99
    window: 28d
    sli: |
      sum(rate(http_request_duration_seconds_bucket{le="0.5"}[28d]))
      /
      sum(rate(http_request_duration_seconds_count[28d]))

错误预算计算

错误预算公式

错误预算 = 1 - SLO目标

示例:

  • SLO: 99.9% 可用性
  • 错误预算: 0.1% = 43.2分钟/月
  • 当前错误: 0.05% = 21.6分钟/月
  • 剩余预算: 50%

错误预算策略

error_budget_policy:
  - remaining_budget: 100%
    action: 正常开发速度
  - remaining_budget: 50%
    action: 考虑推迟风险变更
  - remaining_budget: 10%
    action: 冻结非关键变更
  - remaining_budget: 0%
    action: 功能冻结,专注于可靠性

参考: 参见 references/error-budget.md

SLO实施

Prometheus记录规则

# SLI记录规则
groups:
  - name: sli_rules
    interval: 30s
    rules:
      # 可用性SLI
      - record: sli:http_availability:ratio
        expr: |
          sum(rate(http_requests_total{status!~"5.."}[28d]))
          /
          sum(rate(http_requests_total[28d]))

      # 延迟SLI (请求 < 500ms)
      - record: sli:http_latency:ratio
        expr: |
          sum(rate(http_request_duration_seconds_bucket{le="0.5"}[28d]))
          /
          sum(rate(http_request_duration_seconds_count[28d]))

  - name: slo_rules
    interval: 5m
    rules:
      # SLO合规性 (1 = 满足SLO, 0 = 违反)
      - record: slo:http_availability:compliance
        expr: sli:http_availability:ratio >= bool 0.999

      - record: slo:http_latency:compliance
        expr: sli:http_latency:ratio >= bool 0.99

      # 剩余错误预算 (百分比)
      - record: slo:http_availability:error_budget_remaining
        expr: |
          (sli:http_availability:ratio - 0.999) / (1 - 0.999) * 100

      # 错误预算燃烧率
      - record: slo:http_availability:burn_rate_5m
        expr: |
          (1 - (
            sum(rate(http_requests_total{status!~"5.."}[5m]))
            /
            sum(rate(http_requests_total[5m]))
          )) / (1 - 0.999)

SLO警报规则

groups:
  - name: slo_alerts
    interval: 1m
    rules:
      # 快速燃烧: 14.4倍速率, 1小时窗口
      # 在1小时内消耗2%错误预算
      - alert: SLOErrorBudgetBurnFast
        expr: |
          slo:http_availability:burn_rate_1h > 14.4
          and
          slo:http_availability:burn_rate_5m > 14.4
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "检测到快速错误预算燃烧"
          description: "错误预算以 {{ $value }} 倍速率燃烧"

      # 慢速燃烧: 6倍速率, 6小时窗口
      # 在6小时内消耗5%错误预算
      - alert: SLOErrorBudgetBurnSlow
        expr: |
          slo:http_availability:burn_rate_6h > 6
          and
          slo:http_availability:burn_rate_30m > 6
        for: 15m
        labels:
          severity: warning
        annotations:
          summary: "检测到慢速错误预算燃烧"
          description: "错误预算以 {{ $value }} 倍速率燃烧"

      # 错误预算耗尽
      - alert: SLOErrorBudgetExhausted
        expr: slo:http_availability:error_budget_remaining < 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "SLO错误预算耗尽"
          description: "剩余错误预算: {{ $value }}%"

SLO仪表板

Grafana仪表板结构:

┌────────────────────────────────────┐
│ SLO合规性 (当前)                   │
│ ✓ 99.95% (目标: 99.9%)            │
├────────────────────────────────────┤
│ 剩余错误预算: 65%                  │
│ ████████░░ 65%                     │
├────────────────────────────────────┤
│ SLI趋势 (28天)                     │
│ [时间序列图]                       │
├────────────────────────────────────┤
│ 燃烧率分析                          │
│ [按时间窗口的燃烧率]               │
└────────────────────────────────────┘

示例查询:

# 当前SLO合规性
sli:http_availability:ratio * 100

# 剩余错误预算
slo:http_availability:error_budget_remaining

# 按当前燃烧率计算错误预算耗尽天数
(slo:http_availability:error_budget_remaining / 100)
*
28
/
(1 - sli:http_availability:ratio) * (1 - 0.999)

多窗口燃烧率警报

# 短窗口和长窗口组合减少误报
rules:
  - alert: SLOBurnRateHigh
    expr: |
      (
        slo:http_availability:burn_rate_1h > 14.4
        and
        slo:http_availability:burn_rate_5m > 14.4
      )
      or
      (
        slo:http_availability:burn_rate_6h > 6
        and
        slo:http_availability:burn_rate_30m > 6
      )
    labels:
      severity: critical

SLO审查流程

每周审查

  • 当前SLO合规性
  • 错误预算状态
  • 趋势分析
  • 事件影响

月度审查

  • SLO达成情况
  • 错误预算使用
  • 事件事后分析
  • SLO调整

季度审查

  • SLO相关性
  • 目标调整
  • 流程改进
  • 工具增强

最佳实践

  1. 从用户面向的服务开始
  2. 使用多个SLI (可用性、延迟等)
  3. 设置可实现的SLO (不要追求100%)
  4. 实施多窗口警报以减少噪音
  5. 持续跟踪错误预算
  6. 定期审查SLO
  7. 记录SLO决策
  8. 与业务目标对齐
  9. 自动化SLO报告
  10. 使用SLO进行优先级排序

参考文件

  • assets/slo-template.md - SLO定义模板
  • references/slo-definitions.md - SLO定义模式
  • references/error-budget.md - 错误预算计算

相关技能

  • prometheus-configuration - 用于指标收集
  • grafana-dashboards - 用于SLO可视化