目录

1. 概述

1.1 主要步骤

1.2 核心概念

2. 安装

3. alertmanger配置

3.1 配置说明:

3.2 配置告警通知


1. 概述

前置要求:需要先配置promehteus告警规则及在配置文件中配置alertmanger,

官方文档

https://prometheus.io/docs/alerting/latest/alertmanager/

altermanager告警部分,主要负责管理接收prometheus推送过来的告警,通过分组、静默、抑制、聚合等处理,将告警通过路由发送到对应的接收器上,按不同的规则发送给不同的模块负责人,支持邮件、salck及webhook(对接企业微信/钉钉/飞书)方式发送告警通知。

1.1 主要步骤

  • 安装并设置altermanger(包括配置通知方式email/webhook/dingding/weixin等,邮件通知模版,路由分组等)
  • prometheus配置altermanger
  • prometheus配置告警规则,热重载规则(curl -X POST http://127.0.0.1:9090/-/reload)

 prometheus配置部分

1.2 核心概念

  • 分组

将类似性质的警报分类到单个通知中。这在较大的中断期间特别有用,因为许多系统同时发生故障,并且可能同时触发数百到数千个警报。

  • 抑制

抑制是一种概念,即在某些其他警报已触发时禁止显示某些警报的通知。

  • 静默

静默是一种在给定时间内简单地将警报静音的简单方法。静音是根据匹配器配置的,就像路由树一样。将检查传入警报是否与活动静默的所有相等或正则表达式匹配器匹配。如果他们这样做,则不会为该警报发送任何通知。 静默是在警报管理器的 Web 界面中配置的。

2. 安装

下载地址

https://github.com/prometheus/alertmanager/releases

 安装方式有docker、二进制及源码等方式,这里是直接运行二进制文件

# 下载lastest版本
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-arm64.tar.gz

# 解压及安装
tar xf alertmanager-0.24.0.linux-amd64.tar.gz 
mv alertmanager-0.24.0.linux-amd64 /usr/local/alertmanager 

# 启动
/usr/local/alertmanager/alertmanager --config.file="/usr/local/alertmanager/alertmanager.yml" &

启动 alertmanger后,要在prometheus中配置alertmanger的接入地址

# vim /usr/local/prometheus/prometheus.yml

global:
# Alertmanager configuration
alerting:   # 增加alertmanager配置
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

# 热重载
 

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

3. alertmanger配置

配置文档

https://prometheus.io/docs/alerting/latest/configuration/

3.1 配置说明:

示例配置文件:/usr/local/alertmanager/alertmanager.yml,如下

global: 
  ***
templates:
  - 'tmpl/*.tmpl'
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']
  • global: 全局配置,设置报警解决后的超时时间、邮件/钉钉/微信配置等
  • route: 设置报警分发策略,按照深度优先从左向右顺序行匹配
  • receivers: 配置告警消息接受者
  • inhibit_rules: 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)
  • templates: 邮箱、钉钉、微信等自定义模版路径

在实际生产中,会通过邮件+钉钉/微信/飞书的方式进行告警通知,具体如下

3.2 配置告警通知

注意:告警方式支持mail、webhook、钉钉及微信等,钉钉/微信等需要安装插件prometheus-webhook-dingtak才能使用

3.2.1 配置邮件通知

# vim /usr/local/alertmanager/alertmanager.yml

global:
  resolve_timeout: 5m
  smtp_from: 'test@qq.com'  # 发送者
  smtp_smarthost: 'smtp.exmail.qq.com:465' # smtp地址
  smtp_auth_username: 'test@qq.com'  # 邮箱帐号
  smtp_auth_password: 'xxxxxxxx' # 邮箱密码/客户端授权码
  smtp_require_tls: false   # 关闭tls
route:  # 设置报警的分发策略
  group_by: ['alertname']    # 分组名
  group_wait: 5s   # 当收到告警的时候,等待N秒看是否还有告警,如果有就一起发出去
  group_interval: 5s # 发送警告间隔时间
  repeat_interval: 5m  # 重复报警的间隔时间
  receiver: 'email'  # 告警接收人
receivers:   #接收人
- name: 'email'
  email_configs:
  - to: 'test@qq.com' #可以多人
    send_resolved: true  # 告警恢复通知
inhibit_rules: # 抑制规则
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

配置好后重启alertmanger生效,默认通知邮件效果如下:

docker 配置prometheus 钉钉报警模板 alertmanager 钉钉告警_模版

可以通过自定义邮件模版的方式进行美化 

3.2.2 配置邮件通知模版

步骤:

1)创建模版

2)引用模版

创建模版存放目录

# mkdir -p /usr/local/alertmanager/tmpl

创建邮件模版

# vim /usr/local/alertmanager/tmpl/email.tmpl

{{ define "email.html" }}
    {{ range .Alerts }}
<pre>
    ========start==========
    告警程序: prometheus_alert 
    告警级别: {{ .Labels.severity }} 
    告警类型: {{ .Labels.alertname }} 
    故障主机: {{ .Labels.instance }} 
    告警主题: {{ .Annotations.summary }} # Annotations这里根据prometheus规则中的实际字段填写
    告警详情: {{ .Annotations.description }}
    触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}  # 注意:.StartsAt.Format "2006-01-02 15:04:05"的参数一定不能乱填,这里定义的时间为go语言的诞生时间!!!如果填错时间会乱码。
    ========end==========
</pre>
    {{ end }}
{{ end }}

引用邮件模版

# vim /usr/local/alertmanager/alertmanager.yml

global:
  resolve_timeout: 5m
  smtp_from: 'test@qq.com'
  smtp_smarthost: 'smtp.exmail.qq.com:465'
  smtp_auth_username: 'test@qq.com'
  smtp_auth_password: 'xxxxxxxxx'
  smtp_require_tls: false
