AlertManager
AlertManager处理由客户端应用程序(如Prometheus服务器)发送的警报。
它负责重复数据消除、分组,并将它们路由到正确的接收器集成(如电子邮件、PagerDuty或OpsGenie)。
它还负责消除和抑制警报。
通过翻译官方文档可以了解到,AlertManager是负责为Prometheus(本身不会发送警报)发送警报的工具.
AlertManager不是简单发送警报,可以消除重复警报,分组,抑制警报功能.并支持多接收器.
Prometheus->触发定义的警报规则->AlertManager->发送警报到指定通知渠道.
为了能让Prometheus发送警报,我们需要:
- 搭建AlertManager服务.
- 定义AlertManager通知配置.
- 定义Prometheus警报规则并引入.
- 测试警报.
- 定义通知模板.
定义AlertManager通知配置
1 | global: |
以下是官方文档配置翻译的文档.供参考具体详细的配置介绍.不细看先略过到下个步骤.
路由块定义路由树中的节点及其子节点。如果未设置,则其可选配置参数将从其父节点继承。
每个警报都在配置的顶级路由处进入路由树,该路由树必须与所有警报匹配(即没有任何配置的匹配器)。
然后它遍历子节点。如果continue设置为false,则在第一个匹配的子级之后停止。
如果匹配节点上的continue为true,则警报将继续与后续同级节点匹配。
如果警报与节点的任何子节点不匹配(没有匹配的子节点,或者不存在),则基于当前节点的配置参数来处理警报。
1 | [ receiver: <string> ] |
<inhibit_rule>
当与另一组匹配器匹配的警报(源)存在时,禁止规则静默匹配匹配器集合的警报(目标)。
对于相等列表中的标签名称,目标和源警报必须具有相同的标签值。
从语义上讲,缺失的标签和空值的标签是一样的。
因此,如果源警报和目标警报中均缺少equal中列出的所有标签名称,则将应用抑制规则。
为了防止警报抑制自身,与规则的目标端和源端都匹配的警报不能被相同的警报(包括自身)抑制。
但是,我们建议选择目标和源匹配器时,警报不会同时匹配双方。这很容易推理,也不会引发这种特殊情况。
1 | # 必须在警报中完成的匹配项才能被禁用 |
1 | # 接收者的唯一名称 |
<email_config>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
47
48# 是否通知已解决的警报
[ send_resolved: <boolean> | default = false ]
# 要向其发送通知的电子邮件地址
to: <tmpl_string>
# 发件人地址
[ from: <tmpl_string> | default = global.smtp_from ]
# 发送电子邮件的SMTP主机
[ smarthost: <string> | default = global.smtp_smarthost ]
# 要标识到SMTP服务器的主机名
[ hello: <string> | default = global.smtp_hello ]
# SMTP身份验证信息.
[ auth_username: <string> | default = global.smtp_auth_username ]
[ auth_password: <secret> | default = global.smtp_auth_password ]
[ auth_secret: <secret> | default = global.smtp_auth_secret ]
[ auth_identity: <string> | default = global.smtp_auth_identity ]
# SMTP TLS要求
[ require_tls: <bool> | default = global.smtp_require_tls ]
# TLS配置
tls_config:
[ <tls_config> ]
# 电子邮件通知的HTML正文
[ html: <tmpl_string> | default = '{{ template "email.default.html" . }}' ]
# 电子邮件通知的正文
[ text: <tmpl_string> ]
# 更多标题电子邮件标题键/值对,重写通知实现以前设置的任何头
# 先前由通知实现设置的。
[ headers: { <string>: <tmpl_string>, ... } ]
<webhook_config>1
2
3
4
5
6
7
8# 是否通知已解决的警报
[ send_resolved: <boolean> | default = true ]
# 要向其发送HTTP POST请求的终结点
url: <string>
# http客户端的配置
[ http_config: <http_config> | default = global.http_config ]
微信json 格式
1 | { |
1 | # 是否通知已解决的警报 |
搭建AlertManager服务
部署AlertManager可以通过官网https://prometheus.io/download/下载二进制文件.
这里演示docker部署AlertManager服务.其他方式请参考官网.
docker部署前,需要先完成配置文件的工作.
我在/home/along/下创建了一个配置文件 touch alertmanager.yml
之后编辑 vi alertmanager.yml
,具体看上文的配置介绍.
启动容器:
1 | docker run -d -p 9093:9093 --name alertmanagter |
如果加载模板的话需要挂在一下模板目录(模板在下面有介绍):1
2
3
4docker run -d -p 9093:9093 --name alert9093
-v /home/along/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
-v /home/along/alertmanager/template:/alertmanager/template
quay.io/prometheus/alertmanager
服务端口9093,挂在刚才设定的配置文件.
访问IP:9093 可以查看AlertManager的web界面(类似prometheus的web界面).
定义Prometheus警报规则并引入配置
配置警报规则文件
警报规则文件顾名思义,你想监控的指标何时需要警报.
例如设备温度超过多少要警告.
创建alert.yml,touch alert.yml
1
2
3
4
5
6
7
8
9
10groups:
- name: metricsUp # 定义这组告警的组名
rules:
- alert: 监测对象挂了 # 警报名 可理解为警告的标题
expr: up{instance="192.168.23.11:9090"} == 0 # 判断某值的规则
for: 5m # 上面规则持续5分钟为0进行告警,5分钟内触发是pending状态
labels: # 定义警报标签
severity: waring # 定义警报等级为 waring
annotations: # 备注描述
summary: "设备: {{ $labels.instance }} 已断开5分钟" # 警告中呈现的具体信息可以写在这里
Prometheus引入配置
警报规则是Prometheus引入的文件.
Prometheus引入文件的方式:
1 | rule_files: |
测试警报
我们上面配置好之后,需要各服务已经读取到相关配置文件了之后开始测试.
上面的规则是监测某个监控节点断开,手动断开一个节点.然后5分钟之后观察是否得到警报.
当由警报时收到的邮件为:
访问AlertManager页面也可以看到告警信息:
这里图例有些是演示用,与其他可能不存在关系.(不是同时截图的业务,图片仅供参考)
静默操作演示
如果有些警报是我们调试的,例如我这里设置值偏低来演示ping值警报,如果我们测时候不想看到警报,可以通过静默来不让他总是发送警报.
之后点击create 就可以创建此警报的静默操作.
也可以通过正则,警报组名,实例等来静默各种警报.
定义通知模板
默认模板我们看到了,他是默认的一个告警模板,在我们测试时候可以使用,如果面向用户使用者似乎这个模板不太友好.
而且在面对多数据展示时,此模板也显得不是很清晰.
通过定义了模板,在触发不同警报可以通过AlertManager中,receivers选项来选择模板.
1 | templates: |
这段配置中,可以看到警报通过test.html作为模板的.他的位置在上面的定义中可以看到是 template/test.html (如果模板定制有错误,警报可能为空板,不能正常显示内容)
现在来配置这个test.html
在 /template/ 下创建 touch test.html
模板基于Go的模板系统,详情点击这里
如果不想深入连接可以结合默认模板模仿一下语法,默认模板点击这里
1 | {{ define "email.demo.html" }} |
模板保存后,测试邮件接收情况:
模板时区问题
Prometheus中所有时间都是UTC时间,为了便于我们展示友好时间(东八区),我们需要计算一下时间.
修改模板时间:
1 | <td>{{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}</td> |