2. 告警阈值基础:定义、作用与不当设置的后果

告警阈值是监控体系中用于判断系统状态是否异常的“分界线”。在 Burn Rate 告警场景中,阈值直接决定了 SRE 团队何时收到通知、何时介入处理。理解阈值的本质、作用以及设置不当带来的风险,是构建可靠告警体系的第一步。

2.1 告警阈值的定义

告警阈值是一个预先设定的数值或条件,当监控指标达到或超过该数值时,触发告警通知。在 Burn Rate 上下文中,阈值通常表示为“在给定时间窗口内,错误预算消耗的速度”。

核心公式:
Burn Rate = 错误率 / 可容忍错误率
当 Burn Rate ≥ 阈值(例如 1.0、2.0、5.0)时,触发告警。

例如:若 SLO 为 99.9%(可容忍错误率 0.1%),当前错误率为 0.5%,则 Burn Rate = 0.5% / 0.1% = 5.0。若阈值设为 2.0,则触发告警。

2.2 阈值的作用

阈值在告警体系中承担以下关键角色:

作用维度 具体说明 示例(Burn Rate)
信号过滤 区分正常波动与异常事件,减少无关通知 阈值 2.0 过滤掉瞬时毛刺,只关注持续消耗
优先级分级 通过多级阈值区分告警严重程度 P1: 阈值 5.0(严重);P2: 阈值 2.0(警告)
响应时效控制 决定团队介入的紧急程度 高阈值触发即时响应,低阈值允许观察
错误预算保护 在错误预算耗尽前提前预警 阈值 1.0 表示预算正在以可容忍速度消耗

2.3 阈值设置不当的后果:漏报与误报

阈值设置是告警工程中最容易出错的环节之一。错误阈值会直接导致两种典型问题:漏报和误报。

核心矛盾:阈值过高 → 漏报(错过真实故障);阈值过低 → 误报(淹没在噪音中)。两者都会降低告警系统的可信度。

2.3.1 漏报(False Negative)

漏报指系统存在异常但未触发告警。根本原因是阈值设置过高,无法反映真实风险。

  • 典型场景:Burn Rate 阈值设为 10.0,但实际故障以 3.0 的速度消耗预算,持续 2 小时后预算耗尽,团队未收到任何告警。
  • 后果:
    • SLO 违反后才发现问题,MTTR(平均修复时间)显著增加
    • 错误预算被无声消耗,影响客户体验
    • 团队对告警系统失去信任,转向手动检查
  • 常见原因:基于“历史峰值+余量”的静态设置,未考虑业务增长或流量模式变化。

2.3.2 误报(False Positive)

误报指系统正常但触发了告警。根本原因是阈值设置过低,对正常波动过于敏感。

  • 典型场景:Burn Rate 阈值设为 0.5,正常流量波动导致错误率短暂升高 0.05%,触发告警,但实际未影响 SLO。
  • 后果:
    • 告警疲劳:团队频繁收到无效通知,逐渐忽略告警
    • 资源浪费:值班人员反复排查无问题,消耗精力
    • 真实告警被淹没:重要告警被误报噪音掩盖
  • 常见原因:未考虑指标的自然抖动,或时间窗口过短导致毛刺触发。

2.4 漏报与误报的对比分析

对比维度 漏报(阈值过高) 误报(阈值过低)
触发条件 真实故障未达到阈值 正常波动超过阈值
对 SLO 影响 直接导致 SLO 违反 间接降低告警可信度
团队响应 无响应,故障持续 频繁响应,但无实际动作
长期后果 客户流失、业务受损 告警疲劳、团队倦怠
修复方向 降低阈值或缩短窗口 提高阈值或加长窗口

2.5 阈值设置的核心原则

为避免漏报与误报,阈值设置应遵循以下原则:

  1. 基于错误预算:阈值应与 SLO 目标对齐,而非基于历史峰值。
  2. 多窗口覆盖:使用短窗口(如 1 分钟)检测快速故障,长窗口(如 1 小时)检测慢速消耗。
  3. 分级设置:为不同严重级别设置不同阈值,避免一刀切。
  4. 动态调整:根据业务周期、流量模式定期复核阈值。
  5. 可解释性:每个阈值应有明确的业务含义,例如“此阈值表示错误预算将在 30 分钟内耗尽”。
实践建议:初始阈值可设为 Burn Rate = 2.0(警告)和 5.0(严重),运行 2 周后根据实际告警质量调整。目标是让告警信噪比(Signal-to-Noise Ratio)保持在 80% 以上。

2.6 阈值设置不当的因果链(SVG 图)

下图展示了阈值设置如何通过漏报/误报影响整个告警体系:

阈值设置不当的因果链 阈值设置 阈值过高 阈值过低 漏报(False Negative) 误报(False Positive) SLO 违反 MTTR 增加 / 客户流失 告警疲劳 团队倦怠 / 真实告警被淹没 核心矛盾:阈值过高 → 漏报;阈值过低 → 误报

2.7 阈值设置不当的典型代码示例

以下是一个简化的 Burn Rate 告警配置示例,展示了阈值设置不当如何导致漏报:

# 错误示例:阈值设置过高导致漏报
# 假设 SLO = 99.9%,错误预算 = 0.1%
# 当前错误率 = 0.08%(正常),但突发故障导致错误率升至 0.3%

burn_rate = current_error_rate / tolerated_error_rate
# tolerated_error_rate = 0.001 (0.1%)

# 阈值设为 10.0(过高)
if burn_rate >= 10.0:
    trigger_alert("P1: 严重告警")
elif burn_rate >= 5.0:
    trigger_alert("P2: 警告")
else:
    print("正常状态")  # 实际 burn_rate = 0.003/0.001 = 3.0,未触发任何告警

# 正确示例:基于错误预算消耗速度设置阈值
# 短窗口(1分钟)检测快速故障
if burn_rate_1min >= 5.0:
    trigger_alert("P1: 快速消耗告警")
# 长窗口(1小时)检测慢速消耗
elif burn_rate_1hour >= 1.5:
    trigger_alert("P2: 慢速消耗警告")

2.8 阈值设置不当的典型案例

案例:某电商平台 Burn Rate 阈值设置失误
某电商平台将 Burn Rate 阈值设为 8.0(基于历史峰值),认为只有极端故障才需告警。某次数据库慢查询导致错误率上升至 0.6%(Burn Rate = 6.0),持续 45 分钟,未触发告警。最终错误预算在 1 小时内耗尽,SLO 违反,导致首页加载失败 15 分钟。事后分析发现,若阈值设为 4.0,团队可在故障发生 10 分钟内收到告警并介入。