超详细 Centos7下Prometheus Alertmanager配置钉钉告警与邮箱告警(已亲手验证)

发布时间:2024年01月08日

文章目录

一、Alertmanager介绍

Prometheus自身不具备告警能力,需要结合AlertManager实现监控指标告警。 由Prometheus配置告警规则,当告警规则触发后,会把告警信息推送给Altermanager,AlertManager收到告警之后在根据配置的路由,根据报警级别不同分别发送给不同的receive(收件人),AlertManager可以实现email、企业微信、钉钉等报警。Prometheus作为客户端,Alertmanager负责处理来自客户端的告警通知。对告警通知进行分组、去重后,根据路由规则将其路由到不同的receiver。

Alertmanager 三大核心

1、分组告警:

当多个告警触发时,可以将它们按照一定的规则进行分组,然后将这些分组信息合并成一个通知。这样可以避免接收到大量重复的告警通知,使得告警信息更加简洁明了。在Alertmanager中,可以通过配置文件来定义告警的分组规则。

分组告警在Alertmanager中(alertmanager.yml)的参数配置解析:

route:
//根据标签进行分组,alertname就是告警规则的名称,多个标签可以以逗号隔开
  group_by: ['alertname']   
//发送告警等待时间,也就是一个时间范围内,如果同一组中有其他报警则一并发送       
  group_wait: 10s  
//当触发了一组告警后,下一组报警触发的间隔               
  group_interval: 10s
//告警产生没有修复重复报警的时间间隔    
  repeat_interval: 10m

2、告警抑制

当某一个告警发出后,可以设置抑制机制,避免重复发送由此告警引发的其他告警。这样可以避免接收到大量与实际问题无关的告警通知,提高告警处理的效率。

告警抑制在Alertmanager中(alertmanager.yml)的参数配置解析:

inhibit_rules:
  - source_match:
// 源标签警报触发时抑制含有目标标签的警报,在当前警报匹配serverity=critical
      serverity: 'critical'                        
    target_match:
// 抑制`serverity=warning`类型告警
      serverity: 'warning'
// 告警中包含的分组名称。标签内容相同才会抑制,也就是说警报中三个标签值相同才会被抑制。equal: ['alertname', 'dev', 'instance']

3、告警静默

静默是指定周期时间内不再触发某一个报警 alertManager将检查传入警报是否与活动静默的所有相等或正则表达式匹配。匹配静默规则,则不会为该警报发送任何通知。

