天天看点

Prometheus配置和使用Alertmanager发送告警至企业微信1、准备工作2、安装下载alertmanager3、配置alertmanager4、告警消息模板5、启动服务6、配置prometheus使用alertmanager7、触发告警

注:本文基于CentOS 7.4编写

1、准备工作

1.1 创建应用

注册企业微信,这个不细说。注册完成后,点击应用管理->应用->创建应用

Prometheus配置和使用Alertmanager发送告警至企业微信1、准备工作2、安装下载alertmanager3、配置alertmanager4、告警消息模板5、启动服务6、配置prometheus使用alertmanager7、触发告警

1.2 获取应用ID和秘钥

按照要求创建应用后,点击创建的应用就能看到我们的应用id和秘钥,这两个信息很重要,后面在prometheus中会用到。

Prometheus配置和使用Alertmanager发送告警至企业微信1、准备工作2、安装下载alertmanager3、配置alertmanager4、告警消息模板5、启动服务6、配置prometheus使用alertmanager7、触发告警

1.3 获取企业账号ID

我的企业->企业信息->企业ID

Prometheus配置和使用Alertmanager发送告警至企业微信1、准备工作2、安装下载alertmanager3、配置alertmanager4、告警消息模板5、启动服务6、配置prometheus使用alertmanager7、触发告警

1.4 获取告警发送部门或组ID

获取需要接收告警的部门或组ID,注意ID为1,表示整个公司,慎用!

Prometheus配置和使用Alertmanager发送告警至企业微信1、准备工作2、安装下载alertmanager3、配置alertmanager4、告警消息模板5、启动服务6、配置prometheus使用alertmanager7、触发告警

1.5 设置告警可见范围

我们添加的应用中需要设置告警可见范围,把需要接收告警的群组添加进去,不然告警一直无法接受到,我在这折腾了很久。

Prometheus配置和使用Alertmanager发送告警至企业微信1、准备工作2、安装下载alertmanager3、配置alertmanager4、告警消息模板5、启动服务6、配置prometheus使用alertmanager7、触发告警

2、安装下载alertmanager

我们以官网最新版本为例,官网地址,https://prometheus.io/download/

wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
           

如果觉得官网下载实在慢,可以通过以下链接下载,

alertmanager-0.21.0.linux-amd64.tar.gz

下载完压缩包后我们直接解压,并放到/usr/local/prometheus目录,便于管理,

[[email protected] prometheus]# tar -xf alertmanager-0.21.0.linux-amd64.tar.gz 
[[email protected] prometheus]# cp -r alertmanager-0.21.0.linux-amd64 /usr/local/prometheus/alertmanager
[[email protected] prometheus]# cd /usr/local/prometheus/alertmanager/
[[email protected] alertmanager]# ls
alertmanager  alertmanager.yml  amtool  LICENSE  NOTICE
[[email protected] alertmanager]# ./alertmanager --version
alertmanager, version 0.21.0 (branch: HEAD, revision: 4c6c03ebfe21009c546e4d1e9b92c371d67c021d)
  build user:       [email protected]
  build date:       20200617-08:54:02
  go version:       go1.14.4
           

3、配置alertmanager

[[email protected] alertmanager]# cat alertmanager.yml 
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'wechat'
receivers:
- name: 'wechat'
  wechat_configs:
  - corp_id: '123456'       
   	to_party: '123456'      
  	agent_id: '123456'     
   	api_secret: '123456'     
   	send_resolved: true    
inhibit_rules:
  - source_match:
      severity: 'major'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'instance']
templates:
  - '*.tmpl'
           

主要有五个字段,

  • global:全局配置

    resolve_timeout:告警恢复超时时间,当接收的告警没有EndsAt字段时,经过该时间就将该告警标志为已解决,prometheus上用不上,告警都会带EndsAt字段

  • route:告警分配配置

    group_by:设置分组标签,告警时出现的labels都可用于分组,如果需要对所有不同label都分组,可以使用’…’

    group_wait:告警发送等待时间,时间拉长便于告警聚合

    group_interval:前后两组告警发送间隔时间

    repeat_interval:重复告警发送间隔时间

    receiver:定义接收告警的对象

  • receivers:告警接收对象,这部分信息参考步骤1获取

    name:告警接收名称,与route中的receiver一一对应,这里我们配置的是企业微信

    corp_id: 企业微信唯一ID,我的企业 -> 企业信息

    to_party: 告警需要发送的组

    agent_id: 自己创建应用的ID,自己创建的应用详情页面查看

    api_secret: 自己创建应用的密钥,自己创建的应用详情页面查看

    send_resolved: 告警解决是否发送通知

  • inhibit_rules:告警抑制规则

    当新的告警匹配到target_match规则,而已发送告警满足source_match规则,并且新告警与已发送告警中equal定义的标签完全相同,则抑制这个新的告警。

    上述配置的结果就是同个instance的同个alertname告警,major会抑制warning告警,这很好理解,比如阈值告警,达到critical肯定也达到了warning,没必要发送两个告警。

    不过,从实际测试结果看,这个抑制规则只能在触发告警时使用,对于告警恢复没有,应该是个bug,也有可能我用的版本过低,有时间再去看下源码,查一查

  • templates:告警消息模板

    定义模板路径

