Prometheus接入飞书
前言
为什么要做这个案例?
学习并操作完 Prometheus 后,发现怎么没有接入飞书的案例,于是我就想着去接入飞书,于是就去尝试,刚开始我认为只需要改一下 Alertmanager 配置文件中的 route (路由)和 receivers(接收方)就好了,应该跟邮件的思路差不多,于是我就去改,但是没有成功。我去问 GPT,发现根本不是这么容易完成的,还需要加点东西,然后我再继续去造,最后成功完成,也是非常的有成就感。
接下来,我就来分享一下这个过程我是如何完成的,以及这个过程遇到的问题和以及如何解决的
整个链路
链路图
这个是我自己画的图,带着对比的讲解一下,这 Zabbix & Prometheus 的链路类比,以及有什么区别

类比与区别
数据采集:Zabbix Agent 类比 Exporter
告警判断:是否产生告警?
- Zabbix:通过 Trigger 来判断,其在 Zabbix Server 中
- Prometheus:通过 Rule Evaluation 来判断,其在 Prometheus Server 中
告警处理:
- Zabbix:通过 Action 处理,通过什么媒介类型通知(Media Type),然后发给用户或者机器人Webhook,其在 Zabbix Server 中
- Prometheus:通过 Alertmanager 处理,根据告警的分级等,路由到不同的通知方式(Email / 飞书机器人 webhook)
Webhook 是什么?与API有什么区别?
前面一直说到 Webhook,这到底是个啥玩意?我刚开始理解的就是一个接受信息的地址,再去仔细学习一下,发现跟我理解的差不多,但是还是缺少一些细节
简单地说,Webhook 就是别人出事了,主动来通知你(事件驱动)。放到监控里,就是出现告警,Alertmanager 主动把告警发给某个 URL(Webhook 接口)
那 API 又是啥?简单来说就是 你主动去找别人 。比如,适配器调用飞书机器人接口就是一次 API 调用
Prometheus 和 Zabbix 通过飞书告警有什么区别?
主要就是两者发送的告警消息格式与飞书规定的消息格式是否匹配的问题
- Zabbix 的 Webhook 或脚本可以自己写逻辑,所以很多情况下不需要单独的外部适配器
- Alertmanager 发的是 Alertmanager 自己的 JSON 格式,飞书机器人要求的是飞书规定的消息格式,所以通常需要适配器来转换消息格式
适配器
可以使用:alertmanager-webhook-feishu,端口是8000,它的官方 README 里给出的链路就是:
Prometheus -> AlertManager -> alertmanager-webhook-feishu -> Feishu
Alertmanager 侧通过 webhook_configs 把告警发送到适配器的 /hook/your_group_name 地址。
Prometheus 接入飞书
Alertmanager
↓ 固定的 Prometheus 告警 JSON
飞书适配器
↓ 转换成飞书要求的 JSON
飞书机器人
Zabbix 接入飞书
Zabbix Trigger
↓
Zabbix Action
↓
Media Type:Webhook / Script
↓ 自己拼接飞书 JSON
飞书机器人
Prometheus 接入飞书流程
前面的 Prometheus Server、Exporter、Alertmanager 的安装部署以及关联,这里就不过多赘述了
# 适配器
1. 安装适配器
2. 配置适配器配置——指定飞书机器人webhook
3. 启动适配器,这里ss -tnl 看一下端口 8000 有没有开启
4. 这里可以用 curl 模拟 Alertmanager 给适配器发一个告警——测试告警,如果有飞书群里有告警出现说明配置成功了
# Alertmanager 配置文件
5. 编辑 Alertmanager 配置文件,将receivers 的地址改为 适配器的地址,route 为飞书
6. 检查 Alertmanager 配置文件
7. 启动 Alertmanager
# 告警规则
8. 编写告警规则 rules.yml
9. 检查告警规则
10. Prometheus Server 加载告警规则
# prometheus.yml
11. 检查 prometheus.yml 配置文件
12. 重启Prometheus
# 测试
13. 关闭和重新启动 exporer,看飞书群里有没有消息
以上操作的详细代码在另一个文件,这里不展示了
整个链路需要注意什么?常见错误 + 解决方案
首先,在做实验的过程中,我们要不断测试调试(就比如,每启动一个进程看一下端口、配置完适配器后做一个告警测试…….),不能一直跟着无脑做,结果无法实现。到最后跟着链路一层一层排查,那就很麻烦了,所以在做任何实验的时候我们都要不断调试,要有工程思维
我每一步都调试,到最后飞书群收不到消息是怎么回事?
我先说一下我的问题:旧进程没有杀掉
我做完上一个实验(邮件),那个 Alertmanager 进程没有关,一直在后台运行——这就是隐患:旧进程没有杀掉
我修改完 Alertmanager 配置文件,检查并启动后,查看端口,确认启动,然后就没有多想,就继续往后做完整个实验了,最后飞书群没有收到消息。显然问题就是旧进程还在运行,加载的还是旧配置,所以没有生效
解决方案:杀掉旧进程,重新启动。其实可以 用 systemd 管理 Alertmanager,避免多个进程混乱
以上就是我的问题,当然还有一些其他问题无非:防火墙、SELinux、配置文件错误(关联、告警规则、路由…….)、服务没有启动、重启等,这些都是可以在每一步调试的过程中很容易发现的,但是旧进程忘记关确实不容易发现,最后实在找不到问题就按着整条链路一个一个配查
总结
这里介绍了我将 Prometheus 接入飞书的过程与问题,以及与 Zabbix 的区别,同时介绍了一下 Zabbix 和 Prometheus 的告警链路,还有 Webhook 是什么,以及与 API 的区别。自己学着将一个东西拓展,然后完成它,真的超级爽。最后希望大家在日后学习过程中勇于探索学习,希望这篇文章对你有帮助噢 ~