可以在Alertmanager 网页界面(http://alertmanager的机子ip:9093)设置静默告警规则:
在这里插入图片描述
在这里插入图片描述

Prometheus 告警级别

告警级别分为 warning、critical和emergency 。严重等级依次递增。

Prometheus触发告警实现的流程

rometheus 对监控项进行监控,当一个监控项的阈值到达一定指标时,由告警规则中配置的for持续时间进行判断,当达到一定时间都超过了阈值,则将报警推送给AlertManager,AlertManager收到报警后进行分组、抑制、静默,最后在通过我们配置的接收器,将报警发送给邮箱、微信、钉钉
在这里插入图片描述

二、部署Alertmanager

官方网站下载 Alertmanager https://prometheus.io/download/
部署在任意机子上

1,下载alertmanager

wget https://githubfast.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz

2,部署alertmanager

tar -xzvf alertmanager-0.24.0.linux-amd64.tar.gz -C /usr/local
cd /usr/local/
mv alertmanager-0.24.0.linux-amd64/ alertmanager

3,创建alertmanager 存储目录

mkdir  -p /var/lib/alertmanager

alertmanager 配置文件介绍

global:
  resolve_timeout      //解析超时时间,也就是报警恢复不是立马发送的,而是在一个时间范围内不在触发报警,才能发送恢复报警,默认为5分钟
  smtp_from            //收件人的邮箱地址
  smtp_smarthost       //邮箱提供商的smtp地址
  smtp_auth_username   //收件人的邮箱账号
  smtp_auth_password   //邮箱授权码
  smtp_require_tls     //是否需要tls协议,默认是true
  wechart_api_url      //微信api地址
  wbchart_api_secret   //密码
  wechat_api_corp_id   //机器人应用的id
route:group_by        //采用哪个标签作为分组
  group_wait           //分组等待的时间,收到报警不是立马发送出去,而是等待一段时间,看看同一组中是否有其他报警,如果有一并发送
  group_interval       //告警时间间隔
  repeat_interval      //重复告警时间间隔,可以减少发送告警的频率
  receiver             //接收者是谁
  routes               //子路由配置
    
receivers:name        //接收者的名字,这里和route中的receiver对应
  email_configs
  - to                 //接收者的邮箱地址

4,alertmanager 钉钉告警配置

vim  /usr/local/alertmanager/alertmanager.yml
route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'dingtalk_webhook'
receivers:
   - name: 'dingtalk_webhook'
     webhook_configs:
     - url: 'http://localhost:8060/dingtalk/webhook1/send'
       send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

5,检查alertmanager配置文件格式

cd /usr/local/alertmanager
./amtool check-config alertmanager.yml

6,创建 alertmanager系统服务启动文件

vim  /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager
Documentation=https://prometheus.io/
After=network.target

[Service]
User=root
Group=root
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

7,启动alertmanager

systemctl daemon-reload
systemctl restart alertmanager   && systemctl enable alertmanager

8,http 访问alertmanager

http://你的IP:9093

在这里插入图片描述

11,热加载alertmanager配置文件生效

curl -lv -X POST http://localhost:9093/-/reload

12,Prometheus集成AlertManager

Prometheus Server中的prometheus.yml文件中配置与Alertmanager通信的地址和端口

vim /usr/local/prometheus/prometheus.yml

找到alerting并将其修改为为:

alerting:
  alertmanagers:
  - follow_redirects: true
    scheme: http
    timeout: 10s
    api_version: v2
    static_configs:
    - targets: ['alertmanager机子ip:9093']

13,热加载Prometheus配置文件生效

curl  -X POST http://127.0.0.1:9090/-/reload

或者重启

systemctl restart prometheus

在Prometheus网页界面查看配置

在这里插入图片描述

三、配置Prometheus Rules告警规则

1,自定义Prometheus告警规则,监控主机进程状态,进程异常中断触发告警。

在Promethus Server机子中

mkdir /usr/local/prometheus/rules
vim /usr/local/prometheus/rules/rules.yml

添加

- name: process_status
  rules:
  - alert: process_status
    expr: namedprocess_namegroup_num_procs==0
    for: 1m
    labels:
     severity: critical
    annotations:
     summary: "主机 {{ $labels.instance }} process 异常!!!"
     description: "{{ $labels.instance }} {{$labels.groupname}} process异常!!!(value: {{ $value }})"

Rule 参数介绍

参数描述
- name: 警报规则组的名称
- alert: <string>警报规则的名称
expr: <string>使用PromQL表达式完成的警报触发条件,用于计算是否有知足触发条件
<lable_name>: <label_value>自定义标签,容许自行定义标签附加在警报上,好比high warning
annotations: <lable_name>: <tmpl_string>用来设置有关警报的一组描述信息,其中包括自定义的标签,以及expr计算后的值。

2,检查配置文件格式

/usr/local/prometheus/promtool  check  config prometheus.yml

/usr/local/prometheus/promtool  check rules /usr/local/prometheus/rules/rules.yml

3,Prometheus热加载配置

curl  -X POST http://127.0.0.1:9090/-/reload

或者重启

systemctl restart prometheus

最后在Prometheus查看规则
在这里插入图片描述

Prometheus告警规则状态

Inactive 正常状态,未激活警报
Pending 已知触发条件,但没有达到发送时间条件,在rules规则中 for 1m 定义发送时间条件
Firing 已触发阈值且满足告警持续时间,告警发送给接收者

在这里插入图片描述
rule.yml文件的for参数定义后 触发告警后先转换成 Pending 状态,达到for 时间条件后转换为 Firing 状态。俩个周期才能触发警报条件,若是没有设置 for 子句,会直接从 Inactive 状态转换成 Firing状态,触发警报,发送给 Receiver 设置的通知人。

四、安装钉钉告警插件

Prometheus 的Alertmanager自身不支持钉钉报警,需要通过插件的方式来达到报警条件。

1,下载prometheus-webhook-dingtalk

wget https://githubfast.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz

tar -xvf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz  -C  /usr/local/

cd /usr/local

mv prometheus-webhook-dingtalk-1.4.0.linux-amd64/ prometheus-webhook-dingtalk

2,配置钉钉报警模板文件

mkdir -p /usr/local/prometheus-webhook-dingtalk/contrib/templates

vim /usr/local/prometheus-webhook-dingtalk/contrib/templates/dingding.tmpl

{{ define "__subject" }}
[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}]
{{ end }}
 
 
{{ define "__alert_list" }}{{ range . }}
---
    **告警类型**: {{ .Labels.alertname }} 
    **告警级别**: {{ .Labels.severity }}
    **故障主机**: {{ .Labels.instance }} 
    **告警信息**: {{ .Annotations.description }}
    **触发时间**: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}  
{{ end }}{{ end }}
 
{{ define "__resolved_list" }}{{ range . }}
---
    **告警类型**: {{ .Labels.alertname }} 
    **告警级别**: {{ .Labels.severity }}
    **故障主机**: {{ .Labels.instance }} 
    **触发时间**: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}  
    **恢复时间**: {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{ end }}{{ end }}
 
 
{{ define "ops.title" }}
{{ template "__subject" . }}
{{ end }}
 