4、告警消息模板

模板内容如下,关于模板语法及解释,参看另一篇文章——Prometheus Alertmanager告警模板

[[email protected] home]# cat /usr/local/prometheus/alertmanager/wechat.tmpl
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
======== 异常告警 ========
告警名称:{{ $alert.Labels.alertname }}
告警级别:{{ $alert.Labels.severity }}
告警机器:{{ $alert.Labels.instance }} {{ $alert.Labels.device }}
告警详情:{{ $alert.Annotations.summary }}
告警时间:{{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
========== END ==========
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
======== 告警恢复 ========
告警名称:{{ $alert.Labels.alertname }}
告警级别:{{ $alert.Labels.severity }}
告警机器:{{ $alert.Labels.instance }}
告警详情:{{ $alert.Annotations.summary }}
告警时间:{{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
恢复时间:{{ $alert.EndsAt.Format "2006-01-02 15:04:05" }}
========== END ==========
{{- end }}
{{- end }}
{{- end }}
           

当然,这个模板是基于告警规则定义的,本次测试使用的告警规则如下, 阈值都是为了测试而设置,切勿照搬~

[[email protected] home]# cat /usr/local/prometheus/rules/node_health.yml 
groups:
- name: node_health
  rules:
  - alert: HighMemoryUsage
    expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.9
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: High memory usage

  - alert: HighDiskUsage
    expr: node_filesystem_free_bytes{mountpoint='/'} / node_filesystem_size_bytes{mountpoint='/'} < 0.7
    for: 1m
    labels:
      severity: major
    annotations:
      summary: High Disk usage

  - alert: HighDiskUsage
    expr: node_filesystem_free_bytes{mountpoint='/'} / node_filesystem_size_bytes{mountpoint='/'} < 0.71
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: High Disk usage
           

5、启动服务

鉴于安装是通过二进制文件安装,为了便于管理,我们增加一个对应的systemd服务,这样启动和开机启动就更方便了。

cat > /usr/lib/systemd/system/alertmanager.service <<EOF
[Unit]
Description=altermanager
After=network.target
 
[Service]
ExecStart=/usr/local/prometheus/alertmanager/alertmanager \
		  --config.file=/usr/local/prometheus/alertmanager/alertmanager.yml 
ExecReload=/bin/kill -s HUP \$MAINPID
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
EOF
           

设置可执行文件路径以及配置文件路径

然后就可以通过systemctl命令设置开机启动,并启动服务了。

systemctl enable alertmanager&& systemctl start alertmanager
           

6、配置prometheus使用alertmanager

[[email protected] ~]# grep -Ev "^#|^$" /usr/local/prometheus/prometheus.yml 
...
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - 127.0.0.1:9093
...
           

添加targets字段,指向alertmanager地址,这样告警就能发往alertmanager处理。

修改完配置记得reload下配置,

systemctl reload prometheus
           

7、触发告警

配置都OK后,就可以测试了,针对告警规则,手动触发告警,等待一小段时间,观察prometheus web上的告警和企业微信上的消息,

  • web
    Prometheus配置和使用Alertmanager发送告警至企业微信1、准备工作2、安装下载alertmanager3、配置alertmanager4、告警消息模板5、启动服务6、配置prometheus使用alertmanager7、触发告警
  • 企业微信
    Prometheus配置和使用Alertmanager发送告警至企业微信1、准备工作2、安装下载alertmanager3、配置alertmanager4、告警消息模板5、启动服务6、配置prometheus使用alertmanager7、触发告警
    然后针对disk告警,消除告警,可见,告警抑制在告警恢复时并不能正常工作。
    Prometheus配置和使用Alertmanager发送告警至企业微信1、准备工作2、安装下载alertmanager3、配置alertmanager4、告警消息模板5、启动服务6、配置prometheus使用alertmanager7、触发告警

继续阅读