前言
在前面的二节只是简单介绍了Prometheus监控配置可以让读者快速上手,本节主要介绍Prometheus告警配置,比如邮件通知短信通知
AlertManager配置
下载
docker pull prom/alertmanager:v0.25.0
配置
在本地data/prometheus/alertmanager/目录创建alertmanager.yml配置文件
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
Alertmanager的配置主要包含两个部分:路由(route)以及接收器(receivers)。所有的告警信息都会从配置中的顶级路由(route)进入路由树,根据路由规则将告警信息发送给相应的接收器。
在Alertmanager中可以定义一组接收器,比如可以按照角色(比如系统运维,数据库管理员)来划分多个接收器。接收器可以关联邮件,Slack以及其它方式接收告警信息。
启动
docker run --name alertmanager -d -p 9093:9093 -v /data/prometheus/alertmanager:/etc/alertmanager prom/alertmanager:v0.25.0
查看运行状态
Alertmanager启动后可以通过9093端口访问,http://127.0.0.1:9093
Alert菜单下可以查看Alertmanager接收到的告警内容。Silences菜单下则可以通过UI创建静默规则。
关联Prometheus与Alertmanager
在Prometheus的架构中被划分成两个独立的部分。Prometheus负责产生告警,而Alertmanager负责告警产生后的后续处理。因此Alertmanager部署完成后,需要在Prometheus中设置Alertmanager相关的信息。
编辑Prometheus配置文件prometheus.yml,并添加以下内容,这里的10.211.55.2是本地ip
alerting:
alertmanagers:
- static_configs:
- targets: ['10.211.55.2:9093']
报警规则配置
在prometheus.yml增加如下内容
rule_files:
- /prometheus/rules/*.rules
因为在容器启动时用主机的/data/prometheus目录映射到容器的/prometheus目录,因此在主机/data/prometheus/目录创建rules文件夹,并创建告警文件hoststats-alert.rules即可:
mkdir /data/prometheus/rules && cat <<"EOF"> /data/prometheus/rules/hoststats-alert.rules
groups:
- name: hostStatsAlert
rules:
- alert: hostCpuUsageAlert
expr: sum(avg without (cpu)(irate(node_cpu_seconds_total{mode!='idle'}[5m]))) by (instance) > 0.85
for: 1m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} CPU usgae high"
description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"
- alert: hostMemUsageAlert
expr: (node_memory_MemTotal - node_memory_MemAvailable)/node_memory_MemTotal > 0.85
for: 1m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} MEM usgae high"
description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"
EOF
重启Prometheus
docker restart prometheus
重启完成之后,访问http://localhost:9090/config,查看altering配置是否生效,出现如下红色标识则表示生效
访问http://localhost:9090/rules,查看规则是否生效,出现如下配置则生效
cpu拉高报警测试
在监控服务器执行以下命令,拉高cpu使用率
cat /dev/zero>/dev/null
运行以下命令后查看CPU使用率情况,如下图所示:
sum(avg without (cpu)(irate(node_cpu_seconds_total{mode!='idle'}[5m]))) by (instance)
Prometheus首次检测到满足触发条件后,hostCpuUsageAlert显示有一条告警信息,状态为firing表示已经推送给了altermanager
访问http://127.0.0.1:9093查看告警信息,可以为刚才推送信息
邮件通知测试
邮箱通知配置
修改alertmanager.yml为以下内容,替换对应账号即可
global:
smtp_smarthost: smtp.qq.com:465
smtp_from: 928552509@qq.com
smtp_auth_username: 928552509@qq.com
smtp_auth_identity: 928552509@qq.com
smtp_auth_password: 123
smtp_require_tls: false
route:
group_by: ['alertname']
receiver: 'default-receiver'
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receivers:
- name: default-receiver
email_configs:
- to: dongweizhao123@foxmail.com
send_resolved: true
重启
docker restart alertmanager
重启完成,访问http://127.0.0.1:9093/#/status,查看配置是否生效
cpu拉高测试
在目录服务器执行以下命令,拉高cpu
cat /dev/zero>/dev/null
查看prometheus已收到告警信息
等个一分钟左右,会推送给altermanager,altermanager等待30s,会推送至对应的邮箱,如下图
告警模版测试
在/data/prometheus/alertmanager目录下创建模版文件,这里的2006-01-02 15:04:05是go语言的日志格式,固定的
cat > /data/prometheus/alertmanager/notify-template.tmpl <<EOF
{{ define "test.html" }}
{{ range .Alerts }}
=========start==========<br>
告警级别: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} <br>
=========end==========<br>
{{ end }}
{{ end }}
EOF
- 关联告警模版
global:
smtp_smarthost: smtp.qq.com:465
smtp_from: 928552509@qq.com
smtp_auth_username: 928552509@qq.com
smtp_auth_identity: 928552509@qq.com
smtp_auth_password: wanxoybjxjypbecj
smtp_require_tls: false
templates: #添加模板
- '/etc/alertmanager/notify-template.tmpl' #指定路径
route:
group_by: ['alertname']
receiver: 'default-receiver'
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receivers:
- name: default-receiver
email_configs:
- to: dongweizhao123@foxmail.com
html: '{{ template "test.html" . }}'
send_resolved: true
-
重启altermanager
docker restart alertmanager -
拉高监控主机cpu
cat /dev/zero>/dev/null -
最终结果
配置增强
观察以上告警有以下问题
- 触发时间不对,用的是UTC时间
- 无法区分告警与恢复邮件
- 邮件标题看起来可读性比较差
下面针对上问题进行处理
模版调整
在以下时间增加28800e9,转换位东八区时间,即北京时间
{{ define "test.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{ range .Alerts }}
<h1 align="left" style="color:red;">告警</h1>
<pre>
告警级别: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
告警时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
</pre>
{{ end }}
{{ end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{ range .Alerts }}
<h1 align="left" style="color:green;">恢复</h1>
<pre>
告警名称:{{ .Labels.alertname }}<br>
告警级别:{{ .Labels.severity }}<br>
告警机器:{{ .Labels.instance }}<br>
告警详情:{{ .Annotations.summary }}<br>
告警时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
恢复时间:{{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
</pre>
{{- end }}
{{- end }}
{{- end }}
邮件增加标题
在headers增加Subject则为邮件标题,这里我们进行判断如果告警邮件标题为:系统监控告警恢复后,标题改为:系统监控告警恢复
global:
smtp_smarthost: smtp.qq.com:465
smtp_from: 928552509@qq.com
smtp_auth_username: 928552509@qq.com
smtp_auth_identity: 928552509@qq.com
smtp_auth_password: wanxoybjxjypbecj
smtp_require_tls: false
templates: #添加模板
- '/etc/alertmanager/notify-template.tmpl' #指定路径
route:
group_by: ['alertname']
receiver: 'default-receiver'
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receivers:
- name: default-receiver
email_configs:
- to: dongweizhao123@foxmail.com
html: '{{ template "test.html" . }}'
send_resolved: true
headers: { Subject: "系统监控告警{{- if gt (len .Alerts.Resolved) 0 -}}恢复{{ end }}" }
再次测试
再次重启,拉高cpu进行测试,告警信息如下
恢复通知邮件
以上只是简单的一些告警配置,如果要支持推送到飞书或者钉钉就需要使用web_hook进行配置,后续在进行介绍。