ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

OneUptime Discord 集成实战:用内置工作流把事件(Incident)实时推送到 Discord 频道

OneUptime Discord 集成实战:用内置工作流把事件(Incident)实时推送到 Discord 频道 OneUptime Discord 集成实战用内置工作流把事件Incident实时推送到 Discord 频道【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime本文基于 OneUptime 官方文档中的 Discord 集成指南integrations/discord.md编写完整讲解如何把事件更新Incident推送到 Discord 频道创建 Webhook、配置全局变量、搭建工作流并用 API 组件替代方案实现更丰富的消息格式。结合仓库中 Discord 工作流组件的元数据定义、执行实现与内置工作流模板源码还会说明该集成的底层调用链、URL 校验与防重定向等安全细节。1. 集成定位与数据流OneUptime 内置了一个Discord工作流组件因此将事件更新推送到 Discord 是平台中最快搭建的集成之一。该集成是**出站outgoing**方向OneUptime 通过一条 Discord 入站 Webhook URL 向目标频道发消息Discord 侧不需要开放任何回调接口给 OneUptime。OneUptime Incident → On Create ──► Discord component ──► message in your channel即当项目中的一个事件被创建时触发器Incident → On Create驱动工作流执行Discord 组件携带消息文本向 Webhook 地址发起 POST 请求消息最终出现在指定的频道里。2. 第一步在 Discord 中创建入站 Webhook打开 Discord进入目标频道选择Edit Channel → Integrations → Webhooks点击New Webhook为其命名例如OneUptime选择消息投递的目标频道然后复制生成的 Webhook URL。Webhook URL 形如https://discord.com/api/webhooks/id/token。这条 URL 本身就是访问凭据拿到 URL 的人即可向该频道发消息因此要按机密信息对待。3. 第二步保存 Webhook URL 为全局变量可选但推荐在 OneUptime 中进入Arbeitsabläufe工作流→ Globale Variablen全局变量→ 创建将变量命名为DISCORD_WEBHOOK_URL粘贴 Webhook URL并勾选Is Secret机密。把 URL 存成变量有两个直接好处原文档原文多个工作流可以复用同一条 URL不必逐处粘贴轮换 Webhook 时只需改一处。配合Is Secret标记该值不会以明文形式出现在工作流展示中避免凭据泄露到日志或截图里。4. 第三步创建工作流打开工作流 → 创建工作流命名为Incidents → Discord进入Builder添加一个VorfallIncident触发器动作选On Create创建时将其命名为Incident添加一个Discord组件并连接到触发器上配置两个必填参数Webhook URL填{{variable.DISCORD_WEBHOOK_URL}}引用全局变量也可以直接粘贴 URLMessage消息文本例如 New incident: {{Incident.title}}\n{{Incident.description}}保存并启用工作流随后创建一个测试事件消息就会出现在 Discord 频道中。组件参数对照源码文档中的两个字段与组件元数据定义一一对应。在 Discord 组件元数据 中该组件注册为 “Send Message to Discord”分类 Discord参数定义如下参数 ID名称类型必填说明webhook-urlDiscord Incoming Webhook URLURL是标记为isSensitive: true敏感字段占位示例为https://discord.com/api/webhooks/1234567890/XXXX...textMessage TextLongText是实际发送的消息内容组件只有一个输入端口in两个输出端口success消息发送成功后执行后续节点与error失败时走错误分支返回值error用于承载失败原因。也就是说在工作流画布里你可以把“发送成功”和“发送失败”接成两条不同的后续处理链路。执行实现与两条安全设计执行逻辑位于 SendMessageToChannel核心流程为校验text参数存在否则直接走错误分支并抛出 “Discord message not found”通过IncomingWebhookUtils.getPinnedWebhookUrl对webhook-url做主机固定host pinning校验允许域名为 DISCORD_WEBHOOK_DOMAINS 中定义的两个域discord.com与discordapp.com以Content-Type: application/json向 Webhook 发起 POSTBody 为{ content: text }对应 Discord 执行 Webhook 的官方接口请求显式设置doNotFollowRedirects: true——源码注释解释得很直白主机已经被固定跟随重定向会把消息以及 Webhook 凭据交还给重定向目标控制者因此拒绝跟随后端重定向成功则从success端口继续遇到HTTPErrorResponse或异常则携带错误信息从error端口走并可通过返回值error记录到日志节点。这两点域名白名单校验 禁止跟随重定向意味着即使有人在工作流中填写了伪造的 Discord 风格地址或恶意跳转地址组件也会拒绝执行而不是把凭据发往任意主机。5. 内置模板一键导入“事件创建即通知 Discord”工作流从源码结构看OneUptime 在工作流模板库中已经内置了与本文档完全对应的现成模板。在 工作流模板定义 中模板incident-created-discord名称 “Notify Discord on new incident”声明了本地变量discordWebhookUrl提示文案指引用户去 Discord 的 Channel Settings → Integrations → Webhooks 复制 URL其图形结构为incident-on-create-1事件创建触发器discord-1discord-send-message-to-channel组件参数引用{{local.variables.discordWebhookUrl}}消息文本自动拼接事件编号、标题、严重级与状态 **Incident {{...model.incidentNumberWithPrefix}} declared** **Title:** {{...model.title}} **Severity:** {{...model.incidentSeverity.name}} **State:** {{...model.currentIncidentState.name}}log-delivery-failed挂在 Discord 组件的error端口上输出❌ Discord could not deliver the incident notification: {{...returnValues.error}}用于把投递失败记入日志。如果你不需要自定义消息格式直接导入这个模板、填好变量即可省去了手工连线的步骤。6. 替代方案用 API 组件手动调用 Discord Webhook如果不想使用专用组件一个API块也能达到同样效果MethodPOSTURL{{variable.DISCORD_WEBHOOK_URL}}HeadersContent-Type: application/jsonBody{ content: New incident: {{Incident.title}} }这个方式在需要用到 Discord 更丰富的Embeds嵌入式卡片时尤其有用——只需在 Body 中追加embeds数组Discord 的 Webhook 接口支持embeds字段来构造带标题、描述、颜色、字段列表的卡片式消息。需要注意的取舍是API 块是通用 HTTP 请求不具备专用组件内置的域名白名单校验因此 URL 务必通过变量引用、并保证只指向真实的 Discord Webhook 地址。7. 进阶技巧按严重级过滤使用**条件Condition**节点在 Discord 块之前按{{Incident.incidentSeverity.name}}分支只对特定严重级例如仅严重/致命发通知避免频道被低优先级事件刷屏覆盖事件全生命周期再为Incident → On Update添加一条工作流把“已确认Acknowledged”“已解决Resolved”等状态变更也推送到同一频道与 On Create 消息形成完整的事件时间线。8. 参考资料与延伸阅读集成总览出站集成模式integrations/index.mdTelegram 集成同样的 Webhook 原理integrations/telegram.md工作流组件参考含 Discord 组件说明workflows/components.md工作流变量与触发器workflows/variables.md、workflows/triggers.md组件元数据定义Common/Types/Workflow/Components/Discord.ts组件执行实现Common/Server/Types/Workflow/Components/Discord/SendMessageToChannel.tsWebhook 域名白名单与 URL 固定校验Common/Server/Types/Workflow/Components/IncomingWebhookUtils.ts内置“事件通知 Discord”模板Common/Types/Workflow/Templates.ts适用前提说明本文基于当前仓库中的文档与源码组件 ID 为discord-send-message-to-channelWebhook 白名单域为discord.com/discordapp.com。UI 中的菜单名称可能随版本与界面语言略有差异以实际控制台为准。【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表