Prometheus 实现邮件告警
一: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.gz2. 解压安装 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 alertmanager3. 修改配置文件 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:90936.在 prometheus 配置文件中配置 altermanager 信息
1)备份 prometheus 配置文件
cp /usr/local/prometheus/prometheus.yml /usr/local/prometheus/prometheus.yml_202208312)修改 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.yml7.修改配置后可以通过如下方案重新加载
curl -lv -X POST http://localhost:9099/-/reload8.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: 5msmtp_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: falseroute:# 这里的标签列表是接收到报警信息后的重新分组标签,例如,接收到的报警信息里面有许多具有 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: receiver1match_re:company: aaa- receiver: receiver2group_interval: 1hmatch_re:company: aaaalertname: 主机失联- receiver: receiver1match_re:company: bbbalertname: 主机失联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 -}}
**********告警通知**********
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
{{- end }}
=====================
告警主题: {{ $alert.Annotations.summary }}
告警详情: {{ $alert.Annotations.description }}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ 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 -}}
**********恢复通知**********
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
{{- end }}
=====================
告警主题: {{ $alert.Annotations.summary }}
告警详情: {{ $alert.Annotations.description }}
故障时间: {{ ($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 -}}
{{- 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_rule2.下载常用告警规则
https://awesome-prometheus-alerts.grep.to/
比如下面是 mysql 数据库的一些告警规则3.检查告警规则格式是否正确
/usr/local/prometheus/promtool check rules /usr/local/prometheus/alert_rule/mysql_rule.yml4.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.yml4)重新加载 prometheus 配置文件
curl -X POST http://localhost:9090/-/reload5)在 prometheus 检查配置的告警规则是否生效
在重新加载 prometheus 配置之前,prometheus中查不到告警规则(如果没有配置的话)

重新加载 prometheus 配置后,能看到我们刚刚配置的所有告警规则

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
