Alertmanager简介及机制
Alertmanager处理由类似Prometheus服务器等客户端发来的警报,之后需要删除重复、分组,并将它们通过路由发送到正确的接收器,比如电子邮件、Slack等。Alertmanager还支持沉默和警报抑制的机制。
分组
分组是指当出现问题时,Alertmanager会收到一个单一的通知,而当系统宕机时,很有可能成百上千的警报会同时生成,这种机制在较大的中断中特别有用。
例如,当数十或数百个服务的实例在运行,网络发生故障时,有可能服务实例的一半不可达数据库。在告警规则中配置为每一个服务实例都发送警报的话,那么结果是数百警报被发送至Alertmanager。
但是作为用户只想看到单一的报警页面,同时仍然能够清楚的看到哪些实例受到影响,因此,人们通过配置Alertmanager将警报分组打包,并发送一个相对看起来紧凑的通知。
分组警报、警报时间,以及接收警报的receiver是在配置文件中通过路由树配置的。
抑制
抑制是指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。
例如,当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。
抑制机制可以通过Alertmanager的配置文件来配置。
沉默
沉默是一种简单的特定时间静音提醒的机制。一种沉默是通过匹配器来配置,就像路由树一样。传入的警报会匹配RE,如果匹配,将不会为此警报发送通知。
沉默机制可以通过Alertmanager的Web页面进行配置。
Alertmanager安装
下载地址:https://github.com/prometheus/alertmanager/releases
1 2 3 4 5
| # tar -zxf alertmanager-0.18.0.linux-amd64.tar.gz -C /usr/local/ # mv /usr/local/alertmanager-0.18.0.linux-amd64 /usr/local/alertmanager # cd /usr/local/alertmanager/ # ./alertmanager --config.file=alertmanager.yml --cluster.advertise-address=127.0.0.1:9093 --log.level=debug //前台调试 # nohup ./alertmanager --config.file=alertmanager.yml --cluster.advertise-address=127.0.0.1:9093 & //后台运行
|
Web控制台:http://IP:9093/#/alerts
alertmanager.yml的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| global: resolve_timeout: 5m smtp_smarthost: 'smtp.exmail.qq.com:465' smtp_from: 'test@iobeta.com' smtp_auth_username: 'test@iobeta.com' smtp_auth_password: '******' smtp_require_tls: false wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
templates: - 'template/*.tmpl'
route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1m receiver: 'email'
receivers: - name: 'email' email_configs: - to: 'test@iobeta.com' html: '{{ template "email.html" . }}' headers: { Subject: "[WARN] 报警邮件"} send_resolved: true wechat_configs: - send_resolved: true to_party: '1' agent_id: '1000002' corp_id: '******' api_secret: '******' message: '{{ template "wechat.html" . }}'
inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
|
1)repeat_interval配置项,对于email来说,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
2)企业微信注册地址:https://work.weixin.qq.com
上述配置的email、webhook和wechat三种报警方式。目前Alertmanager所有的报警方式有以下几个方面:
- email_config
- hipchat_config
- pagerduty_config
- pushover_config
- slack_config
- opsgenie_config
- victorops_config
tmpl模板的配置
1)email.tmpl
1 2
| # mkdir template # vim template/email.tmpl
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| {{ define "email.html" }} <table border="1"> <tr> <td>报警项</td> <td>实例</td> <td>报警阀值</td> <td>开始时间</td> </tr> {{ range $i, $alert := .Alerts }} <tr> <td>{{ index $alert.Labels "alertname" }}</td> <td>{{ index $alert.Labels "instance" }}</td> <td>{{ index $alert.Annotations "value" }}</td> <td>{{ $alert.StartsAt }}</td> </tr> {{ end }} </table> {{ end }}
|
注:上述Labels项,表示prometheus里面的可选label项。annotation项表示报警规则中定义的annotation项的内容。
2)wechat.tmpl
1
| # vim template/wechat.tmpl
|
1 2 3 4 5 6 7 8
| {{ define "wechat.html" }} {{ range $i, $alert := .Alerts.Firing }} [报警项]:{{ index $alert.Labels "alertname" }} [实例]:{{ index $alert.Labels "instance" }} [报警阀值]:{{ index $alert.Annotations "value" }} [开始时间]:{{ $alert.StartsAt }} {{ end }} {{ end }}
|
注:此处range遍历项与email模板中略有不同,只遍历当前没有处理的报警(Firing)。此项如果不设置,则在Alert中已经Resolved的报警项,也会被发送到企业微信。
在Prometheus模块定义告警规则
prometheus.yml
1 2 3 4 5 6 7 8 9
| alerting: alertmanagers: - static_configs: - targets: ["192.168.165.239:9093"]
rule_files: - ./rules/*.yml
|
以内存报警为例
1
| # vim rules/simulator_alert_rules.yml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| groups: - name: test-rule1 rules: - alert: "内存报警" expr: 100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes) > 80 for: 1s labels: severity: warning annotations: summary: "服务名:{{$labels.alertname}}" description: "业务500报警: {{ $value }}" value: "{{ $value }}"
- name: test-rule2 rules: - alert: "内存报警" expr: 100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes) > 50 for: 1s labels: severity: test annotations: summary: "服务名:{{$labels.alertname}}" description: "业务500报警: {{ $value }}" value: "{{ $value }}"
|
Prometheus控制台查看报警是否生效及命中信息
在浏览器输入Prometheus的控制台地址,即可查看报警是否生效及命中信息
打开:http://192.168.16.20:9090/alerts
Alertmanager控制台查看报警信息
在浏览器输入Alertmanager的配置地址,即可查看所监控到的报警信息
打开:http://192.168.16.19:9093/#/alerts
常用报警
1 2 3 4 5 6 7 8
| groups: - name: MysqldDown rules: - alert: "MySQL宕机" expr: sum(up{job="mysqld"}) == 0 for: 1m labels: severity: critical
|
1 2 3 4 5 6 7 8 9 10 11 12
| groups: - name: InstanceDown rules: - alert: "实例宕机" expr: up == 0 for: 2m labels: team: node annotations: summary: "{{$labels.instance}}: has been down" description: "{{$labels.instance}}: job {{$labels.job}} has been down " value: {{$value}}
|
告警信息生命周期的3中状态
1)inactive:表示当前报警信息即不是firing状态也不是pending状态
2)pending:表示在设置的阈值时间范围内被激活的
3)firing:表示超过设置的阈值时间被激活的