一: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 邮箱为例,演示下如何开启

prometheus rule规则发送报警 prometheus短信告警_配置文件

 往下拖找到开启服务,点击开启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 rule规则发送报警 prometheus短信告警_配置文件_02

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

prometheus rule规则发送报警 prometheus短信告警_html_03