
深入解析 DolphinScheduler Alert SPI从告警插件架构到自定义插件开发实战【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler本指南以 Apache DolphinScheduler 的告警 SPIService Provider Interface设计文档docs/docs/zh/contribute/backend/spi/alert.md为核心系统讲解 DolphinScheduler 微内核 插件化架构下的告警扩展点核心接口定义、参数封装机制、内置告警插件族以及如何基于原生 Java SPI 与 form-create 前端组件开发一个可用的自定义告警插件。读完本文你将掌握AlertChannelFactory扩展点的完整用法能够独立为 DolphinScheduler 接入新的告警渠道如内部 IM、自建 Webhook、监控平台等。一、背景微内核 插件化架构下的告警扩展点DolphinScheduler 正处于微内核Microkernel 插件化Plugin的架构演进之中。任务Task、资源存储Storage、注册中心Registry等核心能力都被抽象为可扩展点告警Alert正是这一设计理念的典型落地模块。其目标是通过 SPI 机制提升系统的灵活性、可扩展性与社区协作的友好度——任何团队都可以在不改动内核代码的前提下为系统接入自己需要的告警渠道。从源码结构看这一设计直接体现在仓库的模块划分上dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-apiALERT SPI 的核心模块定义告警插件的扩展接口与基础数据类dolphinscheduler-alert/dolphinscheduler-alert-plugins/官方提供的一系列内置告警插件实现Email、DingTalk、Script、Http 等dolphinscheduler-alert/dolphinscheduler-alert-server告警服务端负责告警任务的调度与对插件的统一调用。官方文档特别提醒实现插件化功能时建议先阅读dolphinscheduler-alert-api模块代码文档存在一定的滞后性当文档与源码不一致时以源码为准社区也欢迎为文档提交贡献。同时官方对扩展接口几乎不会做破坏性变更不含新增因此现有文档在大多数情况下都具备参考价值。二、设计基石原生 Java SPI 与插件优先级机制DolphinScheduler 的告警 SPI 采用原生 Java SPI实现这意味着插件开发者只需要聚焦实现org.apache.dolphinscheduler.alert.api.AlertChannelFactory接口插件加载、服务发现等底层逻辑由内核统一完成。开发者的关注点被大幅收敛到插件的业务逻辑本身。2.1 AlertChannelFactory 与 PrioritySPIAlertChannelFactory继承自org.apache.dolphinscheduler.spi.plugin.PrioritySPI其接口定义如下AlertChannelFactory.javapublic interface AlertChannelFactory extends PrioritySPI { /** 返回告警渠道名称如 Email、Http */ String name(); /** 创建具体的告警插件实例 */ AlertChannel create(); /** 返回该插件需要在 Web UI 上展示的配置参数列表 */ ListPluginParams params(); default SPIIdentify getIdentify() { return SPIIdentify.builder().name(name()).build(); } }三个核心方法的职责非常清晰name()插件的唯一标识名用于在前端告警实例配置中识别渠道类型create()工厂方法返回一个AlertChannel实例由上层告警系统在发送告警时调用params()返回参数定义列表ListPluginParams驱动前端表单的动态渲染详见第三节。2.2 插件优先级与冲突处理由于继承自PrioritySPI插件可以设置优先级。当存在两个同名插件时可以通过重写getIdentify()方法自定义优先级高优先级的插件会被加载如果出现两个同名且优先级相同的插件服务器在加载时会抛出IllegalArgumentException以暴露配置冲突。默认实现直接以name()作为SPIIdentify的名称开发者只有在需要同名插件共存与覆盖时才需要重写该方法。三、Alert SPI 核心类信息一览告警 SPI 的接口与数据模型集中在dolphinscheduler-alert-api模块的org.apache.dolphinscheduler.alert.api包下由 6 个类共同构成调用契约。3.1 接口AlertChannelAlertChannel是告警插件的核心业务接口整个接口只有一个方法processAlertChannel.javapublic interface AlertChannel { AlertResult process(AlertInfo info); }上层告警系统dolphinscheduler-alert-server将告警信息封装为AlertInfo传入插件完成发送动作后返回AlertResult供上层判定本次告警是否成功、获取返回信息。3.2 数据模型AlertData / AlertInfo / AlertResult三个数据类构成了告警数据的完整生命周期类职责关键字段AlertData告警内容信息AlertData.javaid告警 ID、title标题、content内容、log日志、alertType告警类型码AlertInfo告警相关信息的聚合载体AlertInfo.javaalertParams前端填写的插件参数 Map、alertData告警内容、alertPluginInstanceId告警插件实例 IDAlertResult告警发送的返回结果AlertResult.javasuccess是否成功、message返回消息其中AlertResult提供了两个便捷的静态工厂方法public static AlertResult success() { return new AlertResult(true, null); } public static AlertResult fail(String message) { return new AlertResult(false, message); }插件在process中只需要根据发送结果返回AlertResult.success()或AlertResult.fail(原因)上层即可据此记录告警发送状态与日志。3.3 辅助枚举ShowType 与 AlertConstantsAlertData之外API 模块还提供了展示类型枚举ShowTypeShowType.java用于描述告警内容的呈现方式TABLE(0)表格TEXT(1)纯文本ATTACHMENT(2)附件TABLE_ATTACHMENT(3)表格 附件MARKDOWN(4)Markdown此外AlertConstants.java 定义了插件参数的通用常量如NAME_SHOW_TYPE、SHOW_TYPE、NAME_WEBHOOK、WEBHOOK等供各插件复用。四、插件参数与前端生成基于 form-create 的 Java 定义方式DolphinScheduler 选用前端组件form-create它支持基于 JSON 动态生成前端 UI。因此插件开发者在做 SPI 插件时完全无需关心前端实现org.apache.dolphinscheduler.spi.params包会对插件参数做封装将全部参数转化为对应的 JSON通过 Java 代码即可完成前端组件的绘制主要面向表单只关心前后端交互的数据。4.1 参数封装包结构dolphinscheduler-spi模块中的参数体系如下params 包基类AbsPluginParams所有参数的父类与PluginParams表单类型input/InputParam文本输入、input/number/InputNumberParam数字输入、radio/RadioParam单选、select/SelectParam下拉选择基础构件DataType数据类型、ParamsOptions选项、Validate校验规则如必填、类型、ParamsProps等转换工具PluginParamsTransfer负责将参数列表序列化为前后端交互的 JSON。说明原文档写作时仅封装了RadioParam、TextParam、PasswordParam三种参数当前仓库在此基础上已扩展出InputParam、InputNumberParam、SelectParam等更完整的参数族但设计思想一脉相承——所有参数类均继承自统一的参数基类并在AlertChannelFactory#params()中返回ListPluginParams。4.2 从参数定义到前端表单每个告警插件都会在AlertChannelFactory的实现中返回一个ListPluginParams。以 Http 告警插件为例其工厂类HttpAlertChannelFactory中完整定义了 6 个表单参数HttpAlertChannelFactory.javaInputParam url InputParam.newBuilder(url, $t(url)) .setPlaceholder(JSONUtils.toJsonString(AlertInputTips.getAllMsg(AlertInputTips.URL))) .addValidate(Validate.newBuilder().setRequired(true).build()) .build(); RadioParam requestType RadioParam.newBuilder(requestType, $t(requestType)) .addParamsOptions(new ParamsOptions(HttpRequestMethod.GET.name(), HttpRequestMethod.GET.name(), false)) .addParamsOptions(new ParamsOptions(HttpRequestMethod.POST.name(), HttpRequestMethod.POST.name(), false)) .addParamsOptions(new ParamsOptions(HttpRequestMethod.PUT.name(), HttpRequestMethod.PUT.name(), false)) .setValue(HttpRequestMethod.GET.name()) .addValidate(Validate.newBuilder().setRequired(true).build()) .build(); InputNumberParam timeout InputNumberParam.newBuilder(timeout, $t(timeout)) .setValue(HttpAlertConstants.DEFAULT_TIMEOUT) .addValidate(Validate.newBuilder().setType(DataType.NUMBER.getDataType()).setRequired(false).build()) .build(); return Arrays.asList(url, requestType, headerParams, bodyParams, contentType, timeout);各参数含义如下参数名类型必填说明urlInputParam是接收告警的 HTTP 接口地址requestTypeRadioParam是请求方法可选 GET / POST / PUT默认 GETheaderParamsInputParam否自定义请求头JSON 格式bodyParamsInputParam否请求体参数JSON 格式contentTypeRadioParam是Content-Type可选application/json与application/x-www-form-urlencoded默认 JSONtimeoutInputNumberParam否请求超时时间默认120见 HttpAlertConstants.java这些参数在用户创建告警实例时渲染为表单用户填写后保存为键值对告警发送时上层会将它们封装进AlertInfo.alertParamsMapString, String传给插件实例。五、内置告警插件实现dolphinscheduler-alert-plugins目录下是官方提供的告警插件族仓库中每个插件均为独立 Maven 模块其组织方式与HttpAlertChannelFactory完全一致——实现AlertChannelFactory、声明AutoService(AlertChannelFactory.class)注解见 HttpAlertChannelFactory.java即可被内核自动发现与加载。当前内置插件一览对应 alert.md 的 Alert SPI 内置实现 章节可在dolphinscheduler-alert/dolphinscheduler-alert-plugins/下逐模块查看插件模块路径说明Emaildolphinscheduler-alert-email电子邮件告警通知DingTalkdolphinscheduler-alert-dingtalk钉钉群聊机器人告警参数配置参考钉钉机器人文档EnterpriseWeChatdolphinscheduler-alert-wechat企业微信告警通知参数配置参考企业微信机器人文档Scriptdolphinscheduler-alert-scriptShell 脚本告警将告警参数透传给脚本适合对接内部告警应用FeiShudolphinscheduler-alert-feishu飞书告警通知Slackdolphinscheduler-alert-slackSlack 告警通知PagerDutydolphinscheduler-alert-pagerdutyPagerDuty 告警通知WebexTeamsdolphinscheduler-alert-webexteamsWebexTeams 告警通知参数配置参考 WebexTeams 文档Telegramdolphinscheduler-alert-telegramTelegram 告警通知参数配置参考 Telegram 文档Httpdolphinscheduler-alert-http通用 HTTP 告警可对接任意 Webhook 服务5.1 以 Http 插件为例插件实现的完整调用链Http 插件的实现是理解整个调用链的最佳样例工厂层HttpAlertChannelFactory通过AutoService(AlertChannelFactory.class)注册服务name()返回Httpparams()返回上述 6 个参数定义create()返回new HttpAlertChannel()渠道层HttpAlertChannel.process()HttpAlertChannel.java取出alertData与alertParams交给HttpSender执行发送public AlertResult process(AlertInfo alertInfo) { AlertData alertData alertInfo.getAlertData(); MapString, String paramsMap alertInfo.getAlertParams(); if (null paramsMap) { return new AlertResult(false, http params is null); } return new HttpSender(paramsMap).send(alertData.getContent()); }发送层HttpSender根据 URL、请求方法、Header、Body、Content-Type 与超时时间构造并发送 HTTP 请求最终把请求结果转换为AlertResult返回上层。值得注意的是Http 插件的设计定位——调用大部分的告警插件最终都是 Http 请求——使其成为对接任意 Webhook 服务的通用底座。如果官方未支持某常用插件完全可以基于 Http 快速实现同样欢迎将常用插件贡献回社区。5.2 Script 插件的透传机制Script 插件Shell 脚本告警的价值在于高度可编程系统会将相关告警参数透传给脚本开发者可以在 Shell 中编写任意自定义告警逻辑例如对接内部告警平台、组装特殊格式的消息、执行多级通知策略等。对于有自建告警体系的企业而言这是成本最低的扩展路径。六、自定义告警插件开发实战基于以上架构开发一个新告警插件只需四步第 1 步定义参数常量参照HttpAlertConstants的写法将参数名与前端展示文案定义为常量供工厂类与发送类共用。第 2 步实现 AlertChannelFactory实现AlertChannelFactory三个方法并在类上标注AutoService(AlertChannelFactory.class)AutoService(AlertChannelFactory.class) public class MyAlertChannelFactory implements AlertChannelFactory { Override public String name() { return MyAlert; } Override public ListPluginParams params() { // 使用 InputParam / RadioParam / SelectParam 等构建参数列表 // 通过 addValidate(Validate.newBuilder().setRequired(true).build()) 声明必填项 return Arrays.asList(webhookParam, secretParam, showTypeParam); } Override public AlertChannel create() { return new MyAlertChannel(); } }第 3 步实现 AlertChannel实现process(AlertInfo info)方法从info.getAlertData()获取标题、内容、日志从info.getAlertParams()获取用户在前端填写的参数完成实际发送后返回AlertResult.success()或AlertResult.fail(msg)。第 4 步注册并加载将插件打包后放入告警服务dolphinscheduler-alert-server的 classpath 中或按部署方式放入插件目录。内核基于原生 Java SPI 自动发现该工厂类随后即可在 Web UI 的告警实例管理中选择新渠道并配置参数。若需与其他插件同名共存可重写getIdentify()调整优先级。参照源码注意点发送类应保持无状态、幂等设计例如 Http 插件的参数全部来自AlertInfo.alertParams而非构造时注入AlertResult应如实反映发送成败便于上层统计与失败重试。七、与其他 SPI 扩展点的关系告警 SPI 是 DolphinScheduler 插件化体系的一个环节。与本篇同目录的 SPI 文档还覆盖了其他扩展点可对照阅读Task SPI任务插件扩展Datasource SPI数据源插件扩展Registry SPI注册中心插件扩展。它们共享同一套dolphinscheduler-spi参数体系与PrioritySPI优先级机制掌握了 Alert SPI 的开发模式即可举一反三地理解其他扩展点的接入方式。结语DolphinScheduler 的告警 SPI 以原生 Java SPI 为内核以AlertChannelFactory为唯一扩展入口配合dolphinscheduler-spi参数封装与 form-create 前端渲染实现了后端定义参数、前端自动生成表单、内核统一调度的低代码插件开发体验。无论是使用官方内置的 Email、DingTalk、FeiShu、Http 等渠道还是通过 Script 或自研插件对接内部告警体系这套机制都能在不动内核的前提下快速完成接入——这正是 DolphinScheduler 微内核 插件化架构在告警场景下的完整落地。【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考