跳到主要内容

报警过滤

有的时候可能报警通知太过频繁,或者在收到报警通知后就去开始处理问题了,这个期间可能报警还在频繁发送,这个时候我们可以去对报警进行静默设置。

静默通知

在 Alertmanager 的后台页面中提供了静默操作的入口。

静默

可以点击右上面的 New Silence 按钮新建一个静默通知:

新建静默

我们可以选择此次静默的开始时间、结束时间,最重要的是下面的 Matchers 部分,用来匹配哪些报警适用于当前的静默,比如这里我们设置 instance=node2 的标签,则表示具有这个标签的报警在 2 小时内都不会触发报警,点击下面的 Create 按钮即可创建:

创建

创建完成后还可以对该配置进行编辑或者让其过期等操作。此时在静默列表也可以看到创建的静默状态。

静默列表

抑制

除了上面的静默机制之外,Alertmanager 还提供了抑制机制来控制告警通知的行为。抑制是指当某次告警发出后,可以停止重复发送由此告警引发的其他告警的机制,比如现在有一台服务器宕机了,上面跑了很多服务都设置了告警,那么肯定会收到大量无用的告警信息,这个时候抑制就非常有用了,可以有效的防止告警风暴。

要使用抑制规则,需要在 Alertmanager 配置文件中的 inhibit_rules 属性下面进行定义,每一条抑制规则的具体配置如下:

target_match:
[ <labelname>: <labelvalue>, ... ]
target_match_re:
[ <labelname>: <regex>, ... ]

source_match:
[ <labelname>: <labelvalue>, ... ]
source_match_re:
[ <labelname>: <regex>, ... ]

equal: '[' <labelname>, ... ']'

当已经发送的告警通知匹配到 target_matchtarget_match_re 规则,当有新的告警规则如果满足 source_match 或者 source_match_re 的匹配规则,并且已发送的告警与新产生的告警中 equal 定义的标签完全相同,则启动抑制机制,新的告警不会发送。

例如当集群中的某一个主机节点异常宕机导致告警 NodeDown 被触发,同时在告警规则中定义了告警级别 为 severity=critical,由于主机异常宕机,则该主机上部署的所有服务会不可用并触发报警,根据抑制规则的定义,如果有新的告警级别为 severity=critical,并且告警中标签 instance 的值与 NodeDown 告警的相同,则说明新的告警是由 NodeDown 导致的,则启动抑制机制停止向接收器发送通知。

- source_match:
alertname: NodeDown
severity: critical
target_match:
severity: critical
equal:
- instance

比如现在我们如下所示的两个报警规则 NodeMemoryUsageNodeLoad

groups:
- name: test-node-mem
rules:
- alert: NodeMemoryUsage
expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100 > 30
for: 2m
labels:
team: node
severity: critical
annotations:
summary: '{{$labels.instance}}: High Memory usage detected'
description: '{{$labels.instance}}: Memory usage is above 30% (current value is: {{ $value }})'
- name: test-node-load
rules:
- alert: NodeLoad
expr: node_load5 < 1
for: 2m
labels:
team: node
severity: normal
annotations:
summary: '{{ $labels.instance }}: Low node load deteched'
description: '{{ $labels.instance }}: node load is below 1 (current value is: {{ $value }})'

当前我们系统里面普通(severity: normal)的告警有三条,node1、node2 和 master1 三个节点,另外一个报警有两条,master1 和 node2 两个节点:

报警规则

现在我们假设来配置一个抑制规则,如果 NodeMemoryUsage 报警触发,则抑制 NodeLoad 指标规则引起的报警,我们这里就会抑制 master1 和 node2 节点的告警,只会剩下 node1 节点的普通告警。

在 Alertmanager 配置文件中添加如下所示的抑制规则:

inhibit_rules:
- source_match:
alertname: NodeMemoryUsage
severity: critical
target_match:
severity: normal
equal:
- instance

更新配置后,最好重建下 Alertmanager,这样可以再次触发下报警,可以看到只能收到 node1 节点的 NodeLoad 报警了,另外两个节点的报警被抑制了:

抑制

这就是 Alertmanager 抑制的使用方式。