
OneUptime 集成 Discord用内置工作流组件将事故通知推送到频道【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime导读本指南讲解如何在 OneUptime 中通过内置的Discord 工作流组件把事故Incident的新建与更新消息自动推送到 Discord 频道。这是一条典型的出站Outbound集成OneUptime 借助 Discord 的 Incoming Webhook URL 向频道发送消息无需安装任何插件只需在可视化工作流画布上拖拽连接即可完成。读完本文你将掌握从创建 Discord Webhook、用全局变量保管密钥到构建事件驱动工作流、使用 API 组件做替代方案的完整实战方法并能结合仓库源码理解该组件的底层安全与实现原理。集成模式出站推送Discord 集成属于 OneUptime 集成体系中的出站模式——即OneUptime 里的某个事件应该在另一个工具中呈现。官方集成概览文档将出站模式的通用配方归纳为三步见 App/FeatureSet/Docs/Content/en/integrations/index.md构建一个以OneUptime 事件触发器开头的流程例如Incident → On Create添加一个调用对方 REST API 的API 组件或专用组件携带事故详情把 API 密钥保存为秘密全局变量确保密钥不会出现在流程或日志中。本集成的完整数据流如下OneUptime Incident → On Create ──► Discord component ──► message in your channel在整个集成目录中Discord 与 Telegram 一样都是典型的出站集成Outbound而 Slack、Microsoft Teams 则属于更深的原生工作区连接支持双向操作与自动事故频道需要时建议优先走工作区连接而非工作流。为什么它是最快的集成之一Discord 集成之所以开箱即用、搭建最快是因为 OneUptime 在自动化引擎中内置了名为Send Message to Discord的专用组件其组件元数据定义在 Common/Types/Workflow/Components/Discord.ts组件 IDDiscordSendMessageToChannel分类category为Discord输入参数webhook-urlDiscord Incoming Webhook URL必填、标记为敏感isSensitive: true和text消息正文必填长文本输出success与error两个出端口分别对应消息发送成功与发生错误。而真正执行发送的运行时实现位于 Common/Server/Types/Workflow/Components/Discord/SendMessageToChannel.ts它调用 Discord 官方Execute Webhook接口POST到 webhook URL请求体为{ content: args[text] }。注意在run()开始处若没有提供text参数会直接抛出BadDataException(Discord message not found)因此消息正文是强制项。前置准备OneUptime 工作流基本概念在动手之前先补充工作流中的三个基础概念详见 工作流组件文档 与 变量文档触发器Trigger流程的起点例如Incident → On Create表示当事故被创建时启动流程组件Component触发器之后添加的构建块每个块只做一件事——发消息、调 API、做判断——并与下一个块相连。Discord、API、Conditions条件判断都是组件变量Variable分全局变量与局部变量两类用于在块之间传递数据也是保管密钥的官方方式。第一步在 Discord 创建 Webhook打开目标频道的Edit Channel编辑频道→ Integrations集成→ Webhooks点击New Webhook新建 Webhook给它一个便于识别的名称例如OneUptime确认目标频道无误点击Copy Webhook URL复制 Webhook URL复制形如下面的地址https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN关于这个地址有一个值得注意的仓库细节OneUptime 的 Discord 组件在发送前会对 Webhook URL 做域名白名单校验。在 Common/Server/Types/Workflow/Components/IncomingWebhookUtils.ts 中定义export const DISCORD_WEBHOOK_DOMAINS: Arraystring [ discord.com, discordapp.com, ];getPinnedWebhookUrl()会校验 URL 原始字符串必须落在discord.com/discordapp.com这两个域名上否则流程会通过onError停止并给出可操作的错误信息。这意味着你无法把该组件指向任意第三方 URL——这是出于 SSRF服务端请求伪造防护的设计比单纯维护黑名单更安全白名单无法被 DNS 重绑定、备用 IP 写法或重定向绕过。同时源码中发送请求还设置了doNotFollowRedirects: true避免重定向把数据交给其他主机控制者。第二步把 Webhook URL 存入全局变量推荐直接把 URL 粘贴进组件固然可行但官方强烈建议先存入全局变量理由是可以跨多个工作流复用并在单点轮换密钥。进入Workflows → Global Variables → Create将变量命名为DISCORD_WEBHOOK_URL把 URL 粘贴进 Content 字段打开Is Secret开关保存。全局变量的关键属性见 变量文档属性说明Name引用时使用的名字。至少 2 个字符不能有空格只允许字母、数字、连字符和下划线官方建议使用UPPER_SNAKE_CASE命名习惯Description可选的自由文本用于说明用途Secret开启后变量值会从运行日志run logs与步骤追踪step traces中抹除Content实际值属于长文本字段支持多行内容在任何工作流中引用全局变量使用{{global.variables.NAME}}语法工作流局部变量则使用{{local.variables.NAME}}。两点提醒变量名区分大小写{{global.variables.MyKey}}与{{global.variables.mykey}}是两个不同的变量未解析的引用会原样透传拼写错误或变量被重命名后引用不会报错、也不会变成空字符串而是把花括号原样发出去例如出现在 Discord 消息正文里同时运行日志会给出警告行——所以重命名被引用的变量之前要三思。第三步构建事故 → Discord 工作流打开Workflows → Create Workflow命名例如Incidents → Discord进入Builder画布添加Incident触发器触发条件设为On Create并将它重命名为Incident后续引用触发器输出时要用到该 ID添加Discord组件把它连接到触发器并填写参数Webhook URL{{variable.DISCORD_WEBHOOK_URL}}或直接粘贴 URLMessage New incident: {{Incident.title}}\n{{Incident.description}}点击Save启用工作流然后创建一条测试事故——消息应出现在你的 Discord 频道中。关于消息模板中的变量引用这里补充一下官方文档的准确用法触发器属于记录类型触发器运行时会返回一个名为model的值需要逐级下钻引用例如某触发器 ID 为incident-on-create-1时事故标题的引用写法是{{local.components.incident-on-create-1.returnValues.model.title}}。在画布编辑器中请优先使用组件值选择器picker插入这类引用它会生成运行器所期望的精确 ID避免手写出错。Discord 组件的消息字段同样支持变量参见变量在何处生效一节Slack、Teams、Discord、Telegram、Email 的消息文本都接受变量。发送失败时的分支处理Discord 组件有两个出端口Success成功发到频道与Error发送出错。从 SendMessageToChannel.ts 的实现可见网络失败或非 2xx 响应时返回值returnValues.error会携带错误消息并走 error 端口。建议把Error端口接到Log组件或Email通知上让发送失败本身也能被看到。替代方案使用 API 组件如果不想使用专用组件API组件完全可以实现相同效果。API 组件支持GET、POST、PUT、PATCH、DELETE方法配置如下Method方法POSTURL{{variable.DISCORD_WEBHOOK_URL}}Headers请求头Content-Type: application/jsonBody请求体{ content: New incident: {{Incident.title}} }当需要 Discord 更丰富的embed嵌入卡片时API 方案是更好的选择——只需在请求体中追加embeds数组即可对应 Discord Execute Webhook 接口的embeds参数。API 组件的输出包含Success与Error两个端口Success 在调用成功2xx时触发并透传状态、请求头与响应体Error 在网络失败或非 2xx 时触发并透传错误消息。一个使用上的差别值得说明专用 Discord 组件内部已经替你完成了把content字段封装进 JSON 请求体这一步而 API 组件需要你自己构造完整的 JSON 请求体。此外若你用 API 组件发送到 Discord请同样把 URL 保存在秘密全局变量中避免密钥进入日志。进阶技巧按严重程度过滤只在特定级别发消息用ConditionsIf / Else组件在 Discord 块之前做分支。Conditions 组件支持、!、、、、、contains、starts with、ends with等运算符对事故严重程度字段做比较Left value左值{{Incident.incidentSeverity.name}}Operator运算符Right value右值例如CriticalConditions 输出Yes与No两个分支把 Discord 组件接在 Yes 分支上即可实现仅严重级别为 Critical 时推送。覆盖完整生命周期On Update 工作流触发器Incident → On Create只覆盖创建事件。要同步发布**确认acknowledgement和解决resolution**消息可以再构建一个以Incident → On Update为触发器的工作流同样接 Discord 组件发到同一频道消息模板可以引用更新后的事故状态字段。在流程之间复用通知逻辑组件文档中还提到一种模式用Execute Workflow组件构建一个发到事故频道的共享工作流然后从任何需要通知频道的流程中调用它。调用方继续运行、不等待被调用流程结束。配合全局变量中的DISCORD_WEBHOOK_URL通知逻辑只需维护一处。安全与限制小结域名白名单Discord 组件只接受discord.com与discordapp.com域名的 Webhook URLIncomingWebhookUtils.ts禁止重定向发送时设置doNotFollowRedirects: true防止数据被转发给其他主机SendMessageToChannel.ts密钥脱敏把 URL 标记为 Secret 后值会在运行日志与步骤追踪中被抹除官方还提示变量可写但不可读回——content字段对 API 而言是只写的这正适合存放轮换的令牌消息必填text参数缺失时组件会直接报错请确保模板引用能正确解析未解析引用会原样透传务必检查运行日志。延伸阅读集成概览 —— 出站 / 入站两种模式与全部集成目录Telegram 集成 —— 相同的思路用于 Telegram工作流组件参考 —— Discord 及全部组件目录工作流变量 —— 全局变量、秘密变量与引用语法Discord 组件运行时实现SendMessageToChannel.tsDiscord 组件元数据定义Common/Types/Workflow/Components/Discord.ts【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考