prometheus+alertmanager告警消息对接企业微信、飞书、钉钉

前言

  很多公司都在使用prometheus作为监控,并使用alertmanager发送告警消息,然而有的公司内部通讯软件使用的是企业微信,或者是飞书,或者是钉钉,那么如何让监控告警消息发送到这些通讯软件呢。
  本文主要通过讲解自己开发的工具alertmanager-webhook来实现该功能,该工具已经支持目前主流的通讯软件。同时本工具不仅仅支持接收alertmanager告警消息,也支持接收自研告警平台发送的消息,只需先将告警消息转换成类似alertmanager的json格式即可。

1. 实现思路

  我们知道alertmanager支持直接对接webhook,所以我们只要将alertmanager的告警消息解析成企业微信、飞书、钉钉能够识别的消息,那么再通过官方的api接口就可以发送告警消息了。
alertmanager消息示例

"alerts": [
    {
      "status": "firing",
      "labels": {
        "alertname": "机器宕机监测",
        "instance": "10.180.48.2",
        "job": "node_exporter",
        "serverity": "warning"
      },
      "annotations": {
        "description": "机器:10.180.48.2 所属 job:node_exporter 宕机超过1分钟,请检查!",
        "summary": "机器发生宕机"
      },
      "startsAt": "2023-10-11T11:59:09.775Z",
      "endsAt": "0001-01-01T00:00:00Z",
      "fingerprint": "02f13394997e5211"
    }
  ]

  这是一个常见alertmanager告警消息,可以看到是一个json的格式,其中labels和annotations里面的字段都是我们配置prometheus时设置的,其他字段是prometheus触发告警时自动生成的,那么我们只需要将这个json字符串解析为各个通讯软件能够识别的格式,就OK了。目前对接企业微信是使用的企业微信所支持的markdown格式,对接飞书是使用的飞书所支持的card格式,对接钉钉是使用的钉钉所支持的markdown格式。具体格式要求,可以到各平台的官网进行查看。

2. 工具使用

本文分别介绍使用二进制安装和使用docker安装,该工具依赖redis,所以需要提前安装好redis。

2.1 使用二进制部署

redis如何使用二进制安装,本文就不介绍了,直接介绍工具的安装。
下载地址:https://github.com/Rainbowhhy/alertmanager-webhook/releases/download/v1.0/alertmanager-webhook-v1.0-linux-amd64.tar.gz

2.1.1 下载二进制安装包并解压

wget https://github.com/Rainbowhhy/alertmanager-webhook/releases/download/v1.0/alertmanager-webhook-v1.0-linux-amd64.tar.gz
tar -xf alertmanager-webhook-v1.0-linux-amd64.tar.gz
cd alertmanager-webhook-v1.0-linux-amd64

2.1.2 目录结构

tree alertmanager-webhook-v1.0-linux-amd64
alertmanager-webhook-v1.0-linux-amd64
├── alertmanager-webhook
├── alertmanager-webhook.yaml
├── example
│   ├── default.tmpl
│   ├── dingding.tmpl
│   ├── feishu.tmpl
│   └── qywechat.tmpl
└── template
    └── alert.tmpl

解压后的目录结构:
alertmanager-webhook:二进制启动命令
alertmanager-webhook.yaml:工具配置文件
example:模板目录,包含各个通讯工具的告警模板
template:告警目录,发送消息时实际使用的模板

2.1.3 修改配置文件

vim alertmanager-webhook.yaml

# 企业微信机器人key
# 使用企业微信时必须配置,不使用则留空
qywechatKey:

# 飞书机器人key
# 使用飞书时必须配置,不使用则留空
feishuKey:

# 钉钉机器人key
# 使用钉钉时必须配置,不使用则留
dingdingKey:

# Redis配置
redisServer: 127.0.0.1  # 必须配置
redisPort:  # 可选项,为空默认为6379
redisPassword: wecloudsre@2023 # redis未设置密码则留空,如果设置了密码登陆则必须配置

# 日志配置
logFileDir:   # 可选项,为空则为程序运行目录
logFilePath: alertmanager-webhook.log # 必须配置

# 服务监听配置
port: 9095 # 可选项,为空则默认为9095
host: 0.0.0.0 # 可选项,为空默认监听 127.0.0.1

大家需要使用什么通讯工具,就配置上对应机器人的key;reidsServer需要配置成redis服务器的ip地址,redisPassword配置成redis的登陆密码;其他配置保持默认即可。

2.1.4 配置模板

默认模板内容

 cat template/alert.tmpl
{{- if eq .Status `firing` -}}
{{- /*  自定义触发告警时的内容格式  */ -}}
告警主题: {{.Annotations.summary}}
告警级别: {{.Labels.serverity}}
告警次数: {{.Count}}
告警主机: {{.Labels.instance}}
告警详情: {{.Annotations.description}}
触发时间: {{.StartTime}}

{{- else if eq .Status `resolved` -}}
{{- /*  自定义告警恢复时的内容格式  */ -}}
告警主题: {{.Annotations.summary}}
告警主机: {{.Labels.instance}}
开始时间: {{.StartTime}}
恢复时间: {{.EndTime}}

