Prometheus的告警
📅 2017-06-03 | 🖱️
Prometheus的AlertManager是一个独立于Prometheus的外部组件,用于监控系统的告警,通过配置文件可以配置一些告警规则,Prometheus会把告警推送到AlertManager。 Alertmanager会对收到的告警信息进行处理,例如进行忽略,禁止,聚合并通过邮件等方式发送告警信息。
一个简单的邮件告警例子 #
我们先使用AlertManager实现简单的服务器内存的邮件告警。
首先下载配置并启动AlertManager。
1alertmanager \
2 -config.file={{ alertmanager_install_dir }}/alertmanager.yml \
3 -web.listen-address=:9093
alertmanager.yml的配置内容如下:
1global:
2 smtp_smarthost: 'smtp.163.com:25'
3 smtp_from: '[email protected]'
4 smtp_auth_username: '[email protected]'
5 smtp_auth_password: 'xxx'
6
7
8templates:
9 - '/etc/alertmanager/template/*.tmpl'
10
11route:
12 group_by: ['alertname', 'cluster', 'service']
13 group_wait: 30s
14 group_interval: 5m
15 repeat_interval: 10m
16 receiver: default-receiver
17
18
19receivers:
20- name: 'default-receiver'
21 email_configs:
22 - to: '[email protected]'
在Prometheus中设置告警规则,与prometheus.yml同目录创建alert.rules文件。
1{% raw %}
2ALERT node_memory_low
3 IF (node_memory_MemFree+node_memory_Cached+node_memory_Buffers)/node_memory_MemTotal < 0.4
4 FOR 1m
5 LABELS { severity = "warning" }
6 ANNOTATIONS {
7 summary = "node {{ $labels.instance }} available memory is too low",
8 description = "node {{ $labels.instance }} available memory is too low (current value: {{ $value }})",
9 }
10{% endraw %}
这里
node_memory_MemFree
等Metrics是来自Prometheus的Node_Exporter
,专门针对服务器监控参数的Exporter。这里的告警规则是当服务器的可用内存小于40%时就会被触发。
修改prometheus.yml,将alert.rules添加到prometheus的规则文件配置中:
1rule_files:
2 - "alert.rules"
设置Prometheus启动参数-alertmanager.url
,当告警规则触发时Prometheus服务会与Alertmanager进行通信将告警推送给AlertManager。重启或启动Prometheus服务:
1prometheus \
2 -config.file={{ prometheus_install_dir }}/prometheus.yml \
3 -storage.local.path={{ prometheus_data_dir }} \
4 -web.listen-address=:9090 \
5 -alertmanager.url=http://localhost:9093
完成上面的配置后,当服务器可用内存低于40%时[email protected]就会收到[email protected]发送的告警邮件。
告警的处理机制 #
AlertManager收到Prometheus发送的警报后,会做一些处理,例如分组(Grouping),抑制(Inhibition),静默(Silences),告警信息经过路由发送到正确的接收器,例如电子邮件, webhook等。下面我们来看一下警报的处理机制:
- 分组(Grouping):通过配置可以将告警分组,发送一个相对紧凑的告警通知
- 抑制(Inhibition):通过配置可以抑制重复发送此告警引发的其他错误的告警
- 静默(Silences):通过静默实现一定时间的静音功能,可以在AlertManager的Web页面配置静默
配置文件 #
下面是一个alertmanager.yml中的例子:
1route:
2 group_by: ['alertname', 'cluster', 'service'] #分组
3 group_wait: 30s
4 group_interval: 5m
5 repeat_interval: 10m
6 receiver: default-receiver
7 routes:
8 - match_re:
9 service: ^(foo1|foo2|baz)$
10 receiver: default-receiver
11
12inhibit_rules:
13- source_match:
14 severity: 'critical'
15 target_match:
16 severity: 'warning'
17 equal: ['alertname', 'cluster', 'service']
和Prometheus的其他组件一样,AlertManager通过命令行flag和一个yaml配置文件进行配置。 其中,命令行flag配置不变的系统参数,而在yaml配置文件中可以配置通知接收器、通知路由、抑制规则等,参看上面的例子。
通知路由route #
下面是关于通知路由的一段配置:
1route:
2 group_by: ['alertname', 'cluster', 'service']
3 group_wait: 30s
4 group_interval: 5m
5 repeat_interval: 10m
6 receiver: default-receiver
7 routes:
8 - match_re:
9 service: ^(foo1|foo2|baz)$
10 receiver: team-X-mails
11 continue: false
12 routes:
13 - match:
14 severity: critical
15 receiver: team-X-pager
16 - match:
17 service: files
18 receiver: team-Y-mails
19 routes:
20 - match:
21 severity: critical
22 receiver: team-Y-pager
从上面的配置可以看出,通知路由是一个路由树。如果某些配置在子节点上没有的话则默认从父节点中继承。 当某个告警到达路由树的根时,根路径匹配所有告警,之后会匹配子节点。注意continue的值为false(默认值),将在匹配第一个子节点后停止,如果continue为true则将继续进行后续兄弟节点的匹配。