尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Apache DolphinScheduler Alert SPI 告警插件扩展机制详解与自定义插件开发指南

Apache DolphinScheduler Alert SPI 告警插件扩展机制详解与自定义插件开发指南 任务调度大数据后端前端【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址https://gitcode.com/gh_mirrors/do/dolphinscheduler点击查看免费下载本篇技术指南围绕 Apache DolphinScheduler 的告警扩展点Alert SPI展开系统讲解其微内核 插件化架构下的告警插件设计原理、核心接口职责、参数封装机制并给出可复用的自定义告警插件开发步骤。读完本文你将能够基于AlertChannelFactory从零实现一个可被 DolphinScheduler 自动加载的告警插件并理解插件优先级、前端表单自动生成等底层机制。本文以仓库中 docs/docs/zh/contribute/backend/spi/alert.md 为骨架并结合dolphinscheduler-alert-api、dolphinscheduler-spi等模块的源码进行深度印证。一、背景微内核 插件化架构下的告警扩展点DolphinScheduler 正在经历微内核 插件化的架构演进任务Task、资源存储Storage、注册中心Registry、调度Scheduler等核心能力都被设计为可扩展点。告警Alert正是这一架构思想的典型代表内核只负责插件加载、调度与结果收集具体的告警发送逻辑全部下沉到插件中从而让社区可以无侵入地扩展新的告警渠道。要实现这种扩展性DolphinScheduler 采用了原生的 Java SPIService Provider Interface机制。对于插件开发者而言只需要关注org.apache.dolphinscheduler.alert.api.AlertChannelFactory这一个接口底层诸如插件扫描、实例化、加载等逻辑均由内核完成。这意味着开发告警插件的成本被压缩到实现一个工厂接口 一个发送通道接口。需要说明的是文档具有一定的滞后性若文档描述与源码不一致建议以源码为准仓库中 dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-api 模块是权威依据。同时告警 SPI 的扩展接口几乎不会发生破坏性变更仅可能新增因此基于本文编写的插件具备良好的版本兼容性。二、主要模块接口定义与插件实现分离Alert SPI 相关的代码被清晰地划分为两个模块dolphinscheduler-alert-apiALERT SPI 的核心模块定义告警插件扩展所需的一切接口与基础代码。扩展插件必须实现该模块定义的AlertChannelFactory接口。该模块的全部源码位于 dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-api/src/main/java/org/apache/dolphinscheduler/alert/api核心文件包括AlertChannelFactory.java、AlertChannel.java、AlertData.java、AlertInfo.java、AlertResult.java、ShowType.java、AlertConstants.java等。dolphinscheduler-alert-plugins官方提供的插件集合位于 dolphinscheduler-alert/dolphinscheduler-alert-plugins目前已支持 Email、DingTalk、Script、FeiShu、Slack、PagerDuty、WebexTeams、Telegram、Http、EnterpriseWeChat 等数十种插件每个插件独立成子模块便于单独编译与复用。如果你只关心如何开发自己的告警插件而不关心内部设计细节可以跳过本节直接阅读自定义插件开发实战部分。三、Alert SPI 核心类逐一定位与源码解析Alert SPI 的核心对象可以归纳为一工厂、一通道、三数据载体。下面结合源码逐一说明其职责与实现。1. AlertChannelFactory插件工厂接口AlertChannelFactory是所有告警插件必须实现的入口接口源码见 AlertChannelFactory.java。它定义了三个核心方法String name()返回告警插件的名称用于在 Web UI 与告警实例配置中标识该插件。AlertChannel create()创建具体的告警插件实例返回类型为AlertChannel。ListPluginParams params()返回该插件需要在 Web UI 上展示的可配置参数列表这些参数最终会渲染成前端表单。此外AlertChannelFactory继承自PrioritySPI见 PrioritySPI.java并提供默认实现default SPIIdentify getIdentify() { return SPIIdentify.builder().name(name()).build(); }PrioritySPI接口定义了getIdentify()与compareTo(Integer)方法通过SPIIdentify中的优先级字段实现插件排序。这意味着插件可以设置优先级当存在两个同名插件时高优先级的插件会被加载如果两个插件同名且优先级相同服务器在加载插件时会抛出IllegalArgumentException。开发者可以通过重写getIdentify()来自定义优先级例如Override public SPIIdentify getIdentify() { return SPIIdentify.builder().name(name()).priority(10).build(); }2. AlertChannel告警发送通道接口AlertChannel是告警插件的业务接口源码见 AlertChannel.java。接口中只有一个必须实现的方法AlertResult process(AlertInfo info);上层告警系统会把封装好的AlertInfo传入该方法插件在此完成实际的告警发送并通过返回值AlertResult上报发送结果成功与否、错误信息。接口还提供了一个默认方法closeAlert(AlertInfo info)用于在告警关闭时回调插件默认实现直接返回成功无额外动作需要处理告警恢复/关闭语义的插件可以重写它。3. AlertData告警内容载体AlertData封装了告警内容本身源码见 AlertData.java包含以下字段字段类型说明idint告警 IDtitleString告警标题contentString告警内容正文logString告警相关日志alertTypeint告警类型对应AlertType枚举的 code该类使用 Lombok 注解Builder、Data等可以方便地通过链式 Builder 构造。4. AlertInfo插件调用时的完整上下文AlertInfo是上层系统调用告警插件实例时传入的完整上下文源码见 AlertInfo.java内部包含三个字段MapString, String alertParams告警插件的参数信息即用户在 Web UI 表单中填写、最终以 key-value 形式透传给插件的配置AlertData alertData告警内容见上int alertPluginInstanceId告警插件实例 ID。也就是说process(AlertInfo info)的入参同时携带了用户填写的插件配置与本次要发送的告警数据插件只需从这两个来源取数即可完成发送。5. AlertResult发送结果上报AlertResult用于向告警系统返回发送结果源码见 AlertResult.java包含两个字段boolean success发送是否成功String message结果消息每个插件可以有自己的消息文本。该类还提供了两个便捷静态工厂方法AlertResult.success()与AlertResult.fail(String message)开发者在插件中应优先使用它们构造返回值。四、参数封装用 Java 代码绘制前端表单Alert SPI 的另一大亮点是插件参数与前端 UI 的解耦。DolphinScheduler 的前端引入了 form-create 这一表单生成库它可以基于插件返回的参数 JSON 动态渲染出 Web UI 表单。因此插件开发者完全无需关心前端实现只需在params()方法中返回参数描述对象即可。这些参数描述类位于 dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params 包下全部继承自基类AbsPluginParams当前仓库中为PluginParams见 PluginParams.java。PluginParams内置了name参数 key、formType表单控件类型、title页面显示名称、value默认值/用户输入值、validateList校验规则、props控件属性、emit、hidden、display等字段并通过 Builder 模式构建。原文档提到的RadioParam、TextParam、PasswordParam分别对应单选、文本与密码类型参数而当前仓库的封装已更加丰富从 dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/params 目录结构可以看到目前至少包含input/InputParam、input/number/InputNumberParam文本框、数字输入框radio/RadioParam单选select/SelectParam下拉选择checkbox/CheckboxParam多选fswitch/SwitchParam开关group/GroupParam分组参数。它们共享同一套PluginParams基类与PluginParamsTransfer序列化工具确保最终都能被转换为 form-create 可识别的 JSON 结构。每个 DolphinScheduler 告警插件都会在AlertChannelFactory的实现中返回一个PluginParams的 List内核将其序列化后交由前端渲染用户填写保存后再以MapString, String形式注入AlertInfo.alertParams回传给插件。五、自定义插件开发实战以 Script 插件为模板下面以仓库内置的 ScriptShell 脚本告警插件为模板完整演示自定义告警插件的开发流程。Script 插件将告警参数透传给一个 Shell 脚本由脚本实现具体告警逻辑——这也是对接内部告警系统的一种常用方式。步骤 1实现 AlertChannelFactoryScript 插件的工厂实现见 ScriptAlertChannelFactory.java完整展示了name()、params()、create()三个方法的写法AutoService(AlertChannelFactory.class) public final class ScriptAlertChannelFactory implements AlertChannelFactory { Override public String name() { return Script; } Override public ListPluginParams params() { InputParam scriptUserParam InputParam .newBuilder(ScriptParamsConstants.NAME_SCRIPT_USER_PARAMS, ScriptParamsConstants.SCRIPT_USER_PARAMS) .addValidate(Validate.newBuilder().setRequired(false).build()) .setPlaceholder(AlertInputTips.CUSTOMIZED_PARAMS.getMsg()) .build(); InputParam scriptPathParam InputParam.newBuilder(ScriptParamsConstants.NAME_SCRIPT_PATH, ScriptParamsConstants.SCRIPT_PATH) .addValidate(Validate.newBuilder().setRequired(true).build()) .setPlaceholder(AlertInputTips.SCRIPT_PATH.getMsg()) .build(); RadioParam scriptTypeParams RadioParam .newBuilder(ScriptParamsConstants.NAME_SCRIPT_TYPE, ScriptParamsConstants.SCRIPT_TYPE) .addParamsOptions(new ParamsOptions(ScriptType.SHELL.getDescp(), ScriptType.SHELL.getDescp(), false)) .setValue(ScriptType.SHELL.getDescp()) .addValidate(Validate.newBuilder().setRequired(true).build()) .build(); return Arrays.asList(scriptUserParam, scriptPathParam, scriptTypeParams); } Override public AlertChannel create() { return new ScriptAlertChannel(); } }关键点使用 Google AutoService 的AutoService(AlertChannelFactory.class)注解在编译期自动生成META-INF/services/org.apache.dolphinscheduler.alert.api.AlertChannelFactory服务描述文件这是 Java SPI 被内核发现的必要机制也可以手动在META-INF/services/下创建同名文件并写入工厂类的全限定名params()中通过Validate.newBuilder().setRequired(true)标记必填项setPlaceholder设置输入提示setValue设置默认值如 Script 类型默认选中 Shellcreate()返回真正的通道实例ScriptAlertChannel。步骤 2实现 AlertChannel 完成发送逻辑工厂的create()返回的AlertChannel实现类需要完成核心的发送动作。Script 插件的实现位于同模块下的 ScriptAlertChannel.java其process(AlertInfo info)方法从info.getAlertParams()中取出脚本路径、脚本类型、用户自定义参数从info.getAlertData()中取出告警标题与内容组装成命令行参数后调用ProcessBuilder执行脚本并将执行结果封装为AlertResult返回。一个最小化的通道实现骨架如下public class MyAlertChannel implements AlertChannel { Override public AlertResult process(AlertInfo info) { MapString, String params info.getAlertParams(); AlertData data info.getAlertData(); // 1. 从 params 中读取插件配置如 Webhook 地址、Token 等 // 2. 从 data 中读取告警标题、内容组装请求体 // 3. 发送 HTTP 请求 / 执行外部命令 // 4. 根据结果返回 AlertResult.success() 或 AlertResult.fail(...) return AlertResult.success(); } }步骤 3定义参数常量与枚举与工厂同包的 ScriptParamsConstants.java 定义了参数的 key 常量如脚本路径scriptPath、脚本类型scriptType等保证params()定义与通道实现中取值使用同一组 keyScriptType枚举则定义了当前支持的脚本类型如 SHELL。实践上建议照此模式将参数常量、类型枚举、工厂类、通道实现类组织在同一个插件包内并复用官方提供的基础常量类AlertConstants与提示类AlertInputTips。步骤 4编写单元测试并注册服务仓库中每个告警插件都配套了测试可参考 ScriptAlertChannelFactoryTest.java它断言params()返回的参数列表非空、create()返回的通道实例类型正确。建议在开发插件时遵循同样的测试约定保证工厂与通道行为可回归。测试通过后将插件模块加入 dolphinscheduler-alert-plugins 的聚合构建或独立打包放入插件目录重启告警服务即可在告警实例配置中看到新插件。六、内置告警插件一览DolphinScheduler 官方已在 dolphinscheduler-alert-plugins 下内置了丰富多样的告警插件覆盖主流办公协作与通用协议场景插件说明备注Email电子邮件告警通知经典 SMTP 邮件通道DingTalk钉钉群聊机器人告警参数配置参考钉钉机器人文档EnterpriseWeChat企业微信告警通知参数配置参考企业微信机器人文档FeiShu飞书告警通知飞书群机器人SlackSlack 告警通知通过 Incoming Webhook 发送PagerDutyPagerDuty 告警通知对接事件管理系统WebexTeamsWebexTeams 告警通知参数配置参考 WebexTeams 文档TelegramTelegram 告警通知通过 Bot API 发送ScriptShell 脚本告警将告警参数透传给脚本适合对接内部告警应用HttpHttp 告警通用 HTTP 请求告警其中Http 插件值得特别说明大部分第三方告警渠道本质上都是 HTTP 请求。如果你需要接入的渠道不在官方列表中可以先尝试使用 Http 插件以 JSON 或表单方式直接调用目标接口这通常能覆盖绝大多数需求同时社区也欢迎将常用渠道以新插件的形式贡献回上游。七、总结DolphinScheduler 的 Alert SPI 是一套成熟的微内核 插件化实践扩展面极小只需实现AlertChannelFactory提供名称、参数、创建方法与AlertChannel实现process发送逻辑借助原生 Java SPI 与AutoService即可被内核自动发现前后端解耦基于org.apache.dolphinscheduler.spi.params参数封装与 form-create纯 Java 代码即可完成 Web 表单的定义、校验与渲染优先级机制通过PrioritySPI.getIdentify()定义同名插件冲突时的加载优先级同名同优先级将触发IllegalArgumentException生态完善官方内置 Email、DingTalk、企业微信、飞书、Slack、Script、Http 等十余种插件且接口高度稳定适合作为二次开发与贡献的起点。对告警扩展感兴趣的开发者建议以 dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-api 模块的源码与 Script 插件 为参考按本文第五节的步骤动手实现第一个告警插件即可快速上手整套扩展机制。赞分享任务调度大数据后端前端【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址https://gitcode.com/gh_mirrors/do/dolphinscheduler点击查看免费下载相关推荐大麦自动抢票完整指南配置一次开票瞬间脚本替你点单大麦自动抢票完整指南配置一次开票瞬间脚本替你点单 开票前 10 分钟你盯着页面反复刷新19:30 一到「已售罄」三个字比你的手指还快。 ticketGUI 自动化RPA深入解析 DolphinScheduler Alert SPI从告警插件架构到自定义插件开发实战深入解析 DolphinScheduler Alert SPI从告警插件架构到自定义插件开发实战 本指南以 Apache DolphinScheduler 的任务调度数据编排工作流自动化后端大数据Apache DolphinScheduler 告警 SPI 架构与告警插件开发完全指南Apache DolphinScheduler 告警 SPI 架构与告警插件开发完全指南 Apache DolphinScheduler 正在推进微内核 任务调度大数据后端前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表