4. SLO 作业模板核心字段:服务名称、SLI指标、目标阈值、时间窗口、燃烧速率

一个标准化的 SLO 作业模板是连接服务定义与告警策略的桥梁。模板中的每个字段都直接决定了 SLO 的计算方式、合规性判定以及告警的触发时机。本章将逐一拆解五个核心字段的定义、填写规范及其在 Prometheus 告警联动中的实际映射关系。

核心认知: SLO 模板不是静态的文档,而是一份可执行的“监控契约”。字段的精确度直接决定了告警的准确性和运维效率。

4.1 核心字段总览

下表列出了 SLO 作业模板的五个核心字段及其在 Prometheus 中的对应关系,帮助快速建立全局认知。

字段名称 定义 Prometheus 映射 示例值
服务名称 被监控服务的唯一标识 service 标签 api-gateway
SLI 指标 衡量服务质量的具体指标表达式 PromQL 查询语句 http_requests_total{status=~"5.."}
目标阈值 SLI 必须达到的合规百分比 告警规则中的 threshold 99.9%
时间窗口 评估 SLO 合规性的回溯周期 PromQL 中的 range vector 30d
燃烧速率 错误预算消耗的速度阈值 告警规则中的 burnrate 14.4x (1小时耗尽30天预算)

4.2 字段详解与填写规范

4.2.1 服务名称

服务名称是 SLO 模板的“主键”。在微服务架构中,它必须与 Prometheus 的 service 或 job 标签严格一致,确保告警规则能正确匹配到目标服务。

  • 规范: 使用小写字母、连字符,避免下划线和特殊字符。
  • 示例: user-service、order-processing。
  • 联动: 在 Prometheus 告警规则中,通过 service="user-service" 进行标签选择。

4.2.2 SLI 指标

SLI 指标是 SLO 的“测量仪”。它必须是一个可量化的 PromQL 表达式,通常分为“好事件”和“总事件”两部分。

  • 请求成功率: sum(rate(http_requests_total{status!~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
  • 请求延迟: histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{le="0.5"}[5m])) by (le))
避坑指南: SLI 表达式必须保证分母不为零。对于低频服务,建议使用 avg_over_time 或增加最小周期约束,避免因数据缺失导致 SLO 计算异常。

4.2.3 目标阈值

目标阈值定义了“好”与“坏”的分界线。常见的阈值设定为 99.9%(三个9)、99.99%(四个9)。

  • 格式: 使用百分比小数,如 0.999 代表 99.9%。
  • 影响: 阈值越高,错误预算越少,对燃烧速率的敏感度越高。

4.2.4 时间窗口

时间窗口决定了 SLO 的“考核周期”。Prometheus 通常使用 30d 作为标准窗口,与错误预算的消耗周期对齐。

  • 常见值: 7d(快速迭代)、30d(标准稳定)、90d(长期合规)。
  • 联动: 在 PromQL 中,时间窗口通过 [30d] 范围向量实现,例如 avg_over_time(sli:success_rate[30d])。

4.2.5 燃烧速率

燃烧速率是告警触发的“加速器”。它定义了错误预算消耗的速度,是多窗口、多燃烧速率告警策略的核心。

  • 计算: 燃烧速率 = (1 - 目标阈值) / (时间窗口内允许的错误预算比例)。
  • 示例: 对于 99.9% 的 SLO,30 天总错误预算为 43.2 分钟。如果希望在 1 小时内触发告警,则燃烧速率为 43.2 / 1 = 43.2x。

4.3 字段联动关系:从模板到告警

下图展示了 SLO 模板字段如何映射到 Prometheus 告警规则中,形成完整的告警链路。

SLO 模板字段到 Prometheus 告警规则映射图 SLO 模板字段 → Prometheus 告警规则映射 服务名称 SLI 指标 目标阈值 时间窗口 燃烧速率 告警规则标签选择 service="api-gateway" PromQL 表达式 sli:success_rate[5m] 阈值比较 sli < 0.999 范围向量 [30d] 燃烧速率计算 burnrate > 14.4 告警输出 告警名称 SLOBurnRateHigh 严重级别 critical 标签 service, slo 注解 错误预算剩余 5%

4.4 燃烧速率计算实战

燃烧速率是告警策略中最关键也最容易出错的字段。下面通过一个具体案例演示其计算过程。

案例: 某服务 SLO 目标为 99.9%,时间窗口为 30 天。我们希望当错误预算可能在 1 小时内耗尽时触发 P0 告警。
  1. 计算总错误预算: 30 天 = 43200 分钟。允许的错误时间 = 43200 * (1 - 0.999) = 43.2 分钟。
  2. 确定告警窗口: 我们希望 1 小时内耗尽,即告警窗口 = 60 分钟。
  3. 计算燃烧速率: 燃烧速率 = 总错误预算 / 告警窗口 = 43.2 / 1 = 43.2x。
  4. 生成告警规则: 当过去 1 小时的燃烧速率超过 43.2 时,触发告警。

对应的 Prometheus 告警规则片段如下:

groups:
  - name: slo_alerts
    rules:
      - alert: SLOBurnRateHigh
        expr: |
          (
            (1 - (sum(rate(http_requests_total{status=~"5.."}[1h])) / sum(rate(http_requests_total[1h]))))
            / (1 - 0.999)
          ) > 43.2
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "SLO 燃烧速率过高 ({{ $value | humanizePercentage }})"
          description: "服务 {{ $labels.service }} 的 SLO 错误预算可能在 1 小时内耗尽。"

4.5 多窗口燃烧速率策略

单一燃烧速率容易产生误报。生产环境通常采用多窗口策略,通过不同时间窗口的组合来平衡告警的及时性与准确性。

告警级别 时间窗口 燃烧速率 触发条件 响应时间
P0 (Critical) 1h 43.2x 1小时内耗尽预算 立即响应
P1 (Warning) 6h 7.2x 6小时内耗尽预算 15分钟
P2 (Info) 3d 1.2x 3天内耗尽预算 1小时
最佳实践: 建议为每个 SLO 配置至少 3 个燃烧速率告警(P0/P1/P2),覆盖从“即将发生”到“正在发生”的全场景。P0 用于即时响应,P2 用于趋势预警。

通过精确配置 SLO 模板的五个核心字段,团队可以将服务等级目标从文档转化为可执行、可告警的监控体系,实现从“被动响应”到“主动预防”的运维模式转变。