(1).Annotations.summary、.Annotations.description 是prometheus中annotations的字段,.Labels.serverity、.Labels.instance是prometheus中labels的字段,可以根据实际的prometheus中所包含的字段来进行修改。
(2).Count、.StartTime、.EndTime 是固定字段,名称不可修改,可以按照实际需求,需要就加上,不需要就删除。
(3)注意.Annotations和.Labels中配置的字段必须是实际在prometheus中存在的,如果不存在,接收到的告警消息可能不全或者是非意料之中的。
(4)example目录中包含了各个通讯平台的模板实例,实际使用时可以先拷贝到template中进行修改,注意拷贝到template时,文件名称不能变,必须是template/alert.tmpl

2.1.5 启动alertmanager-webhook

chmod +x alertmanager-webhook
./alertmanager-webhook -c alertmanager-webhook.yaml

2.1.6 配置alertmanager

工具启动后,还需要在alertmanager中配置webhook

# alertmanager.yml
......

receivers:
  name: webhook
  webhook_configs:
  # 配置企业微信接口
  - url: 'http://127.0.0.1:9095/qywechat'
  # 配置飞书接口
  - url: 'http://127.0.0.1:9095/feishu'
  # 配置钉钉接口
  - url: 'http://127.0.0.1:9095/dingding'

......

实际工作中需要使用哪个通讯工具,就配置哪个工具对应的webhook接口即可。

2.2 使用docker部署

2.2.1 修改配置

alertmanager-webhook.yaml配置、模板配置、alertmanager.yml配置同上面的二进制文件部署

2.2.2 docker启动

docker部署比较简单,两条命令即可。

docker run -d --name redis -v /root/redis.conf:/etc/redis/redis.conf -p 0.0.0.0:6379:6379 redis:5.0.0 redis-server /etc/redis/redis.conf
docker run -d --name alertmanager-webhook -p 0.0.0.0:9095:9095 -v /root/alertmanager-webhook.yaml:/etc/alertmanager-webhook/alertmanager-webhook.yaml rainbowhhy/alertmanager-webhook:v1.0

2.2.3 docker-compose启动

也可以使用docker-compose部署
vim docker-compose.yml

version: '3'
services:
  redis:
    image: redis:5.0.0
    hostname: redis
    restart: unless-stopped
    container_name: redis
    privileged: true
    ports:
      - 0.0.0.0:6379:6379
    volumes:
      - /data/redis/redis.conf:/etc/redis/redis.conf
      - /data/redis/data:/data
    command: ["redis-server", "/etc/redis/redis.conf"]

  alertmanager-webhook:
    image: alertmanager-webhook:v1.2
    hostname: alertmanager-webhook
    restart: unless-stopped
    container_name: alertmanager-webhook
    privileged: true
    ports:
      - 0.0.0.0:9095:9095
    volumes:
      - /data/alertmanager-webhook/alertmanager-webhook.yaml:/etc/alertmanager-webhook/alertmanager-webhook.yaml
    command: ["./alertmanager-webhook", "-c", "/etc/alertmanager-webhook/alertmanager-webhook.yaml"]

3. 测试示例

我们可以使用curl命令来模拟alertmanager往alertmanager-webhook发送消息:
以发送至企业微信为例
触发告警

curl -X POST -H "Content-Type: application/json" -d '
{"alerts": [
    {
      "status": "firing",
      "labels": {
        "alertname": "机器宕机监测",
        "instance": "10.180.48.2",
        "job": "node_exporter",
        "serverity": "warning"
      },
      "annotations": {
        "description": "机器:10.180.48.2 所属 job:node_exporter 宕机超过1分钟,请检查!",
        "summary": "机器发生宕机"
      },
      "startsAt": "2024-01-10T11:59:09.775Z",
      "endsAt": "2024-01-10T13:00:00Z",
      "fingerprint": "02f13394997e5211"
    }
  ]
}' 127.0.0.1:9095/qywechat

告警恢复

curl -X POST -H "Content-Type: application/json" -d '
{"alerts": [
    {
      "status": "resolved",
      "labels": {
        "alertname": "机器宕机监测",
        "instance": "10.180.48.2",
        "job": "node_exporter",
        "serverity": "warning"
      },
      "annotations": {
        "description": "机器:10.180.48.2 所属 job:node_exporter 宕机超过1分钟,请检查!",
        "summary": "机器发生宕机"
      },
      "startsAt": "2024-01-10T11:59:09.775Z",
      "endsAt": "2024-01-10T13:00:00Z",
      "fingerprint": "02f13394997e5211"
    }
  ]
}' 127.0.0.1:9095/qywechat

4. 实现效果

alertmanager-webhook工具实现的告警效果
企业微信告警效果

飞书告警效果

钉钉告警效果

5. 源码分享

https://github.com/Rainbowhhy/alertmanager-webhook
本工具拿来即可用,欢迎大家提出优化建议。

posted @ 2024-01-30 23:15  Rainbowhhy  阅读(908)  评论(0编辑  收藏  举报