报警过滤¶
有的时候可能报警通知太过频繁,或者在收到报警通知后就去开始处理问题了,这个期间可能报警还在频繁发送,这个时候我们可以去对报警进行静默设置。
静默通知¶
在 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_match
和 target_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
比如现在我们如下所示的两个报警规则 NodeMemoryUsage
与 NodeLoad
:
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 抑制的使用方式。