简介

Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负责人,Alertmanager支持Email, Slack,等告警方式, 也可以通过webhook接入钉钉等国内IM工具。

Prometheus的警报分为两个部分。Prometheus服务器中的警报规则将警报发送到Alertmanager。该Alertmanager 然后管理这些警报,包括沉默,抑制,聚集和通过的方法,如电子邮件发出通知,对呼叫通知系统,以及即时通讯平台。

设置警报和通知的主要步骤是:
设置和配置 Alertmanager
配置Prometheus与Alertmanager对话
在Prometheus中创建警报规则

报警分组

分组将类似性质的警报分类为单个通知。当许多系统同时发生故障并且可能同时触发数百到数千个警报时,此功能特别有用。
示例:发生网络分区时,群集中正在运行数十个或数百个服务实例。您有一半的服务实例不再可以访问数据库。Prometheus中的警报规则配置为在每个服务实例无法与数据库通信时为其发送警报。结果,数百个警报被发送到Alertmanager。
作为用户,人们只希望获得一个页面,同时仍然能够准确查看受影响的服务实例。因此,可以将Alertmanager配置为按警报的群集和警报名称分组警报,以便它发送一个紧凑的通知。
警报的分组,分组通知的时间以及这些通知的接收者由配置文件中的路由树配置。

报警沉默

沉默是一种简单的特定时间静音提醒的机制。一种沉默是通过匹配器来配置,就像路由树一样。传入的警报会匹配RE,如果匹配,将不会为此警报发送通知。
在Alertmanager的Web界面中配置沉默。

报警抑制

抑制是指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。
例如,当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。
抑制机制可以通过Alertmanager的配置文件来配置。

高可用性

Alertmanager支持配置以创建高可用性集群。
image.png

Alert的三种状态:
1. pending:警报被激活,但是低于配置的持续时间。这里的持续时间即rule里的FOR字段设置的时间。改状态下不发送报警。
2. firing:警报已被激活,而且超出设置的持续时间。该状态下发送报警。
3. inactive:既不是pending也不是firing的时候状态变为inactive
prometheus触发一条告警的过程:
prometheus—->触发阈值—->超出持续时间—->alertmanager—->分组|抑制|静默—->媒体类型—->邮件|钉钉|微信等。

image.png

配置文件详解

配置文件 (alertmanager.yml)

:::info 要指定要加载的配置文件,请使用该—config.file标志。 :::

  1. ./alertmanager --config.file=alertmanager.yml

全局配置项

  1. global:
  2. resolve_timeout: 5m #处理超时时间,默认为5min
  3. smtp_smarthost: 'smtp.sina.com:25' # 邮箱smtp服务器代理
  4. smtp_from: '******@sina.com' # 发送邮箱名称
  5. smtp_auth_username: '******@sina.com' # 邮箱名称
  6. smtp_auth_password: '******' #邮箱密码


# 定义路由树信息

  1. route:
  2. group_by: ['alertname'] # 报警分组名称
  3. group_wait: 10s # 最初即第一次等待多久时间发送一组警报的通知
  4. group_interval: 10s # 在发送新警报前的等待时间
  5. repeat_interval: 1m # 发送重复警报的周期
  6. receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称


# 定义警报接收者信息

  1. receivers:
  2. - name: 'email' # 警报
  3. email_configs: # 邮箱配置
  4. - to: '******@163.com' # 接收警报的email配置

