跳到主要内容

事件聚合与去重

同一规则 + 同一标签集只对应一个事件,重复判定不会再建一条;聚合视图按表达式把上百条活跃事件折成几张卡片。

这页办完你会知道:为什么同一个故障不会每个判定周期发一条,以及一屏几百条活跃事件时 怎么把它们折成几张卡片看。

去重是天然的:一个事件 = 规则 + 标签集​

事件的身份由规则和标签集共同决定,算出来就是详情里那个 Hash。

  • 同一条规则、同一组标签,只会有一个活跃事件。规则每个周期都在跑,条件一直成立, 更新的是这条事件的触发时间和触发时值,不会每个周期新建一条;
  • 同一条规则跑在 5 台机器上,是 5 个事件(ident 不同),各自触发、各自恢复;
  • 恢复之后再次触发,才算新的一条。

所以「重复告警」在夜莺里通常不是同一个事件发了很多次,而是标签维度太细—— 一条规则按 device 展开出十几个序列,就有十几个独立事件。想少几条, 先看能不能在规则里把维度聚合掉(PromQL 里 sum by (...)), 见指标规则。

同一条事件反复通知,则由告警规则上的两个字段控制:重复通知间隔(分钟) —— 持续未恢复时隔多久再提醒一次;最大发送次数 —— 0 表示不限制。 这两个是最直接的「一个故障别发一百条」开关。

把上百条活跃事件折成几张卡片​

告警通知 → 告警事件 → 活跃告警,列表上方有一个 聚合规则 下拉。 选中一条聚合规则后,事件按规则算出的字符串归类,表格上方出现一排卡片, 每张卡片是一类;点某张卡片,下方表格只显示这一类的事件。

选择框旁边会显示「N 个聚合结果」,一眼看出这一屏其实只有几类问题。

常用的聚合表达式​

点下拉里的 新增规则,填两个字段:规则名称(下拉里显示的名字)和 聚合规则(Go 模板,算出来的字符串就是卡片标题)。管理员还能把它设为公开, 给所有人用;不公开就只有自己看得到。

想按什么归类聚合规则填
按告警规则{{.RuleName}}
按业务组 + 级别Group:{{.GroupName}} Severity:{{.Severity}}
按机器{{.TagsMap.ident}}
按实例标签{{.TagsMap.instance}}
按服务{{.TagsMap.service}}

能用的字段:.RuleName、.GroupName、.Severity、.TagsMap.<标签名> 等事件字段。

值班时最有用的是 {{.RuleName}} 和 {{.TagsMap.ident}}:前者回答「哪条规则在刷屏」, 后者回答「是不是就那一台机器出问题」。

聚合规则只影响这一页怎么显示,不改事件本身,也不影响通知。

想减少通知条数,用这三招​

看完聚合卡片、确认某一类确实不用每条都发之后:

  1. 规则上调重复通知间隔和最大发送次数——针对「同一个事件一直响」;
  2. 屏蔽规则——针对「这段时间这类别吵」,见屏蔽规则;
  3. 工作流的事件丢弃处理器——针对「这类根本不该发」,见事件 Pipeline。

三者的先后顺序见降噪与路由模型; 成套的场景化配法见降噪模式。

下一步​