一:Prometheus 告警机制简介
警报一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的。警报规则在 Prometheus 定义,警报规则触发以后,才会将信息转发到给独立的组件 Alertmanager ,经过 Alertmanager 对警报的信息处理后,最终通过接收器发送给指定用户,另外在 Alertmanager 中没有通知组的概念,只能自己对软件重新Coding,或者使用第三方插件来实现。 注意,这个通知组不是Alertmanager中的group概念,不要混淆哦。国内常用 Email、Wechat(Robot)、Dingtalk(webhook)来接受警报通知。
二:安装alertmanager
1.下载 alertmanager
https://prometheus.io/download/
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
2. 解压安装 alertmanager
tar -xvf alertmanager-0.24.0.linux-amd64.tar.gz -C /usr/local
cd /usr/local
mv alertmanager-0.24.0.linux-amd64.tar.gz alertmanager
3. 修改配置文件 altermanager.yml
vim altermanager.yml
配置文件见下面的模板
#QQ邮箱服务器smtp@qq.com:465 ,smtp_require_tls一定要改为false,同时smtp_auth_password填写的是第三方登录 QQ 邮箱的授权码,非QQ账户登录密码,获取方式在 QQ 邮箱服务端设置开启 POP3/SMTP 服务时会提示
4. 启动 altermanager
cd /usr/local/alertmanager/
nohup ./alertmanager --config.file=alertmanager.yml &
5.访问 altermanager
http://119.8.238.94:9093
6.在 prometheus 配置文件中配置 altermanager 信息
1)备份 prometheus 配置文件
cp /usr/local/prometheus/prometheus.yml /usr/local/prometheus/prometheus.yml_20220831
2)修改 prometheus 配置文件
vi /usr/local/prometheus/prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- 127.0.0.1:9093 # 因为 prometheus 和 altermanager部署在同一个服务器上
3)检查配置文件格式是否正确
/usr/local/prometheus/promtool check config /usr/local/prometheus/prometheus.yml
7.修改配置后可以通过如下方案重新加载
curl -lv -X POST http://localhost:9099/-/reload
8.Alertmanager 部分参数
|--config.file="alertmanager.yml"|指定Alertmanager配置文件路径|
|--storage.path="data/"|Alertmanager的数据存放目录|
|--data.retention=120h |历史数据保留时间,默认为120h|
|--alerts.gc-interval=30m|警报gc之间的间隔|
|--web.external-url=WEB.EXTERNAL-URL|外部可访问的Alertmanager的URL(例如Alertmanager是通过nginx反向代理)|
|--web.route-prefix=WEB.ROUTE-PREFIX|web访问内部路由路径,默认是 --web.external-url|
|--web.listen-address=":9093"|监听端口,可以随意修改|
|--web.get-concurrency=0|并发处理的最大GET请求数,默认为0|
|--web.timeout=0|web请求超时时间|
|--cluster.listen-address="0.0.0.0:9094"|集群的监听端口地址。设置为空字符串禁用HA模式|
|--cluster.advertise-address=CLUSTER.ADVERTISE-ADDRESS|配置集群通知地址|
|--cluster.gossip-interval=200ms|发送条消息之间的间隔,可以以增加带宽为代价更快地跨集群传播。|
|--cluster.peer-timeout=15s|在同级之间等待发送通知的时间|
|--log.level=info|自定义消息格式 [debug, info, warn, error]|
|--log.format=logfmt|日志消息的输出格式: [logfmt, json]|
|--version|显示版本号|
8.配置邮件告警的 Alertmanager 配置文件模板
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:587'
smtp_from: 'xxx123@qq.com'
smtp_auth_username: 'xxx123@qq.com'
smtp_auth_password: 'qfgynqqvopjhbgbb'
smtp_hello: 'qq.com'
smtp_require_tls: false
route:
# 这里的标签列表是接收到报警信息后的重新分组标签,例如,接收到的报警信息里面有许多具有 cluster=A 和 alertname=LatncyHigh 这样的标签的报警信息将会批量被聚合到一个分组里面
group_by: ['alertname']
# 当一个新的报警分组被创建后,需要等待至少group_wait时间来初始化通知,这种方式可以确保您能有足够的时间为同一分组来获取多个警报,然后一起触发这个报警信息。
group_wait: 10s
# 当第一个报警发送后,等待'group_interval'时间来发送新的一组报警信息。
group_interval: 10s
# 如果一个报警信息已经发送成功了,等待'repeat_interval'时间来重新发送他们
repeat_interval: 1h
# 默认的receiver:如果一个报警没有被一个route匹配,则发送给默认的接收器
receiver: default_mail
# 上面所有的属性都由所有子路由继承,并且可以在每个子路由上进行覆盖
routes:
- receiver: receiver1
match_re:
company: aaa
- receiver: receiver2
group_interval: 1h
match_re:
company: aaa
alertname: 主机失联
- receiver: receiver1
match_re:
company: bbb
alertname: 主机失联
templates:
- './templates/*.tmpl'
receivers:
- name: 'default_mail'
email_configs:
- to: 'xxx123@qq.com'
send_resolved: true
# headers: { Subject: " 【监控告警】 {{ .CommonLabels.instance }} {{ .CommonLabels.alertname }} " } #标题
html: '{{ template "email.to.html" . }}' #模板
- name: 'receiver1'
email_configs:
- to: 'xxx456@qq.com,xxx567@qq.com'
send_resolved: true
# headers: { Subject: " 【监控告警】 {{ .CommonLabels.instance }} {{ .CommonLabels.alertname }} " } #标题
html: '{{ template "email.to.html" . }}' #模板
- name: 'receiver2'
email_configs:
- to: 'xxx789@qq.com'
send_resolved: true
# headers: { Subject: " 【监控告警】 {{ .CommonLabels.instance }} {{ .CommonLabels.alertname }} " } #标题
html: '{{ template "email.to.html" . }}' #模板
9.邮件通知模板如下:
{{ define "email.from" }}xxxx123@qq.com{{ end }}
{{ define "email.to" }}xxxx456@qq.com{{ end }}
{{ define "email.to.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
<h2>**********告警通知**********<h2>
告警类型: {{ $alert.Labels.alertname }} <br>
告警级别: {{ $alert.Labels.severity }} <br>
{{- end }}
===================== <br>
告警主题: {{ $alert.Annotations.summary }} <br>
告警详情: {{ $alert.Annotations.description }} <br>
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br>
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例: {{ $alert.Labels.instance }}{{- end -}}
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
<h2>**********恢复通知**********<h2>
告警类型: {{ $alert.Labels.alertname }} <br>
告警级别: {{ $alert.Labels.severity }} <br>
{{- end }}
===================== <br>
告警主题: {{ $alert.Annotations.summary }} <br>
告警详情: {{ $alert.Annotations.description }} <br>
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br>
恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br>
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例: {{ $alert.Labels.instance }}{{- end -}}
{{- end }}
{{- end }}
{{- end }}
NOTE:目前除开使用公司邮箱,不需要使用授权码登录外,像什么QQ邮箱,163邮箱,Sina邮箱等等都需要。几年之前还不用授权码的,可能是他们的安全的重视程度过高了。这篇文章来讲解如何通过qq号实现邮箱告警。所以如果你使用的是QQ邮箱那么你需要开启POP3/SMTP服务,并且获取授权码,smtp_auth_password 配置的就是授权码,而不是你qq邮箱的登录密码。下面以 QQ 邮箱为例,演示下如何开启
往下拖找到开启服务,点击开启POP3/SMTP服务 并且生产授权码
三:Prometheus 添加告警规则
1.新建告警规则目录
mkdir -p /usr/local/prometheus/alert_rule
2.下载常用告警规则
https://awesome-prometheus-alerts.grep.to/
比如下面是 mysql 数据库的一些告警规则
3.检查告警规则格式是否正确
/usr/local/prometheus/promtool check rules /usr/local/prometheus/alert_rule/mysql_rule.yml
4.prometheus 配置文件中添加告警规则
1)备份 prometheus 配置文件
cp /usr/local/prometheus/prometheus.yml /usr/local/prometheus/prometheus.yml_20220831
2)修改 prometheus 配置文件添加告警规则
vi /usr/local/prometheus/prometheus.yml
rule_files:
- "/usr/local/prometheus/alert_rule/*.yml"
可以直接指定具体文件,例如:
rule_files:
- "/etc/prometheus/rules/myrules.yml"
文件路径也支持正则表达式方式,如果有多个文件时,可以用下列的方式匹配
rule_files:
- "/etc/prometheus/rules/*.yml"
- "/data/prometheus/rules/prd-*.yml"
3)检查修改后prometheus 配置文件格式是否正常
/usr/local/prometheus/promtool check config /usr/local/prometheus/prometheus.yml
4)重新加载 prometheus 配置文件
curl -X POST http://localhost:9090/-/reload
5)在 prometheus 检查配置的告警规则是否生效
在重新加载 prometheus 配置之前,prometheus中查不到告警规则(如果没有配置的话)
重新加载 prometheus 配置后,能看到我们刚刚配置的所有告警规则