prometheus-webhook-dingtalk实现跨网也能秒收钉钉推送的Prometheus 告警!cpolar内网穿透实验室第70 个成功挑战

0 阅读13分钟

在这里插入图片描述

说白了,做运维的都懂,监控告警这事儿,「能触发」只是第一步,「能送到人手里」才是关键。我上周刚帮朋友的创业公司搞定一个典型问题:他们的 Prometheus 和 Alertmanager 部署在公司内网服务器,运维小哥居家办公时,服务器 CPU 飙满触发告警,结果内网 Alertmanager 推不出去,等第二天到公司才发现,业务已经卡了 8 小时。

用 prometheus-webhook-dingtalk 搭配 cpolar 之后,首先是告警能直接推到钉钉群,不管运维在公司还是在家,手机一响就知道出问题;其次是他们开发和运维分开两个群,告警能精准推到对应群里,不用所有人都被无关告警刷屏;还有个实际的好处 —— 不用额外买公网 IP,cpolar 把内网的 Alertmanager 映射成公网地址,Prometheus 哪怕部署在云服务器,也能稳稳把告警送过来,实测配置完大概 15 分钟,整个告警链路就通了。

软件名称

prometheus-webhook-dingtalk(搭配 Prometheus、Alertmanager、cpolar 内网穿透工具)

操作系统支持

Linux(CentOS 7/8、Ubuntu 18.04+)、Docker 环境(任意支持 Docker 的系统)、支持 systemd 管理服务的 Linux 发行版

在这里插入图片描述

软件介绍

prometheus-webhook-dingtalk 是社区出品的轻量中间件,核心就是补 Alertmanager 的「短板」——Alertmanager 本身没法直接对接钉钉 Webhook,这个工具能把 Alertmanager 的告警数据转换成钉钉机器人能识别的格式,还能配置多个钉钉群的 Webhook 地址,实现告警分流。它体积小,既可以用 Docker 一键部署,也能通过二进制包配合 systemd 管理,不用改 Prometheus 核心配置,只需要简单配置 Alertmanager 的转发规则就行。

prometheus-webhook-dingtalk 的出色功能

最实用的就是「告警格式适配 + 多群分流」—— 它能把 Prometheus 的原生告警信息,整理成钉钉卡片式消息,里面清晰标着告警名称、服务器 IP、触发时间,不用再对着纯文本扒信息;另外支持给不同团队配置不同的钉钉 Webhook,比如运维群收服务器硬件告警,开发群收应用报错告警,避免信息杂乱。还有个细节很贴心,能推送「告警恢复」通知,不用手动去确认故障是不是解决了。

在这里插入图片描述

实用场景

场景 1:中小团队跨网运维告警
  • 痛点:公司服务器在内网,Prometheus 告警只能内网看,运维下班 / 出差时收不到,小故障拖成大问题;想推钉钉但 Alertmanager 没公网地址,VPN 配置又麻烦。
  • 爽点:用 cpolar 把内网 Alertmanager 映射成公网 TCP 地址,Prometheus 不管部署在哪,都能把告警推过来,再通过 prometheus-webhook-dingtalk 送到钉钉群,手机端实时接收,实测从告警触发到钉钉收到消息,延迟不到 10 秒。
场景 2:多团队告警精准分流
  • 痛点:全公司共用一套 Prometheus 监控,所有告警都堆到一个钉钉群,开发嫌服务器告警烦,运维嫌应用告警杂,经常漏看关键信息。
  • 爽点:在 prometheus-webhook-dingtalk 里配置多个钉钉群的 Webhook,再给 Alertmanager 设置路由规则,按告警类型自动分流,比如「CPU 使用率过高」推运维群,「接口响应超时」推开发群,用下来群里无效信息少了 70%,没人再抱怨被刷屏。

在这里插入图片描述

cpolar 内网穿透技术带来的便利

不用折腾公网 IP 是最直观的好处 —— 之前为了让外网的 Prometheus 访问内网 Alertmanager,试过端口映射、搭 VPN,光配置就花了大半天,还总出网络波动的问题。用 cpolar 之后,就简单几步:装个 cpolar 客户端,配置个指向 Alertmanager 9093 端口的 TCP 隧道,马上就能拿到公网地址,把这个地址填到 Prometheus 配置里就行,不用改路由器设置,也不用找运营商要公网 IP。

顺嘴提一句,cpolar 还能保留固定 TCP 地址,不用每次重启隧道都改 Prometheus 配置。我自己用了快一个月,不管是在家远程调试,还是公司机房断网临时用笔记本搭 Alertmanager,只要把 cpolar 的固定地址填进去,告警就能稳稳推到钉钉,再也没出现过「告警发不出去」的情况。

