DolphinScheduler Alert SPI 主要设计

DolphinScheduler SPI 设计

DolphinScheduler 正在处于微内核 + 插件化的架构更改之中,所有核心能力如任务、资源存储、注册中心等都将被设计为扩展点,我们希望通过 SPI 来提高 DolphinScheduler 本身的灵活性以及友好性(扩展性)。

告警相关代码可以参考 dolphinscheduler-alert-api 模块。该模块定义了告警插件扩展的接口以及一些基础代码,当我们需要实现相关功能的插件化的时候,建议先阅读此块的代码,当然,更建议你阅读文档,这会减少很多时间,不过文档有一定的后滞性,当文档缺失的时候,建议以源码为准(如果有兴趣,我们也欢迎你来提交相关文档),此外,我们几乎不会对扩展接口做变更(不包括新增),除非重大架构调整,出现不兼容升级版本,因此,现有文档一般都能够满足。

我们采用了原生的 JAVA-SPI,当你需要扩展的时候,事实上你只需要关注扩展org.apache.dolphinscheduler.alert.api.AlertChannelFactory接口即可,底层相关逻辑如插件加载等内核已经实现,这让我们的开发更加专注且简单。

另外,AlertChannelFactory 继承自 PrioritySPI,这意味着你可以设置插件的优先级,当你有两个插件同名时,你可以通过重写 getIdentify 方法来自定义优先级。高优先级的插件会被加载,但是如果你有两个同名且优先级相同的插件,加载插件时服务器会抛出 IllegalArgumentException

顺便提一句,我们采用了一款优秀的前端组件 form-create,它支持基于 json 生成前端 ui 组件,如果插件开发牵扯到前端,我们会通过 json 来生成相关前端 UI 组件,org.apache.dolphinscheduler.spi.params 里面对插件的参数做了封装,它会将相关参数全部全部转化为对应的 json,这意味这你完全可以通过 Java 代码的方式完成前端组件的绘制(这里主要是表单,我们只关心前后端交互的数据)。

本文主要着重讲解 Alert 告警相关设计以及开发。

主要模块

如果你并不关心它的内部设计,只是想单纯的了解如何开发自己的告警插件,可以略过该内容。

  • dolphinscheduler-alert-api

    该模块是 ALERT SPI 的核心模块,该模块定义了告警插件扩展的接口以及一些基础代码,扩展插件必须实现此模块所定义的接口:org.apache.dolphinscheduler.alert.api.AlertChannelFactory

  • dolphinscheduler-alert-plugins

    该模块是目前我们提供的插件,目前我们已经支持数十种插件,如 Email、DingTalk、Script等。

Alert SPI 主要类信息:

AlertChannelFactory 告警插件工厂接口,所有告警插件需要实现该接口,该接口用来定义告警插件的名称,需要的参数,create 方法用来创建具体的告警插件实例。

AlertChannel 告警插件的接口,告警插件需要实现该接口,该接口中只有一个方法 process ,上层告警系统会调用该方法并通过该方法返回的 AlertResult 来获取告警的返回信息。

AlertData 告警内容信息,包括 id,标题,内容,日志。

AlertInfo 告警相关信息,上层系统调用告警插件实例时,将该类的实例通过 process 方法传入具体的告警插件。内部包含告警内容 AlertData 和调用的告警插件实例的前端填写的参数信息。

AlertResult 告警插件发送告警返回信息。

org.apache.dolphinscheduler.spi.params 该包下是插件化的参数定义,我们前端使用 from-create 这个前端库,该库可以基于插件定义返回的参数列表 json 来动态生成前端的 ui,因此我们在做 SPI 插件开发的时候无需关心前端。

该 package 下我们目前只封装了 RadioParam,TextParam,PasswordParam,分别用来定义 text 类型的参数,radio 参数和 password 类型的参数。

AbsPluginParams 该类是所有参数的基类,RadioParam 这些类都继承了该类。每个 DS 的告警插件都会在 AlertChannelFactory 的实现中返回一个 AbsPluginParams 的 list。

alert_spi 具体设计可见 issue:Alert Plugin Design

Alert SPI 内置实现

  • Email

    电子邮件告警通知

  • DingTalk

    钉钉群聊机器人告警

    相关参数配置可以参考钉钉机器人文档。

  • EnterpriseWeChat

    企业微信告警通知

    相关参数配置可以参考企业微信机器人文档。

  • Script

    我们实现了 Shell 脚本告警,我们会将相关告警参数透传给脚本,你可以在 Shell 中实现你的相关告警逻辑,如果你需要对接内部告警应用,这是一种不错的方法。

  • FeiShu

    飞书告警通知

  • Slack

    Slack告警通知

  • PagerDuty

    PagerDuty告警通知

  • WebexTeams

    WebexTeams告警通知 相关参数配置可以参考WebexTeams文档。

  • Telegram

    Telegram告警通知 相关参数配置可以参考Telegram文档。

  • Http

    我们实现了Http告警,调用大部分的告警插件最终都是Http请求,如果我们没有支持你常用插件,可以使用Http来实现你的告警需求,同时也欢迎将你常用插件贡献到社区。