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
本工具拿来即可用,欢迎大家提出优化建议。