2. 告警阈值基础:定义、作用与不当设置的后果
告警阈值是监控体系中用于判断系统状态是否异常的“分界线”。在 Burn Rate 告警场景中,阈值直接决定了 SRE 团队何时收到通知、何时介入处理。理解阈值的本质、作用以及设置不当带来的风险,是构建可靠告警体系的第一步。
2.1 告警阈值的定义
告警阈值是一个预先设定的数值或条件,当监控指标达到或超过该数值时,触发告警通知。在 Burn Rate 上下文中,阈值通常表示为“在给定时间窗口内,错误预算消耗的速度”。
核心公式:
Burn Rate = 错误率 / 可容忍错误率
当 Burn Rate ≥ 阈值(例如 1.0、2.0、5.0)时,触发告警。
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 阈值设置的核心原则
为避免漏报与误报,阈值设置应遵循以下原则:
- 基于错误预算:阈值应与 SLO 目标对齐,而非基于历史峰值。
- 多窗口覆盖:使用短窗口(如 1 分钟)检测快速故障,长窗口(如 1 小时)检测慢速消耗。
- 分级设置:为不同严重级别设置不同阈值,避免一刀切。
- 动态调整:根据业务周期、流量模式定期复核阈值。
- 可解释性:每个阈值应有明确的业务含义,例如“此阈值表示错误预算将在 30 分钟内耗尽”。
实践建议:初始阈值可设为 Burn Rate = 2.0(警告)和 5.0(严重),运行 2 周后根据实际告警质量调整。目标是让告警信噪比(Signal-to-Noise Ratio)保持在 80% 以上。
2.6 阈值设置不当的因果链(SVG 图)
下图展示了阈值设置如何通过漏报/误报影响整个告警体系:
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 分钟内收到告警并介入。
某电商平台将 Burn Rate 阈值设为 8.0(基于历史峰值),认为只有极端故障才需告警。某次数据库慢查询导致错误率上升至 0.6%(Burn Rate = 6.0),持续 45 分钟,未触发告警。最终错误预算在 1 小时内耗尽,SLO 违反,导致首页加载失败 15 分钟。事后分析发现,若阈值设为 4.0,团队可在故障发生 10 分钟内收到告警并介入。