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