监控系统再精准,告警推不到人就是白搭。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地址并启用告警推送:

image-20260325140225186

保存后重启Prometheus服务:

systemctl restart prometheus

步骤二:获取钉钉Webhook URL

进入目标钉钉群 → 点击右上角设置 → 选择“智能群助手” → “添加机器人” → 选择“自定义”机器人:

image-20260325141357694image-20260325141635253image-20260325141712706image-20260325141746662image-20260325141818703

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

image-20260325141957303image-20260325143147879

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

image-20260325143249017

步骤三:部署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
edb5258534ad70b0059e6ef4aece042c

⚙️ 步骤四:配置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网络隔离问题。

8b5efd3a6b5c099b9a18a08320456238

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

image-20260325155305070

步骤五:多群分发与告警分级(拓展)

在实际运维中,不同团队(运维、开发、安全)只需接收与其相关的告警。通过配置多个钉钉群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
image-20260325155734143

在Alertmanager的alertmanager.yml中配置路由规则,按标签(如teamseverity)分发告警:

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
image-20260325160237379

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

 systemctl restart alertmanager
image-20260325160248346image-20260325155221003

步骤六:跨网络告警推送(使用Cpolar内网穿透)

在云原生环境中,Prometheus与Alertmanager可能部署在不同网络(如内网与公网)。此时Alertmanager无法直接接收告警。内网穿透工具Cpolar可以解决此问题。

什么是Cpolar?

Cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,即可将本地服务映射到公网,适用于远程运维、开发调试等场景。

安装Cpolar

执行一键安装脚本:

sudo curl https://get.cpolar.sh | sh
image-20250725104019896

安装完成后,检查服务状态:

sudo systemctl status cpolar
22e5adfaf290a17fc3384bb296055259

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

8a6698b1bf26d64ba3645827fbfb1c29

配置公网隧道

创建TCP隧道,将Alertmanager的9093端口映射到公网:

  • 隧道名称:alertmanager
  • 协议:TCP
  • 本地地址:9093
  • 端口类型:随机临时TCP端口
  • 地区:China Top
image-20260325161910375

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

image-20260325161931137

修改Prometheus配置文件,将Alertmanager地址改为该公网地址:

vi prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets: ["2.tcp.cpolar.top:10409"]
image-20260325162215809

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

systemctl restart alertmanager
image-20260325162344783

固定TCP地址(可选)

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

image-20251210160529622image-20260325162516682

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

image-20260325162631384编辑更新image-20260325162718936

之后在在线隧道列表中即可看到固定地址生效:

image-20260325162736247 [AFFILIATE_SLOT_1]

总结

通过本文的完整链路,Prometheus告警已能精准触达到钉钉群——告警名称、实例、时间、Grafana链接一目了然。不同团队按职责分开发推送,多群分发与告警分级均可通过Alertmanager路由规则实现。跨网络场景下,Cpolar固定TCP隧道确保告警链路稳定可靠。运维不怕出问题,怕的是出了问题没人知道。这套方案建立后,告警才能真正“响”在该响的地方。

[AFFILIATE_SLOT_2]