何时报警
在 Prometheus 与 Alertmanager 中有很多地方都涉及到报警时机的配置,那么我的报警规则具体会在什么时候报警呢?
首先在 Prometheus 的全局配置中有一个?evaluation_interval ?属性,该属性表示的是间隔多长时间对报警规则进行评估,比如我们这里配置的 30s,那么每 30s 会去验证下我们的报警规则是否达到了阈值。
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 1m
此时我们的报警状态处于?inactive ,如果评估后达到了阈值,则会变成?pending ?状态,这个时候报警还没有发送给 Alertmanager,什么时候触发需要依赖报警规则中的?for ?属性配置了,比如我们配置成 1m,那么也就是在后续 1 分钟内的评估如果都达到了阈值,那么就会变成?pending ?状态,并将报警发送给 Alertmanager,后续的操作就是 Alertmanager 来处理了。
所以有的场景下我们的监控图表上面已经有部分指标达到了告警的阈值了,但是并不一定会触发告警规则,比如我们上面的规则中,设置的是 1 分钟的 Pending Duration,对于下图这种情况就不会触发告警,因为持续时间太短,没有达到一分钟:
报警具体什么时候发送就要看我们的报警路由规则如何配置的了,核心是下面几个属性:
group_by: [instance] # 报警分组
group_wait: 30s # 在组内等待所配置的时间,如果同组内,30秒内出现相同报警,在一个组内出现。
group_interval: 5m # 每个分组中最多每5分钟发送一条警报
repeat_interval: 1h # 发送报警间隔,如果指定时间内没有修复,则重新发送报警。
Alertmanager 会将收到的报警规则按照?group_by ?进行分组。当一个报警触发之后,如果之前没有分组,那么就会创建一个分组,当创建完之后会等待?group_wait ?这么长的时间才会发送,这里不会马上发送就是需要积攒一定数量的报警,防止报警数量过多,形成报警风暴。
当一个报警触发之后,如果这个报警属于某个 group,但是这个 group 因为距离第一个 alert 已经足够?group_wait ?时间了,发送过一次了,那么就会等待?group_interval ?时间之后再次发送新的报警 group 了。
所以,如果报警已经从 Prometheus 送到 Alertmanager 了,那么最多可能等待?max(group_wait,group_interval) 的时间。
假如一个相同的警报一直 FIRING,Alertmanager 并不会一直发送警报,而会等待一段时间,这个等待时间就是?repeat_interval ,显然,不同类型警报的发送频率也是不一样的。
比如现在我们添加两条如下所示的报警规则:
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: 1m
labels:
team: node
annotations:
summary: "{{$labels.instance}}: High Memory usage detected"
description: "{{$labels.instance}}: Memory usage is above 30% (current value is: {{ $value }})"
- name: test-node-cpu
rules:
- alert: NodeCpuUsage
expr: ((1 - sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance) ) * 100) > 5
for: 2m
labels:
team: node
annotations:
summary: "{{$labels.instance}}: High CPU usage detected"
description: "{{$labels.instance}}: CPU usage is above 5% (current value is: {{ $value }})"
并在 Alertmanager 中配置路由的时候设置根据?instance ?进行分组:
routes:
- receiver: email
group_wait: 10s
group_by: ["instance"]
match:
team: node
同一个分组的报警会发送一条,如果组内有新的报警信息出现,则会等待?group_interval ?时间再次发送,如果没有新的变化,并且报警信息还是 FIRING 状态,则需要等待?repeat_interval ?时间后再次发送。
|