Prometheus明明已经告警,值班群却收不到?Alertmanager接上钉钉后,异常和恢复消息都能主动推送

发布时间:2026/10/31 2:21:21
Prometheus明明已经告警,值班群却收不到?Alertmanager接上钉钉后,异常和恢复消息都能主动推送 前言Prometheus把异常检测出来只解决了监控的一半。真正影响响应速度的是告警能不能及时送到正在值班的人手里如果还要主动打开Prometheus页面查看很多故障依然会拖到用户反馈后才被发现。尤其当监控对象越来越多、告警规则越来越细以后“告警有没有真正送达”本身也会变成监控体系里必须解决的一环。这篇要解决的就是把Prometheus告警真正送进钉钉。Alertmanager负责接收告警、分组、路由和恢复通知prometheus-webhook-dingtalk负责把Alertmanager的Webhook转换成钉钉机器人能够接收的消息。正文会先完成Prometheus与Alertmanager的连接再创建钉钉机器人、部署prometheus-webhook-dingtalk并配置Alertmanager把告警转发出去实际验证钉钉能够正常收到消息。在单群告警跑通以后还会继续扩展到多个钉钉群让不同团队接收各自需要关注的告警后面再处理Prometheus与Alertmanager不在同一局域网时的通信问题。所以整篇真正跑的是Prometheus触发告警 → Alertmanager分组与路由 → webhook-dingtalk转换消息 → 钉钉接收告警与恢复通知 → 多群分发 → 跨网络连接Alertmanager这条链。重点不是“发一条消息”而是把告警真正变成可触达、可分流、可持续维护的通知流程。1.为什么将Prometheus告警推送到钉钉把Prometheus告警推送到钉钉核心价值是缩短“异常发生”和“责任人看到”之间的时间同时把告警入口集中到团队日常使用的协作工具里。告警触达更及时响应更迅速钉钉作为国内企业广泛使用的即时通讯工具几乎全员在线、消息必达。将告警直接推送至运维群或值班群能确保问题在第一时间被看到大幅缩短MTTR避免小故障演变为大事故。统一告警入口避免信息碎片化传统方式可能依赖邮件、短信、Slack等多种渠道容易造成告警分散、遗漏或重复处理。通过钉钉集中接收所有Prometheus告警团队可在一个平台完成告警确认、讨论与协同处置提升协作效率。支持富文本与结构化展示信息更清晰借助prometheus-webhook-dingtalk等中间件告警消息可渲染为卡片式富文本清晰展示告警名称如HighCPUUsage严重等级critical / warning故障实例instance192.168.1.10:9100触发时间与持续时长快速跳转链接直达 Grafana或Prometheus UI经过中间件转换后告警名称、等级、实例、时间和跳转链接可以集中展示处理时更容易快速定位重点。低成本、高可用的告警通道相比短信或电话告警钉钉推送零成本、无额度限制且依托阿里云基础设施服务稳定可靠。对于大多数非P0级别告警钉钉是性价比极高的通知渠道。2.前提条件本机已经部署prometheus和alertmanager具备一个可用的钉钉群并拥有管理员权限可创建钉钉自定义机器人部署节点具备外网访问能力Alertmanager与webhook服务网络互通Alertmanager所在主机必须能通过HTTP/HTTPS访问prometheus-webhook-dingtalk服务的地址若两者部署在同一主机注意Docker网络隔离问题避免使用127.0.0.1建议用宿主机IP或Docker自定义网络。安装必要工具用于部署与调试Docker推荐方式部署webhook服务或systemd二进制部署curl / jq用于测试API和解析JSON文本编辑器如vim、nano用于编写配置文件示例检查Docker是否安装docker--version3.prometheus配置alertmanager进入到prometheus配置文件编辑配置文件按照如图设置编辑后重启prometheussystemctl restart prometheus4.获取钉钉Webhook URL打开钉钉群 → 点击右上角设置找到智能群助手 → 添加机器人添加自定义机器人点击添加给机器人起个名字我这里是“prometheus告警”设置发消息关键词因为现在钉钉对安全严格所以需要设置限制也可以设置加签或者IP地址点击完成后复制生成的Webhook留着备用5.部署prometheus-webhook-dingtalk服务创建配置文件dingtalk.yamlcatdingtalk.yamlEOF targets: webhook1: url: https://oapi.dingtalk.com/robot/send?access_token你的_access_token EOF启动容器假设配置文件在当前目录:dockerrun-d\--namedingtalk-webhook\-p8060:8060\-v$(pwd)/dingtalk.yaml:/etc/prometheus-webhook-dingtalk/config.yml\--restartalways\timonwong/prometheus-webhook-dingtalk:latest6.配置Alertmanager告警接下来配置Alertmanager的receiver和Webhook地址让收到的告警继续转发到prometheus-webhook-dingtalk。vialertmanager.ymlglobal: resolve_timeout: 2m route: group_by:[alertname]group_wait: 10s group_interval: 10s repeat_interval: 1h receiver:dingtalk-webhookreceivers: - name:dingtalk-webhookwebhook_configs: - url:http://你的服务器IP :8060/dingtalk/webhook1/sendsend_resolved:truesystemctl restart alertmanager替换 你的服务器IP 为运行prometheus-webhook-dingtalk的主机IP如果是本机且Alertmanager也在本机可用127.0.0.1但注意Docker网络钉钉能够正常收到消息后说明Prometheus → Alertmanager → webhook-dingtalk → 钉钉这条基础链路已经跑通。7.告警多个钉钉群拓展单个钉钉群已经能够接收告警以后还可以继续扩展多个目标让运维、开发或其他团队分别接收需要关注的消息避免所有告警都堆在同一个群里。获取另一个群的webhook步骤和第4章节一致。配置文件dingtalk.yaml添加两个钉钉群链接vidingtalk.yamltargets: ops-team: url: https://oapi.dingtalk.com/robot/send?access_tokena391180a72b3c35f9308bbe1097dd5a29ca0cc440c6f1ee33601f8d5739ff6aa secret: secret1 dev-team: url: https://oapi.dingtalk.com/robot/send?access_token3e373b6623264d1c71098acde924328d0e16753820a17475aa95bd6655111e04 secret: secret2启动docker容器dockerrun-d\--namedingtalk-webhook\-p8060:8060\-v$(pwd)/dingtalk.yaml:/etc/prometheus-webhook-dingtalk/config.yml\--restartalways\timonwong/prometheus-webhook-dingtalk:latest配置Alertmanager的alertmanager.ymlvialertmanager.ymlglobal: resolve_timeout: 2m# 主路由所有告警走这个路径route: group_by:[alertname]group_wait: 10s group_interval: 10s repeat_interval: 1h receiver:broadcast# ← 指向一个组合 receiver# 定义 receiversreceivers: - name:broadcastwebhook_configs:# 发给 ops 钉钉群- url:http://你的服务器IP/dingtalk/ops-team/sendsend_resolved:true# 发给 dev 钉钉群- url:http://你的服务器IP/dingtalk/dev-team/sendsend_resolved:true配置完成后重启alertmanager服务systemctl restart alertmanager配置生效后可以在两个钉钉群中分别看到对应的告警消息。前面的告警链路是在Prometheus能够直接访问Alertmanager的前提下完成的。如果两者部署在不同局域网Prometheus就无法直接把告警发送到Alertmanager的9093端口。这里继续使用cpolar为Alertmanager提供一个外部TCP入口让不同网络中的Prometheus也能把告警送到同一套Alertmanager。这个部分解决的是监控组件之间的网络连通不改变前面Alertmanager到钉钉的通知链路。8.使用cpolar打通跨网络Alertmanager8.1 什么是cpolarcpolar是一款安全高效的内网穿透工具无需公网IP或复杂配置只需一条命令即可将本地服务器、Web服务或任意端口映射到公网让你随时随地远程访问内网应用特别适合开发调试、远程运维和应急部署等场景。8.2 部署cpolarcpolar 可以将你本地电脑中的服务如 SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可打开浏览器访问本地9200端口使用cpolar账户密码登录即可,登录后即可对隧道进行管理。9.配置公网地址这里为Alertmanager的9093端口创建TCP公网入口后续Prometheus可以直接把这个公网地址作为Alertmanager目标。隧道名称可自定义本例使用了:alertmanager注意不要与已有的隧道名称重复协议tcp本地地址9093端口类型随机临时TCP端口地区China Top创建成功后打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址接下来就可以在其他电脑或者移动端设备异地上使用任意一个地址在终端中访问即可。tcp 表示使用的协议类型2.tcp.cpolar.top是 Cpolar 提供的域名10409是随机分配的公网端口号在prometheus上使用不同局域网的alertmanager修改prometheus的配置文件viprometheus.ymlalerting: alertmanagers: - static_configs: - targets:[2.tcp.cpolar.top:10409]重启服务systemctl restart alertmanager修改目标并重启服务后如果钉钉仍然能够正常收到告警就说明跨网络链路已经接通。10.保留固定TCP公网地址使用cpolar为其配置TCP地址该地址为固定地址不会随机变化。选择区域和描述有一个下拉菜单当前选择的是“China VIP”。右侧输入框用于填写描述信息。保留按钮在右侧有一个橙色的“保留”按钮点击该按钮可以保留所选的TCP地址。列表中显示了一条已保留的TCP地址记录。地区显示为“China Top”。地址显示为“3.tcp.cpolar.top:11755”。登录cpolar web UI管理界面点击左侧仪表盘的隧道管理——隧道列表找到所要配置的隧道ssh点击右侧的编辑。修改隧道信息将保留成功的TCP端口配置到隧道中。端口类型选择固定TCP端口预留的TCP地址填写保留成功的TCP地址点击更新。创建完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的TCP地址。固定TCP地址生效以后Prometheus就可以长期使用同一组Alertmanager连接地址。总结这篇真正完成的不只是把Prometheus告警“发到钉钉”而是把告警从触发、路由、转换到最终通知完整串成了一条链。Prometheus负责发现异常并触发规则Alertmanager负责分组、路由、重复通知和恢复消息prometheus-webhook-dingtalk负责把Webhook内容转换成钉钉机器人能够接收的格式。基础链路跑通以后钉钉群就可以直接看到告警和恢复状态。继续扩展多个钉钉群以后不同团队还能按目标接收消息避免所有告警都堆在一个群里如果Prometheus和Alertmanager不在同一网络后面的cpolar部分再负责把9093端口提供成可跨网络访问的固定TCP入口。整条链最终解决的是“告警触发以后谁能及时看到、怎么分流、网络隔离时还能不能送达”这几个实际问题。Prometheus负责发现Alertmanager负责调度webhook-dingtalk负责适配钉钉cpolar负责跨网络连通最终让告警真正从监控系统走到责任人手里。