另外,cpolar 的隧道是加密的,不用担心告警信息泄露 —— 毕竟告警里会带服务器 IP、故障详情这些敏感内容,这一点比直接开公网端口要放心。而且它对中小团队特别友好,基础功能免费,不用额外花钱买商业内网穿透服务,实测单条隧道稳定运行两周没断过。

在这里插入图片描述

总结

prometheus-webhook-dingtalk 本身解决了 Prometheus 告警对接钉钉的核心问题,把杂乱的告警信息整理得清晰易懂,还能实现多群分流;而 cpolar 则补上了「网络隔离」的短板,让原本只能在局域网内跑的 Alertmanager 和 webhook 服务,能被外网的 Prometheus 访问到,不用折腾复杂的网络配置。两者搭配起来,既保证了告警能精准、及时触达责任人,又降低了跨网监控的操作成本,不管是中小团队还是个人运维,用下来都能明显减少告警漏接、信息杂乱的问题。

不过有个前提,部署的时候要注意 Docker 网络的问题 —— 如果 webhook 服务和 Alertmanager 都用 Docker 部署,别用 127.0.0.1 访问,换成宿主机 IP 会更稳。

效率神器,效率神器已经准备好了。快去下载,早日实现摸鱼自由吧!

无论你是初次尝试集成,还是希望优化现有告警体验,这篇文章都将为你提供一套生产可用、高可靠、易维护的最佳实践方案。让每一次告警,都真正“响”在该响的地方。

downloaded-image

1.为什么将Prometheus告警推送到钉钉?

将Prometheus告警推送到钉钉,不仅是技术集成的一步,更是提升团队运维效率与系统可靠性的关键实践。以下是几个核心原因:

  1. 告警触达更及时,响应更迅速

钉钉作为国内企业广泛使用的即时通讯工具,几乎全员在线、消息必达。将告警直接推送至运维群或值班群,能确保问题在第一时间被看到,大幅缩短MTTR,避免小故障演变为大事故。

  1. 统一告警入口,避免信息碎片化

传统方式可能依赖邮件、短信、Slack等多种渠道,容易造成告警分散、遗漏或重复处理。通过钉钉集中接收所有Prometheus告警,团队可在一个平台完成告警确认、讨论与协同处置,提升协作效率。

  1. 支持富文本与结构化展示,信息更清晰

借助prometheus-webhook-dingtalk等中间件,告警消息可渲染为卡片式富文本,清晰展示:

  • 告警名称(如HighCPUUsage)
  • 严重等级(critical / warning)
  • 故障实例(instance=192.168.1.10:9100)
  • 触发时间与持续时长
  • 快速跳转链接(直达 Grafana或Prometheus UI)

相比纯文本邮件,钉钉消息一目了然,减少信息解读成本。

  1. 低成本、高可用的告警通道

相比短信或电话告警,钉钉推送零成本、无额度限制,且依托阿里云基础设施,服务稳定可靠。对于大多数非P0级别告警,钉钉是性价比极高的通知渠道。

2.前提条件

  1. 本机已经部署prometheus和alertmanager

  2. 具备一个可用的钉钉群,并拥有管理员权限

  3. 可创建钉钉自定义机器人

  4. 部署节点具备外网访问能力

  5. Alertmanager与webhook服务网络互通

  • Alertmanager所在主机必须能通过HTTP/HTTPS访问prometheus-webhook-dingtalk服务的地址
  • 若两者部署在同一主机,注意Docker网络隔离问题(避免使用127.0.0.1,建议用宿主机IP或Docker自定义网络)。
  1. 安装必要工具(用于部署与调试)
  • Docker(推荐方式部署webhook服务)或systemd(二进制部署)

  • curl / jq(用于测试API和解析JSON)

  • 文本编辑器(如vim、nano)用于编写配置文件

    示例:检查Docker是否安装
    
docker --version

3.prometheus配置alertmanager

进入到prometheus配置文件,编辑配置文件,按照如图设置:

image-20260325140225186

编辑后,重启prometheus:

systemctl restart prometheus

4.获取钉钉Webhook URL

打开钉钉群 → 点击右上角设置:

image-20260325141357694

找到智能群助手 → 添加机器人:

image-20260325141635253

image-20260325141712706

添加自定义机器人:

image-20260325141746662

点击添加:

image-20260325141818703

给机器人起个名字,我这里是“prometheus告警”:

image-20260325141957303

设置发消息关键词,因为现在钉钉对安全严格,所以需要设置限制,,也可以设置加签或者IP地址:

image-20260325143147879

点击完成后,复制生成的Webhook,留着备用:

image-20260325143249017

5.部署prometheus-webhook-dingtalk服务

创建配置文件dingtalk.yaml:

cat > dingtalk.yaml <<EOF
targets:
  webhook1:
    url: https://oapi.dingtalk.com/robot/send?access_token=你的_access_token
EOF

启动容器(假设配置文件在当前目录):

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

6.配置Alertmanager告警

