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则将继续进行后续兄弟节点的匹配。

参考