
写在之前
Alertmanager 只是在 Prometheus Server 触发报警规则后,接收报警内容的组件程序,把报警内容发送给 Alertmanager 后,由 Alertmanager 根据label标签决定如何发送、发送给谁、邮件报警、还是微信报警、报警内容是否聚合、是否抑制等。
邮件报警
邮件报警如何配置、验证,前面安装 alertmanager 的时候已经总结过,如果忘记了,可以回顾下之前的文章,这里主要说下配置文件的含义。
[root@master01 monitor]# cat alertmanager-configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: alertmanager
namespace: monitor
data:
alertmanager.yml: |-
global:
resolve_timeout: 1m
smtp_smarthost: 'smtp.163.com:465'
smtp_from: 'xxxx@163.com'
smtp_auth_username: 'xxxxx'
smtp_auth_password: 'xxxxx'
smtp_require_tls: false
route:
group_by: [alertname]
group_wait: 10s
group_interval: 10s
repeat_interval: 10m
receiver: default-receiver
receivers:
- name: 'default-receiver'
email_configs:
- to: 'k8svip@163.com'
send_resolved: true
[root@master01 monitor]#
以上结构非常的清晰,主要有global 全局配置、route 路由、receivers 接收者、templates 模板等几部分组成。
1. global 全局配置,可以定义一些全局使用的,这里配置了一个邮箱报警时,需要有一个发送者,由谁从哪里发送出去;
2. route 路由,就是把报警信息发送给谁,这里可以配置多个routes,根据报警级别、严重程度,决定使用邮件发送,还是企业微信发送,是发送给运维,还是leader等;
3. receivers 接收者,这里定义报警接收途径,上面只定义了一个邮箱,可以配置叮叮报警、企业微信报警、自定义Webhook、短信等接收报警途径;
4. templates 模板配置,定制化一些报警模板,文章会给出实例。
下面给出配置中常用的几个字段的含义:
| 重要字段说明 | 含义 |
| resolve_timeout | 设置解析超时时间; |
| group_by | 按什么聚合,一起发送报警 ; |
| group_wait | 组报警等待时间 ,等待是否有相同组的报警出来,如果有,一起发送; |
| group_interval | 组报警时间间隔,上一次组报警与这次组报警的最小间隔; |
| repeat_interval | 重复报警时间间隔; |
| receiver | 报警通知的接收者 |
| send_resolved | 报警是否发送恢复邮件; |
| match | 报警按标签完全匹配 |
| match_re | 报警按标签正则匹配 |
企业微信报警
注册企业微信
https://work.weixin.qq.com/ 很简单直接注册即可。
创建应用
选择应用管理选项卡,创建应用如下图:

AgentId:1000002
Secret:BLZM-b1cLROgPSujUO3X2Pjlj5QQ0rCoBIn3xVk-U6Q
修改alertmanager 配置
[root@master01 monitor]# cat alertmanager-configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: alertmanager
namespace: monitor
data:
alertmanager.yml: |-
global:
resolve_timeout: 1m
smtp_smarthost: 'smtp.163.com:465'
smtp_from: 'xxx@163.com'
smtp_auth_username: 'xxx'
smtp_auth_password: 'xxx'
smtp_require_tls: false
route:
group_by: [alertname]
group_wait: 10s
group_interval: 10s
repeat_interval: 10m
receiver: wechat
routes:
- match:
team: admin
receiver: support_team
- match_re:
severity: ^(warnning|critical)$
team: admin
receiver: wechat
receivers:
- name: 'default-receiver'
email_configs:
- to: 'k8svip@163.com'
send_resolved: true
- name: "support_team"
email_configs:
- to: 'support_team@163.com'
send_resolved: true
- name: 'wechat'
wechat_configs:
- corp_id: xxxxxxx
to_user: '@all'
agent_id: 1000002
api_secret: BLZM-b1cLROgPSujUO3X2Pjlj5QQ0rCoBIn3xVk-U6Q
message: '{{ template "wechatx.html" . }}'
send_resolved: true
templates:
- '/alertmanager/*.tmpl'
[root@master01 monitor]#
corp_id:企业唯一标识,在"我的企业" --> "CorpID";
to_user:'@all' ,发送报警到所有人,也可以指定用户;
agent_id:应用ID,创建应用时产生的AgentId;
api_secret:应用对应的secret,创建应用时产生的Secret
message:这里使用了一个模板,让报警更为直观,个人可以根据爱好,自定义即可;
secret: 企业微信("企业应用"-->"自定应用"[Prometheus]--> "Secret") ;
模板定义
templates:这个选项,指定模板文件在哪里,可以通过configmap的形式,创建Pod时,加载configmap即可。
[root@master01 monitor]# cat cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: monitor
name: alertemp
data:
wechat.tmpl: |
{{ define "wechatx.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
@故障告警
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
---------------------
{{- end }}
---告警详情---
告警详情: {{ $alert.Annotations.message }}
故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
---参考信息---
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }}{{- end }}
---------------------
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
@故障恢复
恢复类型: {{ $alert.Labels.alertname }}
恢复级别: {{ $alert.Labels.severity }}
=====================
{{- end }}
===故障恢复详情===
故障恢复详情: {{ $alert.Annotations.message }}
故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
恢复时间: {{ $alert.EndsAt.Format "2006-01-02 15:04:05" }}
===故障恢复参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}恢复实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}恢复实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}恢复物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}恢复pod名称: {{ $alert.Labels.pod_name }};{{- end }}
=====================
{{- end }}
{{- end }}
{{- end }}
[root@master01 monitor]#
创建Pod时需要挂载

验证
手动把etcd一台关掉进程,看是否报警,如果报警,然后再开启;

silenced(静默)
静默就是设置一个维护时间,这段时间不再报警,如下:

创建默认

创建完成后,在Alerts中就没有了,会出现在silences标签下面,在这里可以设置取消或者编辑

inhibited(抑制)
配置文件中添加报警抑制规则 inhibit_rules,这个对于告警收敛非常有用,可以自行google测试下。
总结
Alertmanager通过labels进行匹配,其实它是根据之前定义报警规则中定义的labels进行标签匹配,确认使用哪个路由,根据路由决定使用哪种方式报警,还总结了如何使用模板进行个性化定制报警等,最后我司使用的企业微信实现方式。
这里有遗留一个问题,时差问题,后面文章解决。