一个inhibition规则是在与另一组匹配器匹配的警报存在的条件下,使匹配一组匹配器的警报失效的规则。两个警报必须具有一组相同的标签。

  1. inhibit_rules:
  2. - source_match:
  3. severity: 'critical'
  4. target_match:
  5. severity: 'warning'
  6. equal: ['alertname', 'dev', 'instance’]
  1. global:
  2. resolve_timeout: 5m
  3. smtp_smarthost: 'smtp.163.com:25'
  4. smtp_from: 'xxx@163.com'
  5. smtp_auth_username: 'xxx@163.com'
  6. smtp_auth_password: 'xxxxxx'
  7. smtp_require_tls: false
  8. route: # route用来设置报警的分发策略
  9. group_by: ['alertname'] # 采用哪个标签来作为分组依据
  10. group_wait: 10s # 组告警等待时间。也就是告警产生后等待10s,如果有同组告警一起发出
  11. group_interval: 10s # 两组告警的间隔时间
  12. repeat_interval: 20m # 重复告警的间隔时间,减少相同邮件的发送频率
  13. receiver: 'default-receiver' # 设置默认接收人
  14. routes: # 可以指定哪些组接手哪些消息
  15. - receiver: 'default-receiver'
  16. continue: true
  17. group_wait: 10s
  18. - receiver: 'fping-receiver'
  19. group_wait: 10s
  20. match_re: #根据标签分组,匹配标签dest=szjf的为fping-receiver组
  21. dest: szjf
  22. receivers:
  23. - name: 'default-receiver'
  24. email_configs:
  25. - to: 'xxxxxxxx@qq.com'
  26. - name: "fping-receiver"
  27. webhook_configs:
  28. - url: 'http://127.0.0.1:9095/dingtalk'
  29. send_resolved: true

启动进程

检查alertmanager配置文件

  1. ./amtool check-config alertmanager.yml


启动alertmanager

  1. ./alertmanager --config.file=alertmanager.yml

访问http://127.0.0.1:9093,访问Alertmanager UI界面,可以看到接收到ErrorRateHigh告警:

高可用性(HA)

Alertmanager的高可用性已在许多公司投入生产使用,并且默认情况下处于启用状态。
重要提示:Alertmanager 0.15及更高版本中都需要UDP和TCP,集群才能正常工作。
要创建Alertmanager的高可用性集群,需要将实例配置为彼此通信。使用—cluster.*标志进行配置 。
cluster.listen-address标志中选择的端口是需要cluster.peer在其他对等方的标志中指定的端口。

节点:

  1. /usr/bin/alertmanager
  2. --cluster.listen-address="ip1:12001" # 当前节点ip和自定义的端口号
  3. --log.level=debug

·
其他节点配置:

  1. /usr/bin/alertmanager
  2. --cluster.listen-address="ip2:12002" # 当前节点ip和自定义的端口号:
  3. --cluster.peer=ip1:12001 # 选择一个节点加入集群
  4. --log.level=debug


要将您的Prometheus 1.4或更高版本的实例指向多个Alertmanager,请在您的prometheus.yml配置文件中对其进行配置,例如:
警告:

  1. alertmanagers
  2. - static_configs
  3. - targets
  4. - alertmanager19093
  5. - alertmanager29093
  6. - alertmanager39093

:::danger 重要信息:不要在Prometheus及其Alertmanagers之间负载均衡流量,而是将Prometheus指向所有Alertmanagers的列表。
Alertmanager实施期望将所有警报发送到所有Alertmanager,以确保高可用性。 :::

.tmpl模板的配置

  1. 1test.tmpl
  2. {{ define "test.html" }}
  3. <table border="1">
  4. <tr>
  5. <td>报警项</td>
  6. <td>实例</td>
  7. <td>报警阀值</td>
  8. <td>开始时间</td>
  9. </tr>
  10. {{ range $i, $alert := .Alerts }}
  11. <tr>
  12. <td>{{ index $alert.Labels "alertname" }}</td>
  13. <td>{{ index $alert.Labels "instance" }}</td>
  14. <td>{{ index $alert.Annotations "value" }}</td>
  15. <td>{{ $alert.StartsAt }}</td>
  16. </tr>
  17. {{ end }}
  18. </table>
  19. {{ end }}

:::tips 注:上述Labels项,表示prometheus里面的可选label项。annotation项表示报警规则中定义的annotation项的内容。 :::
demo:
配置alertmanager.yml:

  1. global:
  2. resolve_timeout: 5m
  3. smtp_smarthost: 'smtp.sina.com:25'
  4. smtp_from: 'xxxxx@sina.com'
  5. smtp_auth_username: 'xxxxx@sina.com'
  6. smtp_auth_password: 'xxxx' #客户端授权码 ok 密码测过 不行
  7. # 定义模板信息
  8. templates:
  9. - 'template/*.tmpl' # 路径
  10. route:
  11. group_by: ['alertname']
  12. group_wait: 10s
  13. group_interval: 10s
  14. repeat_interval: 1h
  15. receiver: 'mail'
  16. receivers:
  17. - name: 'web.hook'
  18. webhook_configs:
  19. - url: 'http://127.0.0.1:5001/'
  20. - name: 'mail'
  21. email_configs:
  22. - to: 'xxxxx@163.com' #163邮箱
  23. html: '{{ template "test.html" . }}' # 设定邮箱的内容模板
  24. headers: { Subject: "[WARN] 报警邮件"} # 接收邮件的标题
  25. inhibit_rules:
  26. - source_match:
  27. severity: 'critical'
  28. target_match:
  29. severity: 'warning'
  30. equal: ['alertname', 'dev', 'instance’]

启动服务

  1. ./amtool check-config alertmanager.yml

其中:
corp_id、agent_id、api_secret为微信企业号的配置;
to_user为企业号通讯录人员;
报警再次发送时间为group_interval+repeat_interval,也就是先等待group_interval,再等待repeat_interval。