templates:
  - '/usr/local/alertmanager/tmpl/*.tmpl'  #增加templates配置
route:
  group_by: ['alertname'] 
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: 'test@qq.com'
    html: '{{ template "email.html" . }}'   #引用邮箱模版
    send_resolved: true 
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

重启alertmanger,效果如下:

docker 配置prometheus 钉钉报警模板 alertmanager 钉钉告警_linux_02

 3.2.3 配置钉钉告警通知

  • webhook插件官方地址

    https://github.com/timonwong/prometheus-webhook-dingtalk

alertmanger必须通过webhoo插件才能将告警发送到钉钉/微信/飞书,因此,需要先安装webhook插件,安装方式有二进制、docker和源码,这里直接运行二进制文件

# 下载,https://github.com/timonwong/prometheus-webhook-dingtalk/releases
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.1.0/prometheus-webhook-dingtalk-2.1.0.linux-arm64.tar.gz 
tar xf prometheus-webhook-dingtalk-2.1.0.linux-arm64.tar.gz 
mv prometheus-webhook-dingtalk-2.1.0.linux-amd64 /usr/local/prometheus-webhook-dingtalk 
cd /usr/local/prometheus-webhook-dingtalk

用法

usage: prometheus-webhook-dingtalk [<flags>]

Flags:
  -h, --help                    # 查看帮助
      --web.listen-address=:8060  # 指定监听地址和端口,默认端口8060
      --web.enable-ui           # 启用web ui,查看配置及编写自定义模板时可预览效果
      --web.enable-lifecycle    Enable reload via HTTP request.
      --config.file=config.yml  # 指定配置文件
      --log.level=info          # 日志级别: [debug, info, warn, error]
      --log.format=logfmt       # 日志格式: [logfmt, json]
      --version                # 查看版本号

启动webhook dingtalk插件

# 启动
/usr/local/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk --config.file=/usr/local/prometheus-webhook-dingtalk/config.yml --web.enable-ui &

配置钉钉

创建钉钉机器人

docker 配置prometheus 钉钉报警模板 alertmanager 钉钉告警_vim_03

docker 配置prometheus 钉钉报警模板 alertmanager 钉钉告警_模版_04

 复制钉钉机器人的webhook地址和安全码,配置prometheus-webhook-dingtalk

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

## Targets, previously was known as "profiles"
targets:
  webhook1:   
    url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx #这里是机器人的webhook地址
    # 安全设置中的加签
    secret: SEC000000000000000000000
  • 可以配置多个webhook
  • 调用时通过targets进行区分,tagerget名自定义,如配置webhook1、webhook2、webhook3等机器人,想发送消息给webhook1的机器人,则调用url:http://localhost:8060/dingtalk/webhook1/send

默认的钉钉通知模版如下

docker 配置prometheus 钉钉报警模板 alertmanager 钉钉告警_模版_05

可以自定义通知模版

 模板效果可以用过dingtalk插件的ui界面调试:

http://127.0.0.1:8060/ui/playground

http://127.0.0.1:8060/ui/playground

docker 配置prometheus 钉钉报警模板 alertmanager 钉钉告警_运维_06

自定义消息通知模版 

创建模板:vim /usr/local/alertmanager/tmpl/dingding.tmpl

{{ define "__subject" }}
[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}]
{{ end }}


{{ define "__alert_list" }}{{ range . }}
---
    **告警程序**: prometheus_alert 
    **告警级别**: {{ .Labels.severity }} 
    **告警类型**: {{ .Labels.alertname }} 
    **故障主机**: {{ .Labels.instance }} 
    **告警主题**: {{ .Annotations.summary }}
    **触发时间**: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}  
{{ end }}{{ end }}

{{ define "__resolved_list" }}{{ range . }}
---
    **告警程序**: prometheus_alert 
    **告警级别**: {{ .Labels.severity }} 
    **告警类型**: {{ .Labels.alertname }} 
    **故障主机**: {{ .Labels.instance }} 
    **告警主题**: {{ .Annotations.summary }}
    **触发时间**: {{ (.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" . }}

查看模版效果

docker 配置prometheus 钉钉报警模板 alertmanager 钉钉告警_服务器_07

引用模版

# vim /usr/local/prometheus-webhook-dingtalk/config.yml

# 配置钉钉消息模板
templates:
  - /usr/local/alertmanager/tmpl/dingding.tmpl
targets:
  webhook1:
    url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxx
    # secret for signature
    secret: SECd4a3xxxxxxxxxxxxx
    message:
      title: '{{ template "ops.title" . }}'   # 引用模版
      text: '{{ template "ops.content" . }}'

alertmanger配置钉钉告警

# vim /usr/local/alertmanager/alertmanager.yml

global:
  resolve_timeout: 5m
  smtp_from: 'test@qq.com'
  smtp_smarthost: 'smtp.exmail.qq.com:465'
  smtp_auth_username: 'test@qq.com'
  smtp_auth_password: 'xxxxxxxxxx'
  smtp_require_tls: false
templates:
  - '/usr/local/alertmanager/tmpl/*.tmpl'
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 24h
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:  # 发送到邮件
  - to: 'test@qq.com'
    html: '{{ template "email.to.html" . }}'
    send_resolved: true
  webhook_configs: # 发送到钉钉webhook1
  - url: 'http://localhost:8060/dingtalk/webhook1/send'
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

重启alertmanger,效果如下

docker 配置prometheus 钉钉报警模板 alertmanager 钉钉告警_linux_08

 至此,关于alertmanger邮件+钉钉告警的配置就完成了