监控系统再精准,告警推不到人就是白搭。Prometheus搭配Alertmanager是云原生监控的经典组合,但Alertmanager原生不支持钉钉Webhook,导致集成时经常遇到消息格式混乱、告警丢失、恢复通知遗漏等问题。本文提供一条完整的生产级解决方案,通过prometheus-webhook-dingtalk中间件打通链路,并额外演示如何借助内网穿透工具实现跨网络告警推送。
为什么选择钉钉作为告警通道?
在云原生架构中,告警的及时触达直接决定运维效率。钉钉作为国内主流企业通讯工具,具备以下优势:
- 高触达率:钉钉全员在线,消息推送几乎无延迟,能有效缩短MTTR(平均修复时间)。
- 统一入口:将Prometheus告警集中到钉钉群,避免邮件、短信等多渠道分散管理。
- 富文本展示:通过中间件可将告警渲染为卡片,清晰展示告警名称、等级、实例、触发时间及Grafana链接。
- 低成本高可靠:钉钉推送零成本,依托阿里云基础设施,稳定性有保障。
✅ 前提条件
开始前请确认以下环境已就绪:
- 已部署Prometheus和Alertmanager
- 拥有一个可用的钉钉群,并具备管理员权限
- 可创建钉钉自定义机器人
- 部署节点具备外网访问能力
- Alertmanager与webhook服务网络互通(若使用Docker,注意网络隔离)
- 安装Docker(推荐)或systemd,以及curl/jq等调试工具
示例:检查Docker是否安装
docker --version
步骤一:配置Prometheus对接Alertmanager
编辑Prometheus配置文件,添加Alertmanager地址并启用告警推送:

保存后重启Prometheus服务:
systemctl restart prometheus
步骤二:获取钉钉Webhook URL
进入目标钉钉群 → 点击右上角设置 → 选择“智能群助手” → “添加机器人” → 选择“自定义”机器人:





为机器人命名(如“Prometheus告警”),并设置安全校验方式(建议使用关键词或加签):


完成后复制生成的Webhook URL备用:

步骤三:部署prometheus-webhook-dingtalk
创建配置文件dingtalk.yaml:
cat > dingtalk.yaml <<EOF
targets:
webhook1:
url: https://oapi.dingtalk.com/robot/send?access_token=你的_access_token
EOF
启动Docker容器(假设配置文件在当前目录):
docker run -d \
--name dingtalk-webhook \
-p 8060:8060 \
-v $(pwd)/dingtalk.yaml:/etc/prometheus-webhook-dingtalk/config.yml \
--restart always \
timonwong/prometheus-webhook-dingtalk:latest

⚙️ 步骤四:配置Alertmanager路由
编辑Alertmanager的alertmanager.yml,将告警路由到webhook服务:
vi alertmanager.yml
global:
resolve_timeout: 2m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'dingtalk-webhook'
receivers:
- name: 'dingtalk-webhook'
webhook_configs:
- url: 'http://<你的服务器IP> :8060/dingtalk/webhook1/send'
send_resolved: true
systemctl restart alertmanager
注意替换<你的服务器IP>为webhook服务所在主机的IP地址。若Alertmanager与webhook在同一主机上,建议使用宿主机IP而非127.0.0.1,避免Docker网络隔离问题。

配置完成后重启Alertmanager,即可在钉钉群收到告警消息:

步骤五:多群分发与告警分级(拓展)
在实际运维中,不同团队(运维、开发、安全)只需接收与其相关的告警。通过配置多个钉钉群Webhook,可以实现告警的精准投递与职责分离。
首先获取另一个群的Webhook URL(步骤同前)。然后编辑dingtalk.yaml,添加多个目标:
vi dingtalk.yaml
targets:
ops-team:
url: https://oapi.dingtalk.com/robot/send?access_token=a391180a72b3c35f9308bbe1097dd5a29ca0cc440c6f1ee33601f8d5739ff6aa
secret: secret1
dev-team:
url: https://oapi.dingtalk.com/robot/send?access_token=3e373b6623264d1c71098acde924328d0e16753820a17475aa95bd6655111e04
secret: secret2
重新启动Docker容器:
docker run -d \
--name dingtalk-webhook \
-p 8060:8060 \
-v $(pwd)/dingtalk.yaml:/etc/prometheus-webhook-dingtalk/config.yml \
--restart always \
timonwong/prometheus-webhook-dingtalk:latest

在Alertmanager的alertmanager.yml中配置路由规则,按标签(如team、severity)分发告警:
vi alertmanager.yml
global:
resolve_timeout: 2m
# 主路由:所有告警走这个路径
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'broadcast' # ← 指向一个组合 receiver
# 定义 receivers
receivers:
- name: 'broadcast'
webhook_configs:
# 发给 ops 钉钉群
- url: 'http://<你的服务器IP>/dingtalk/ops-team/send'
send_resolved: true
# 发给 dev 钉钉群
- url: 'http://<你的服务器IP>/dingtalk/dev-team/send'
send_resolved: true

重启Alertmanager后,两个群聊将同时收到各自相关的告警:
systemctl restart alertmanager


步骤六:跨网络告警推送(使用Cpolar内网穿透)
在云原生环境中,Prometheus与Alertmanager可能部署在不同网络(如内网与公网)。此时Alertmanager无法直接接收告警。内网穿透工具Cpolar可以解决此问题。
什么是Cpolar?
Cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,即可将本地服务映射到公网,适用于远程运维、开发调试等场景。
安装Cpolar
执行一键安装脚本:
sudo curl https://get.cpolar.sh | sh

安装完成后,检查服务状态:
sudo systemctl status cpolar

在浏览器访问http://<主机IP>:9200,使用Cpolar官网注册的账号登录管理界面:

配置公网隧道
创建TCP隧道,将Alertmanager的9093端口映射到公网:
- 隧道名称:alertmanager
- 协议:TCP
- 本地地址:9093
- 端口类型:随机临时TCP端口
- 地区:China Top

创建成功后,在“在线隧道列表”中获取公网地址(如2.tcp.cpolar.top:10409):

修改Prometheus配置文件,将Alertmanager地址改为该公网地址:
vi prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets: ["2.tcp.cpolar.top:10409"]

重启Prometheus后,钉钉告警依然正常推送:
systemctl restart alertmanager

固定TCP地址(可选)
为避免公网地址随机变化,可在Cpolar后台保留一个固定TCP地址。进入“预留”页面,选择区域并填写描述:


然后在隧道列表中编辑隧道,将端口类型改为“固定TCP端口”,填入预留地址:

编辑更新
之后在在线隧道列表中即可看到固定地址生效:
[AFFILIATE_SLOT_1]
总结
通过本文的完整链路,Prometheus告警已能精准触达到钉钉群——告警名称、实例、时间、Grafana链接一目了然。不同团队按职责分开发推送,多群分发与告警分级均可通过Alertmanager路由规则实现。跨网络场景下,Cpolar固定TCP隧道确保告警链路稳定可靠。运维不怕出问题,怕的是出了问题没人知道。这套方案建立后,告警才能真正“响”在该响的地方。
[AFFILIATE_SLOT_2]
浙公网安备 33010602011771号