关于告警静默的设计和思考

60 阅读3分钟

前言

告警静默是告警系统中的一个基本功能,它指的是在特定的时间段内,系统不会对某些告警进行通知或报警。这个功能通常用于避免不必要的告警通知,例如在系统维护期间或已知的问题期间。告警静默可以通过手动设置或根据特定的规则自动触发。在告警系统中,告警静默是一个非常重要的功能,它可以帮助用户减少不必要的告警通知,提高工作效率。

AlertManager 如何实现告警静默

在AlertManager中,告警静默(matchers)是基于匹配器实现的,它和路由树的配置方式相同。传入的告警事件会经过检查,确定它们是否与生效的静默规则的所有等式或正则表达式匹配器相匹配。如果匹配,那么对于该告警事件将会被静默。

不过在使用过程中我发现AlertManager的告警静默存在一些问题:

  1. 不支持直接删除静默规则,只能通过将其标记为已过期,然后等待垃圾回收(GC)来自动清理。这可能会导致存在大量的静默规则。
  2. 静默规则存储在文件中,分页展示不友好。
  3. 不支持原地编辑静默规则,只能在一定条件下复制一个新的,并将旧的静默规则标记为过期。

我们的最佳实践

在使用告警系统的过程中,我们发现告警静默的来源主要有两种。虽然它们都能实现告警静默的效果,但在使用方式和后续处理上却存在很大的差异:

  1. 来源于飞书卡片的「快捷静默」

  • 一次性的,到期后自动结束,不会再编辑这个静默规则。
  • 针对单个告警事件的。
  1. 来源于告警平台创建的「计划静默」

  • 有计划的,以后大概率还会再去编辑这个静默规则。
  • 针对特定告警策略或具有特定特征的告警事件,如某个集群的告警事件。

如何进行优化

  1. 针对一次性的「快捷静默」,我们可以使用 Redis 为该告警事件创建一个带有过期时间的静默规则。命中该规则的告警事件的状态由「告警中」变化为「静默中」,该规则不提供编辑和查看能力,过期后会自动删除。同时,我们可以在「正在告警」列表中解除该规则。
  2. 对于有计划的「计划静默」,我们将静默规则存储到 MySQL 中,以便进行长期的维护和修改。命中该规则的告警事件的状态将从「告警中」变为「静默中」。该规则提供编辑和查看功能,若要解除「计划静默」,则需要删除该规则或修改规则的生效时间。