4. 告警去重规则(Deduplication):基于告警指纹(Fingerprint)的去重原理、配置多字段组合去重、去重窗口设置

在告警风暴中,同一故障可能触发多条内容完全相同的告警。Grafana OnCall 通过 告警指纹(Fingerprint) 机制实现精准去重,避免重复通知与重复分派,是降噪规则中最基础、最核心的一环。

4.1 告警指纹(Fingerprint)去重原理

告警指纹是一个基于告警内容生成的 哈希值。Grafana OnCall 在接收到告警时,会按照用户配置的字段组合计算指纹,并将指纹存入去重窗口。当新告警的指纹与窗口内已有指纹匹配时,该告警被判定为重复告警,不再触发通知与分派。

核心流程: 告警到达 → 提取指定字段 → 拼接字符串 → SHA-256 哈希 → 生成指纹 → 与去重窗口内指纹比对 → 匹配则丢弃/标记重复,不匹配则创建新告警并加入窗口。
告警指纹去重流程 告警到达 提取指定字段 生成指纹哈希 去重窗口比对 新告警(通过) 重复告警(丢弃) 去重窗口 指纹1 指纹2 指纹3

4.2 配置多字段组合去重

去重规则的核心在于 选择哪些字段参与指纹计算。Grafana OnCall 支持从告警 payload 中提取任意字段进行组合,字段顺序影响指纹结果。

配置场景 参与字段 去重效果
按主机去重 hostname 同一主机产生的多条告警视为重复
按主机+服务去重 hostname + service 同一主机的同一服务告警去重,不同服务视为不同告警
按告警类型+严重程度去重 alert_type + severity 相同类型和严重程度的告警去重
全字段去重 title + message + hostname 仅当所有字段完全一致时才去重
最佳实践: 建议至少包含 hostname 和 alert_type 两个字段,既能有效去重,又不会过度合并不同维度的告警。

配置示例(YAML):

deduplication_rules:
  - name: "按主机+服务去重"
    fingerprint_fields:
      - "payload.hostname"
      - "payload.service"
    window_minutes: 60
    enabled: true

4.3 去重窗口设置

去重窗口定义了 指纹的有效期。窗口期内匹配的告警被去重,窗口过期后指纹失效,新告警将重新创建。

窗口时长 适用场景 风险
5-15 分钟 短时故障、瞬断、快速自愈场景 窗口过短可能导致重复告警漏过
30-60 分钟 常规故障、持续性问题 适中,平衡去重效果与告警时效性
2-24 小时 长期故障、维护窗口、批量变更 窗口过长可能掩盖故障恢复信号
注意: 去重窗口不是告警恢复时间。窗口过期后,即使故障未恢复,新告警也会重新触发通知。建议结合告警分组(Grouping)规则实现持续故障的聚合通知。

4.4 去重规则配置步骤

  1. 进入集成配置: 在 Grafana OnCall 中选择目标集成,点击 “Edit” 进入规则配置页。
  2. 添加去重规则: 在 “Deduplication Rules” 区域点击 “Add Rule”。
  3. 选择指纹字段: 从告警 payload 树中选择参与去重的字段,支持多选。
  4. 设置去重窗口: 输入窗口时长(分钟),建议从 30 分钟开始测试。
  5. 启用并保存: 开启规则开关,保存配置。
  6. 验证效果: 发送测试告警,观察去重日志确认指纹匹配情况。
去重窗口生命周期 告警A 指纹生成 告警B 指纹匹配 → 去重 窗口过期 指纹失效 告警C 新指纹 → 新告警 去重窗口(60分钟) 窗口期内指纹匹配的告警被去重;窗口过期后,相同指纹的告警重新触发

4.5 常见问题与避坑

  • 字段顺序敏感: hostname + service 与 service + hostname 生成不同指纹,需保持配置一致。
  • 空字段处理: 如果参与字段为空,指纹计算会使用空字符串,可能导致意外匹配。建议对关键字段做非空校验。
  • 动态字段影响: 避免将时间戳、随机 ID 等每次变化的字段加入指纹,否则去重将失效。
  • 窗口与分组协同: 去重窗口应小于告警分组窗口,避免分组内包含已过期的去重告警。
工程建议: 在测试环境中先以 30 分钟窗口 + 2-3 个核心字段(如 hostname、alert_type、severity)启动,观察一周去重率,再根据实际告警模式调整字段组合与窗口时长。