Prometheus的告警

2017-06-03 阅读: Prometheus

Prometheus的AlertManager是一个独立于Prometheus的外部组件,用于监控系统的告警,通过配置文件可以配置一些告警规则,Prometheus会把告警推送到AlertManager。 Alertmanager会对收到的告警信息进行处理,例如进行忽略,禁止,聚合并通过邮件等方式发送告警信息。

一个简单的邮件告警例子

我们先使用AlertManager实现简单的服务器内存的邮件告警。

首先下载配置并启动AlertManager。

alertmanager \
 -config.file=/alertmanager.yml \
 -web.listen-address=:9093

alertmanager.yml的配置内容如下:

global:
  smtp_smarthost: 'smtp.163.com:25'
  smtp_from: 'xxx@163.com'
  smtp_auth_username: 'xxx@163.com'
  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: 'team@xxx.com'

在Prometheus中设置告警规则,与prometheus.yml同目录创建alert.rules文件。


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 }})",
   }

这里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.yml \
 -storage.local.path= \
 -web.listen-address=:9090 \
 -alertmanager.url=http://localhost:9093

完成上面的配置后,当服务器可用内存低于40%时team@xxx.com就会收到xxx@163.com发送的告警邮件。

告警的处理机制

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

参考

标题:Prometheus的告警
本文链接:https://blog.frognew.com/2017/06/prometheus-alerting.html
转载请注明出处。

目录