官方文档: CONFIGURATION
模板配置: simple.yml
可视化路由编辑器: Routing tree editor
Alertmanager 配置文件解析
首先来看一个简单的 Alertmanager 的配置示例
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64global:
resolve_timeout: 5m
# 邮件服务器配置
smtp_smarthost: smtp.163.com:25
smtp_from: 15626580887@163.com
smtp_auth_username: 15626580887@163.com
smtp_auth_password: 'xsdadwacaweasdad'
# 微信 API 配置
wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
wechat_api_secret: 'xcsdsadasdasdsdddddddddasmw'
wechat_api_corp_id: 'dasdwdaasdasxzzcas'
templates:
- 'template/*.tmpl'
route:
receiver: Default
group_by:
- namespace
- job
- alertname
routes:
- receiver: Watchdog
match:
alertname: Watchdog
- receiver: Critical
match:
severity: critical
group_wait: 30s
group_interval: 5m
repeat_interval: 10m
inhibit_rules:
- source_match:
severity: critical
target_match_re:
severity: warning|info
equal:
- namespace
- alertname
- source_match:
severity: warning
target_match_re:
severity: info
equal:
- namespace
- alertname
receivers:
- name: Default
email_configs:
- send_resolved: true
to: kubernetes_guide@163.com
from: kubernetes_guide@163.com
hello: 163.com
smarthost: smtp.163.com:465
auth_username: kubernetes_guide@163.com
auth_password: <secret>
headers:
From: kubernetes_guide@163.com
Subject: '{{ template "email.default.subject" . }}'
To: kubernetes_guide@163.com
html: '{{ template "email.default.html" . }}'
require_tls: false
- name: Watchdog
... 省略N行 ...
- name: Critical
... 省略N行 ...
Alertmanager 的配置文件主要分为五大块:
- Global: 全局配置,主要用来配置一些通用的配置,比如邮件通知的账号,密码,SMTP 服务器,微信告警等。Global 块配置下的配置选项在本配置文件内的所有配置项下可见,但是文件内其它位置的子配置可以覆盖 Global 配置;
- Templates: 用于防止自定义模板的位置;
- Route: 告警路由配置,用于告警信息的分组路由,可以将不同分组的告警发送给不同的收件人。比如将数据库告警发送给DBA,服务器告警发送给OPS;
- Inhibit_rules: 告警抑制,主要用于减少告警的次数,防止 “告警轰炸”。比如某个宿主机宕机,可能会引起容器重建、漂移、服务不可用等一系列问题,如果每个异常均有告警,会一次性发送很多告警,造成告警轰炸,并且也会干扰定位问题的思路,所以可以使用告警抑制,屏蔽由宿主机宕机引来的其他问题,只发送宿主机宕机的消息即可;
- Receivers: 告警收件人配置,每个receiver都有一个名字,经过route分组并且路由后需要指定一个receiver,就是在此位置配置的。
Alertmanager 路由规则
了解完 Alertmanager 主要的配置块后,接下来需要对 Alertmanager 比较重要的 Route 进行单独讲解,其它配置会在实践中进行补充。
以上配置示例文件中的 route 配置内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16route:
receiver: Default
group_by:
- namespace
- job
- alertname
routes:
- receiver: Watchdog
match:
alertname: Watchdog
- receiver: Critical
match:
severity: critical
group_wait: 30s
group_interval: 5m
repeat_interval: 10m
route 配置块的主要内容如下:
- receiver: 告警的通知目标,需要和
receivers
配置块中的name
进行匹配。需要注意的是route.routes
下也可以有receiver
配置,优先级高于route.receiver
配置的默认接收人,当告警没有匹配到子路由时,会使用route.receiver
进行通知,比如上述配置中的Default
; - group_by: 分组配置,值类型为列表。比如配置成 [‘job’, ‘severity’],代表告警信息包含
job
和severity
标签的会进行分组,且标签的key
和value
都相同才会被分到一组; - continue: 决定匹配到第一个路由后,是否继续后续匹配。默认为
false
,即匹配到第一个子节点后停止继续匹配; - match: 一对一匹配规则,比如match配置的为job: mysql,那么具有job=mysql的告警会进入该路由;
- match_re: 和match类似,只不过是match_re是正则匹配;
- group_wait: 告警通知等待,值类型为字符串。若一组新的告警产生,则会等
group_wait
后再发送通知,该功能主要用于当告警在很短时间内接连产生时,在group_wait
内合并为单一的告警后再发送,防止告警过多,默认值30s; - group_interval: 同一组告警通知后,如果有新的告警添加到该组中,再次发送告警通知的时间,默认值为5m;
- repeat_interval: 如果一条告警通知已成功发送,且在间隔
repeat_interval
后,该告警仍然未被设置为resolved
,则会再次发送该告警通知,默认值4h。
Alertmanager 邮件通知
Prometheus Stack 安装的监控方案中,想要配置邮件监控,需要找到 Alertmanager 的配置文件,然后进行修改。Alertmanager 的配置文件内容如下
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
49
50
51# cd kube-prometheus/manifests
# cat alertmanager-secret.yaml
apiVersion: v1
kind: Secret
metadata:
labels:
alertmanager: main
app.kubernetes.io/component: alert-router
app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 0.22.2
name: alertmanager-main
namespace: monitoring
stringData:
alertmanager.yaml: |-
"global":
"resolve_timeout": "5m"
"inhibit_rules":
- "equal":
- "namespace"
- "alertname"
"source_match":
"severity": "critical"
"target_match_re":
"severity": "warning|info"
- "equal":
- "namespace"
- "alertname"
"source_match":
"severity": "warning"
"target_match_re":
"severity": "info"
"receivers":
- "name": "Default"
- "name": "Watchdog"
- "name": "Critical"
"route":
"group_by":
- "namespace"
"group_interval": "5m"
"group_wait": "30s"
"receiver": "Default"
"repeat_interval": "12h"
"routes":
- "match":
"alertname": "Watchdog"
"receiver": "Watchdog"
- "match":
"severity": "critical"
"receiver": "Critical"
type: Opaque在 alertmanager-secret.yaml 文件中的 global 项中添加配置如下
1
2
3
4
5
6
7
8
9
10
11stringData:
alertmanager.yaml: |-
"global":
"resolve_timeout": "5m"
smtp_from: "15626580887@163.com"
smtp_smarthost: "smtp.163.com:465"
smtp_hello: "163.com"
smtp_auth_username: "15626580887@163.com"
smtp_auth_password: "QJUYMWJXXX"
smtp_require_tls: false
...将下面名称为 Default 的 receiver 配置更改为邮件通知,修改 alertmanager-secret.yaml 文件的 receivers 配置,内容如下
1
2
3
4
5
6
7"receivers":
- "name": "Default"
"email_configs":
- to: "2350686113@qq.com"
send_resolved: true
- "name": "Watchdog"
- "name": "Critical"- email_configs: 代表使用邮件通知;
- to: 收件人,此处为 2350686113@qq.com,可以配置多个,使用逗号隔开;
- send_resolved: 告警如果被解决是否发送解决通知。
接下来分析下路由规则(默认分组只有 namespace,在此基础上添加 job 和 alertname,当然不添加也是可以的)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16"route":
"group_by":
- "namespace"
- "job"
- "alertname"
"group_interval": "5m"
"group_wait": "30s"
"receiver": "Default"
"repeat_interval": "12h"
"routes":
- "match":
"alertname": "Watchdog"
"receiver": "Watchdog"
- "match":
"severity": "critical"
"receiver": "Critical"可以通过 Alertmanager 提供的 Web UI 查看分组信息,和 Prometheus 一致,将 Alertmanager 的 Service 改成 NodePort,或者使用 ingress 代理服务。
1
kubectl edit svc -n monitoring alertmanager-main
将修改好的 Alertmanager 配置更新到 Alertmanager
1
kubectl replace -f alertmanager-secret.yaml
稍等几分钟既可在 Alertmanager 的 web 界面查看到更改的配置,如下所示:
也可以查看到分组信息,如下所示:
此时 Default receiver 配置的邮箱会收到相关的告警信息,如下所示:
Alertmanager 企业微信通知
企业微信配置
包含创建部门,创建机器人应用,查看 AgentId 和 Secret(api secret),此处略,自行百度。
Alertmanager 配置
修改 Alertmanager 配置文件,添加企业微信告警。首先修改 global,添加一些通用配置,wechat_api_url 是固定配置,corp_id 为企业ID:
1
2
3
4
5global:
...
wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
wechat_api_secret: '60Afgp4CxxUv0EJPylbSosihys7EL53N-mwxxx'
wechat_api_corp_id: 'wwa755402ee7xxxxx'receivers 添加微信通知,如下
1
2
3
4
5
6
7
8
9
10
11
12"receivers":
- "name": "Default"
"email_configs":
- to: "2350686113@qq.com"
send_resolved: true
- name: "wechat-ops"
wechat_configs:
- send_resolved: true
to_party: 2
to_user: '@all'
agent_id: '1000004'
api_secret: '60Afgp4CxxUv0EJPylbSosihys7EL53N-mwxxx'更改路由配置,将 Watchdog 的告警发送给该部门,如下
1
2
3
4
5"routes":
- "match":
"alertname": "Watchdog"
"receiver": "wechat-ops"
"repeat_interval": "10m"更新 Alertmanager 的配置到 Kubernetes
1
# kubectl replace -f alertmanager-secret.yaml
等待几分钟后,可以在 Alertmanager Web UI 看到新配置,并且企业微信可以收到 Watchdog 的告警
自定义告警模板
首先修改 alertmanager-secret.yaml 添加微信自定义模板 wechat.tmpl
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149apiVersion: v1
kind: Secret
metadata:
name: alertmanager-main
namespace: monitoring
stringData:
email.tmpl: |
{{ define "email.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
========= <span style=color:red;font-size:36px;font-weight:bold;> 监控告警 </span>=========<br>
<span style=font-size:20px;font-weight:bold;> 告警程序:</span> Alertmanager <br>
<span style=font-size:20px;font-weight:bold;> 告警类型:</span> {{ $alert.Labels.alertname }} <br>
<span style=font-size:20px;font-weight:bold;> 告警级别:</span> {{ $alert.Labels.severity }} 级 <br>
<span style=font-size:20px;font-weight:bold;> 告警状态:</span> {{ .Status }} <br>
<span style=font-size:20px;font-weight:bold;> 故障主机:</span> {{ $alert.Labels.instance }} {{ $alert.Labels.device }} <br>
<span style=font-size:20px;font-weight:bold;> 告警主题:</span> {{ .Annotations.summary }} <br>
<span style=font-size:20px;font-weight:bold;> 告警详情:</span> {{ $alert.Annotations.message }}{{ $alert.Annotations.description}} <br>
<span style=font-size:20px;font-weight:bold;> 主机标签:</span> {{ range .Labels.SortedPairs }} <br> [{{ .Name }}: {{ .Value | html }} ]{{ end }}<br>
<span style=font-size:20px;font-weight:bold;> 故障时间:</span> {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
========= = end = =========<br>
<br>
<br>
<br>
<br>
<div>
<div style=margin:40px>
<p style=font-size:20px>运维部门</p>
<p style=color:red;font-size:14px>
(这是一封自动发送的邮件,请勿回复。)
</p>
</div>
<div align=right style="margin:40px;border-top:solid 1px gray" id=bottomTime>
<p style=margin-right:20px>
Prometheus 监控平台
</p>
<label style=margin-right:20px>
{{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 " }}<br>
</label>
</div>
</div>
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
========= <span style=color:#00FF00;font-size:24px;font-weight:bold;> 告警恢复 </span>=========<br>
<span style=font-size:20px;font-weight:bold;> 告警程序:</span> Alertmanager <br>
<span style=font-size:20px;font-weight:bold;> 告警主题:</span> {{ $alert.Annotations.summary }}<br>
<span style=font-size:20px;font-weight:bold;> 告警主机:</span> {{ .Labels.instance }} <br>
<span style=font-size:20px;font-weight:bold;> 告警类型:</span> {{ .Labels.alertname }}<br>
<span style=font-size:20px;font-weight:bold;> 告警级别:</span> {{ $alert.Labels.severity }} 级 <br>
<span style=font-size:20px;font-weight:bold;> 告警状态:</span> {{ .Status }}<br>
<span style=font-size:20px;font-weight:bold;> 告警详情:</span> {{ $alert.Annotations.message }}{{ $alert.Annotations.description}}<br>
<span style=font-size:20px;font-weight:bold;> 故障时间:</span> {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
<span style=font-size:20px;font-weight:bold;> 恢复时间:</span> {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
{{- end }}
========= = end = =========
<br>
<br>
<br>
<br>
<div>
<div style=margin:40px>
<p style=font-size:20px>运维部门</p>
<p style=color:red;font-size:14px>
(这是一封自动发送的邮件,请勿回复。)
</p>
</div>
<div align=right style="margin:40px;border-top:solid 1px gray" id=bottomTime>
<p style=margin-right:20px>
Prometheus 监控平台
</p>
<label style=margin-right:20px>
{{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 " }}<br>
</label>
</div>
</div>
{{- end }}
{{- end }}
{{- end }}
wechat.tmpl: |-
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
==========异常告警==========
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
实例信息: {{ $alert.Labels.instance }}
{{- end }}
{{- if gt (len $alert.Labels.namespace) 0 }}
命名空间: {{ $alert.Labels.namespace }}
{{- end }}
{{- if gt (len $alert.Labels.node) 0 }}
节点信息: {{ $alert.Labels.node }}
{{- end }}
{{- if gt (len $alert.Labels.pod) 0 }}
实例名称: {{ $alert.Labels.pod }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
==========异常恢复==========
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
实例信息: {{ $alert.Labels.instance }}
{{- end }}
{{- if gt (len $alert.Labels.namespace) 0 }}
命名空间: {{ $alert.Labels.namespace }}
{{- end }}
{{- if gt (len $alert.Labels.node) 0 }}
节点信息: {{ $alert.Labels.node }}
{{- end }}
{{- if gt (len $alert.Labels.pod) 0 }}
实例名称: {{ $alert.Labels.pod }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- end }}
{{- end }}
alertmanager.yaml: |-
"global":
"resolve_timeout": "5m"
smtp_from: "15626580887@163.com"
smtp_smarthost: "smtp.163.com:465"
...在 templates 字段添加模板位置,如下
1
2
3
4templates:
- '/etc/alertmanager/config/*.tmpl'
"inhibit_rules":
...配置 wechat-ops receiver 使用该模板:
1
2
3
4
5
6
7"receivers":
- name: "wechat-ops"
wechat_configs:
- send_resolved: true
to_party: 2
...
message: '{{ template "wechat.default.message" . }}'{{ template "wechat.default.message" . }} 配置的 `wechat.default.message`,是模板文件 define 定义的名称:{{ define "wechat.default.message" }},并非文件名称。
将配置更新到 Alertmanager
1
# kubectl replace -f alertmanager-secret.yaml
等待几分钟后,可以在 Alertmanager 的 Pod 中看到该模板:
1
2
3# kubectl exec -n monitoring alertmanager-main-0 -c alertmanager -- ls /etc/alertmanager/config
alertmanager.yaml
wechat.tmpl之后再次查看收到的微信告警内容,格式已经变为自定义的告警模板。