配置Alertmanager配置文件,配置到告警自动发送到钉钉:

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> 为运行prometheus-webhook-dingtalk的主机IP(如果是本机且Alertmanager也在本机,可用127.0.0.1,但注意Docker网络)

8b5efd3a6b5c099b9a18a08320456238

告警成功!

image-20260325155305070

7.告警多个钉钉群(拓展)

配置多个钉钉群告警,是为了实现告警的精准投递与职责分离——让不同团队(如运维、开发、安全)只接收与其相关的告警,避免信息过载,提升响应效率,并支持告警分级、环境隔离和故障升级等高级运维场景,从而构建高效、可靠、可扩展的监控告警体系。

获取另一个群的webhook(步骤和第4章节一致)。

配置文件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:

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-20260325160248346

等响应一会就可以在两个群聊中都看见告警啦!

image-20260325155221003

在典型的云原生监控架构中,Prometheus负责采集指标并触发告警规则,而Alertmanager则运行在独立节点上,专职处理告警的去重、分组与通知。然而,在实际部署中,我们常常面临一个现实挑战:Prometheus与Alertmanager并不在同一个局域网内——例如,Prometheus部署在企业内网或私有云环境中,而Alertmanager可能托管在另一台隔离的服务器、边缘节点,甚至临时调试机上。

由于内网环境通常无法被外部直接访问,Prometheus默认通过HTTP向 http://:9093/api/v1/alerts推送告警时,会因网络不通而失败,导致“告警静默”,严重削弱监控系统的可靠性。此时,我们需要一种安全、轻量且无需复杂网络配置(如公网IP、端口映射、NAT穿透或 VPN)的方式来打通内外网通信。内网穿透工具Cpolar正是为此而生——它能将Alertmanager所在内网的服务,通过加密隧道暴露到公网,生成一个临时或固定的公网地址,让Prometheus无论身处何地,都能稳定推送告警。接下来,我们将演示如何借助Cpolar,轻松实现跨网络的Prometheus-Alertmanager告警链路。

8.安装cpolar实现随时随地开发

8.1 什么是cpolar?

cpolar是一款安全高效的内网穿透工具,无需公网IP或复杂配置,只需一条命令,即可将本地服务器、Web服务或任意端口映射到公网,让你随时随地远程访问内网应用,特别适合开发调试、远程运维和应急部署等场景。

8.2 部署cpolar

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

sudo curl https://get.cpolar.sh | sh

image-20250725104019896

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

8a6698b1bf26d64ba3645827fbfb1c29

9.配置公网地址

通过配置,你可以在本地WSL或Linux系统上运行SSH服务,并通过Cpolar将其映射到公网,从而实现从任意设备远程连接开发环境的目的。

  • 隧道名称:可自定义,本例使用了:alertmanager,注意不要与已有的隧道名称重复
  • 协议:tcp
  • 本地地址:9093
  • 端口类型:随机临时TCP端口
  • 地区:China Top

image-20260325161910375

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用任意一个地址在终端中访问即可。

  • tcp 表示使用的协议类型
  • 2.tcp.cpolar.top是 Cpolar 提供的域名
  • 10409是随机分配的公网端口号

image-20260325161931137

在prometheus上使用不同局域网的alertmanager,修改prometheus的配置文件:

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

image-20260325162215809

重启服务:

systemctl restart alertmanager

重启服务后,钉钉仍在告警:

image-20260325162344783

10.保留固定TCP公网地址

使用cpolar为其配置TCP地址,该地址为固定地址,不会随机变化。

image-20251210160529622

选择区域和描述:有一个下拉菜单,当前选择的是“China VIP”。 右侧输入框,用于填写描述信息。 保留按钮:在右侧有一个橙色的“保留”按钮,点击该按钮可以保留所选的TCP地址。 列表中显示了一条已保留的TCP地址记录。

  • 地区:显示为“China Top”。

  • 地址:显示为“3.tcp.cpolar.top:11755”。

    image-20260325162516682

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道ssh,点击右侧的编辑

image-20260325162631384

修改隧道信息,将保留成功的TCP端口配置到隧道中。

  • 端口类型:选择固定TCP端口
  • 预留的TCP地址:填写保留成功的TCP地址

点击更新

image-20260325162718936

创建完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的TCP地址。

image-20260325162736247

这样我们的TCP地址就固定成功啦!

总结

将Prometheus告警推送到钉钉,不仅是技术集成,更是运维理念的升级——从“看得见”走向“管得住”,从“被动响应”迈向“主动治理”。通过本文提供的端到端方案,无论你是单机测试还是生产集群,都能快速构建一套可靠、智能、可扩展的告警通知体系,让每一次异常都真正“响”在该响的地方。

告警的价值,不在于它被触发,而在于它被行动。

愿你的系统永远平静,但你的告警始终锋利。