{{ define "ops.content" }}
{{ if gt (len .Alerts.Firing) 0 }}
**====侦测到{{ .Alerts.Firing | len  }}个故障====**
{{ template "__alert_list" .Alerts.Firing }}
---
{{ end }}
 
{{ if gt (len .Alerts.Resolved) 0 }}
**====恢复{{ .Alerts.Resolved | len  }}个故障====**
{{ template "__resolved_list" .Alerts.Resolved }}
{{ end }}
{{ end }}
 
{{ define "ops.link.title" }}{{ template "ops.title" . }}{{ end }}
{{ define "ops.link.content" }}{{ template "ops.content" . }}{{ end }}
{{ template "ops.title" . }}
{{ template "ops.content" . }}

3,钉钉插件告警配置

打开钉钉,在群中添加自定义机器人

在这里插入图片描述
在这里插入图片描述
上面的公网IP可以在当前的机子上通过 curl cip.cc查看
在这里插入图片描述

复制Webhook

在这里插入图片描述

4,拷贝钉钉插件配置文件

cd /usr/local/prometheus-webhook-dingtalk
cp config.example.yml config.yml

4,编辑钉钉插件配置文件

vim config.yml

修改对应内容,url为复制的Webhook地址

templates:
    - contrib/templates/dingding.tmpl
targets:
  webhook1:
    url: https://oapi.dingtalk.com/robot/send?access_token=9ac4354ab7c8
    message:
      title: '{{ template "ops.title" . }}'
      text: '{{ template "ops.content" . }}'

5,配置systemctl启动钉钉插件

vim /usr/lib/systemd/system/webhook-dingtalk.service
[Unit]
Description=prometheus-webhook-dingtalk
Documentation=https://github.com/timonwong/prometheus-webhook-dingtalk
After=network.target

[Service]
User=root
Group=root
ExecStart=/usr/local/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk  --config.file=/usr/local/prometheus-webhook-dingtalk/config.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

6,启动webhook-dingtalk方式一:

systemctl daemon-reload

systemctl restart webhook-dingtalk && systemctl enable webhook-dingtalk

查看webhook-dingtalk启动状态

systemctl status webhook-dingtalk

7,启动webhook-dingtalk方式二

cd /usr/local/prometheus-webhook-dingtalk
./prometheus-webhook-dingtalk --config.file=config.yml >dingtalk.log 2>&1 &

查看webhook-dingtalk启动状态

tail -f -n 30 dingtalk.log

8,prometheus-webhook-dingtalk(默认监听8060端口)

ss -auntlp | grep  8060

9,Prometheus 钉钉告警测试

systemctl stop chronyd

10,查看钉钉报警

在这里插入图片描述

Prometheus AlertManager 告警路由配置

Alertmanager路由配置可以将不同的告警通过标签定义分别发送给不同的媒介接收人。
Alertmanager的route配置段支持定义“树”状路由表,入口位置称为根节点,每个子节点可以基于匹配条件定义出一个独立的路由分支;
所有告警都将进入路由根节点,而后进行子节点遍历;
若路由上的continue字段的值为false,则遇到第一个匹配的路由分支后即终止;否则,将继续匹配后续的子节点;
在这里插入图片描述

alertmanager 实现不同的告警级别发送给不同的接收人

smtp_smarthost :填写邮箱服务器地址跟上端口号,我这里用的是qq的smtp
smtp_auth_password:填写qq邮箱授权码

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.qq.com:25'
  smtp_from: 'xxxx@qq.com'  #填写自己qq邮箱
  smtp_auth_username: 'xxxx@qq.com'  #填写自己qq邮箱
  smtp_auth_password: 'xxxxxxxxx'  #填写qq邮箱授权码
  smtp_require_tls: false

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 30s
  receiver: 'email'
  routes:
    - match_re:
        severity: warning
      receiver: webhook1
    - match_re:
        severity: critical
      receiver: email

receivers:
  - name: 'email'
    email_configs:
      - to: 'xxxxx@163.com' #指定发送给谁
  - name: 'webhook1'
    webhook_configs:
      - send_resolved: false
        url: http://localhost:8060/dingtalk/webhook1/send


inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

重启Alertmanager

ps aux | grep alert | grep -v grep | awk '{print $2}' |xargs kill -HUP

Alertmanager配置热加载

curl -lv -X POST http://192.168.100.167:9093/-/reload

Alertmanager邮件告警消息

在这里插入图片描述

下一篇文章:CentOS7中Prometheus PushGateway的使用

参考文档:https://cloud.tencent.com/developer/article/2216582

文章来源:https://blog.csdn.net/JessonLiu_/article/details/135393981
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。