A Sentry extension to post notifications to DingTalk (钉钉) robot.
English | 简体中文
- 📦 Project: sentry-demo (Sentry)
- 🌍 Env: prod
- 🚦 Level: error
- 📍 Location:
app/utils/math.js📢 Trigger: alert-rule
👉 View Issue on Sentry
- 📝 精美排版: 发送包含项目、环境、报错级别、代码位置的 Markdown 消息,一目了然。
- 🤖 多机器人: 支持同时配置多个机器人,推送到不同的群组。
- 🔒 安全验证: 完美支持钉钉的 加签 (SEC) 和 自定义关键词 安全设置。
- 📱 强提醒: 支持通过手机号 @群成员,确保重要报警不被遗漏。
- ⚡️ 简单易用: 配置灵活,支持占位符跳过特定配置。
针对不同的使用场景,提供两种安装方式:
如果您使用的是 Sentry Self-Hosted (Docker),这是官方推荐的标准方式。插件会打包进 Docker 镜像,重启不会丢失。
- 在 Sentry 部署目录 (
self-hosted/) 下,找到或创建sentry/enhance-image.sh文件。 - 添加以下内容:
(注意:文件需具有可执行权限
#!/bin/bash pip install sentry-dingtalk-notifychmod +x sentry/enhance-image.sh) - 执行安装脚本重构镜像:
./install.sh docker-compose up -d
如果只想快速试用,可以使用此方式。注意:重建容器后插件会消失。
- 进入容器安装:
docker-compose exec web pip install sentry-dingtalk-notify docker-compose exec worker pip install sentry-dingtalk-notify
- 重启服务:
docker-compose restart web worker
进入 Sentry > Project Settings > Legacy Integrations > DingTalk Notify。
钉钉机器人 Webhook URL 中的 access_token 参数。
- 格式: 每行一个 Token。
80dc91e4d2... 1284401411...
钉钉机器人安全设置中的“加签”密钥(以 SEC 开头)。
-
重要规则: 每一行 Secret 必须与上面的 Access Token 严格对应(第一行对第一行)。
-
占位符: 如果某个机器人没有设置加签,请务必在该行填入减号
-作为占位符。示例配置:
SEC3390d51... <-- 对应第 1 个 Token - <-- 对应第 2 个 Token (无 Secret) SEC8888888... <-- 对应第 3 个 Token
如果您的机器人设置了“自定义关键词”过滤。
- 原理: 插件会自动将此关键词拼接到消息标题中(例如
【Sentry】 错误标题)。 - 设置: 填写你在钉钉后台设置的关键词即可(例如
Sentry)。
需要 @ 的群成员手机号。
- 格式: 英文逗号分隔,例如
13800000000,13900000000。
支持使用 Markdown 自定义消息格式。勾选 "Enable Custom Message" 后填入由变量组成的模版。
可用变量:
{project}: 项目名 (e.g. sentry-demo){title}: 异常标题 (e.g. ValueError){message}: 异常详情{url}: 报错详情页链接{level}: 报错级别 (error/info){environment}: 环境 (prod/dev){culprit}: 异常位置 (code path){display_title}: 包含关键词前缀的标题 (推荐使用,用于通过关键词验证)
模版示例:
### {display_title}
**环境**: {environment}
**位置**: `{culprit}`
> {message}
[👉查看详情]({url})(注意:钉钉 Markdown 换行需在行尾加两个空格,或使用列表格式)
很多用户反馈手动 "Test Plugin" 成功,但真实报错没反应。这通常是 Alert Rules (告警规则) 设置的问题。
Sentry 默认的告警规则通常是:
WHEN
A new issue is created(当新问题创建时)
这意味着,同一个错误只有在第一次出现时才会发送通知。后续重复的报错会被合并,不再触发通知。
为了更好的测试和监控,建议将规则修改为:
- WHEN:
An event is captured(当捕获到任意事件时) - IF:
The event's level is equal to or greater than error(级别 >= Error) - Action Interval: 设置为
5 minutes或10 minutes(避免刷屏)
不想修改规则?
-
方法一:Curl 验证 (最推荐 - 100% 有效)
- 直接向 Sentry 发送模拟请求(无需前端项目):
# 请替换 YOUR_KEY (DSN Key) 和 PROJECT_ID # 注意:需替换 sentry.your-domain.com 为您的 Sentry 地址 curl https://sentry.your-domain.com/api/PROJECT_ID/store/ \ -H "X-Sentry-Auth: Sentry sentry_version=7, sentry_key=YOUR_KEY, sentry_client=curl/1.0" \ -H "Content-Type: application/json" \ -d '{"message": "DingTalk Test '`date +%s`'", "level": "error"}'
-
方法二:浏览器验证 (仅当页面有 Sentry SDK 时)
- 在控制台运行(包裹在 setTimeout 中以确保触发全局捕获):
Sentry.captureException(new Error("DingTalk Test Error " + new Date().getTime()));
- 在控制台运行(包裹在 setTimeout 中以确保触发全局捕获):
- 插件没显示? 检查
docker-compose logs web日志,确保没有安装报错。 - 签名错误? 钉钉签名依赖时间戳,请确保您的服务器时间与标准时间同步。
- 消息被拒? 检查 "Custom Keyword" 是否与钉钉后台设置一致。
欢迎提交 PR!本地开发调试请参考 本地开发指南。