
Apache DolphinScheduler Script 告警插件实战用 Shell 脚本接管告警通知【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinschedulerScript 告警插件是 Apache DolphinScheduler 告警体系中最灵活的扩展点之一它允许你把告警的标题、内容与自定义参数透传给一台服务器上的 Shell 脚本由脚本自行完成通知动作如调用内部消息网关、钉钉/飞书 Webhook 之外的自建接口、运维工单系统等。读完本文你将掌握在告警实例管理中配置 Script 插件的完整方法、三个核心参数的语义与约束以及从 ScriptSender 到ProcessBuilder的底层执行链路和安全校验逻辑。Script 插件是什么当内置的 Email、DingTalk、FeiShu、WeChat 等告警渠道都无法满足你的通知需求时DolphinScheduler 允许你启用Shell script方式告警在「告警实例管理」中新建一个告警实例选择Script插件即可。插件本身不做任何推送动作而是把你预先部署在 DolphinScheduler 服务端机器上的.sh脚本拉起来执行执行结果退出码直接决定本次告警的成败。该插件位于仓库的 dolphinscheduler-alert-script 模块通过AutoService(AlertChannelFactory.class)注册为名为Script的告警通道见 ScriptAlertChannelFactory.java被打包为alert.script插件随告警服务加载。参数配置详解在告警实例管理中选择Script插件后需要配置三个参数。下表为官方文档给出的参数说明ParameterDescriptionUser ParamsUser defined parameters will pass to the script.Script PathThe file location path in the server, only support .sh fileTypeSupportShellscript.结合插件源码中的参数定义ScriptAlertChannelFactory.java 与 ScriptParamsConstants.java可以进一步明确每个参数的底层语义User Params用户自定义参数内部参数名为userParams非必填可留空。该值会在执行时原样透传给脚本的-p选项供脚本内的自定义逻辑使用。在源码中它经StringUtils.isNotBlank判空处理空值会被替换为空字符串不会导致 NPE对应测试用例testUserParamsNPE。Script Path脚本路径内部参数名为path必填是脚本在服务端机器上的文件绝对路径。仅支持.sh文件源码中executeShellScript会先校验scriptPath.endsWith(.sh)否则直接返回失败信息shell script is invalid, only support .sh file。执行前还会依次校验文件存在exists()且是普通文件isFile()任一不满足即告警失败。该插件不支持 Windows在 Windows 操作系统上执行会直接返回shell script not support windows os。Type脚本类型内部参数名为type必填为单选Radio控件。目前仅支持SHELL一种类型对应枚举 ScriptType.java 中的SHELL(0, SHELL)。源码中预留了扩展位若传入非 SHELL 类型会走sendScriptAlert的兜底分支返回script type error注释也提示未来可在该处扩展 Python 等其他类型脚本。脚本如何被调用底层执行链路配置好告警实例后每当产生告警ScriptAlertChannel.process 会取出AlertData的标题title与内容content连同告警实例参数一并交给ScriptSender。ScriptSender组装出的实际命令是/bin/sh -c scriptPath -t title -c content -p userParams即你的脚本会被要求支持三个命令行选项-t传入告警标题、-c传入告警正文、-p传入用户自定义参数。仓库测试目录中的示例脚本 scriptExample.sh 给出了标准写法——用getopts t:c:p:解析这三个参数然后写入你自己的业务逻辑#!/bin/bash while getopts t:c:p: opts; do case $opts in t) t$OPTARG ;; c) c$OPTARG ;; p) p$OPTARG ;; ?) ;; esac done # Write your specific logic here # Set the exit code according to your execution result, and alert needs to use it to judge the status of this alarm result if [ $t error msg title ]; then exit 12 fi exit 0脚本的退出码直接决定告警结果ProcessUtils.executeScript通过ProcessBuilder启动子进程process.waitFor()返回的退出码为0时告警成功send script alert msg success非 0 时告警失败send script alert msg error,exitCode is N。上述示例脚本中当标题为error msg title时返回退出码 12用来模拟告警失败场景。执行期间子进程的标准输出与标准错误流分别由两个 StreamGobbler 线程异步消费避免缓冲区写满导致进程阻塞输出内容记录到告警服务日志中便于排查脚本执行问题。安全与权限注意事项官方 Note官方文档明确列出两点注意事项结合源码可以理解其背后的机制考虑脚本文件相对于执行租户的访问权限脚本以 DolphinScheduler 服务进程告警服务所在租户/用户的权限执行因此必须确保该运行账号对脚本文件具备读取与执行权限否则脚本可能因权限不足而无法运行。平台不校验脚本内容与是否被篡改告警插件会原样执行对应的 Shell 脚本平台不会审查脚本内容也不会校验脚本是否被恶意篡改。因此必须高度信任该脚本并信任使用该功能的用户不会滥用此能力。从安全角度这也是一个高权限入口应仅授权给可信的运维人员配置。源码层面的补充注入防护虽然脚本内容不受平台审查但平台对传入脚本的参数做了注入防护。在 ScriptSender.executeShellScript 中若userParams、title、content任一包含单引号会被判定为非法参数而拒绝执行防止拼接命令时的单引号逃逸注入。对应的单元测试testScriptSenderInjectionTest用 ; calc.exe ; 验证了该拦截逻辑见 ScriptSenderTest.java。典型使用步骤在 DolphinScheduler 服务端机器上编写并放置你的告警脚本.sh确保脚本可执行、运行账号有权限访问。进入「安全中心 → 告警实例管理」不同版本菜单位置略有差异点击「创建告警实例」。告警插件类型选择Script依次填写Script Path脚本在服务端的绝对路径如/opt/alert/notify.shUser Params需要透传给脚本的自定义参数可选如业务方标识、机器人 Token 等Type选择SHELL。保存后在需要使用该通知方式的工作流或告警组中引用该告警实例。触发一次告警验证告警成功后可在告警历史中看到成功记录失败时可根据退出码与StreamGobbler记录的脚本输出日志排查原因。验证与测试插件模块自带完整的单元测试ScriptSenderTest.java覆盖了以下关键场景也可作为你理解插件行为的参考正常执行普通标题 内容脚本退出码为 0告警成功失败语义标题为error msg title时脚本返回 12告警失败注入防护用户参数包含单引号注入串时被拒绝告警失败空值健壮性userParams为 null 时仍可正常执行path为 null 或非法路径时返回对应错误信息类型异常type 为 null 时返回失败。小结Script 插件是 DolphinScheduler 告警体系的万能适配器-t、-c、-p三个选项让标准告警数据与自定义参数能够无侵入地进入你的自有脚本退出码即告警结果的设计让脚本状态与告警状态严格对齐。配置时请务必记住官方 Note 的两点要求——确保执行租户具备脚本访问权限并高度信任脚本本身。若需查阅插件完整实现可深入 dolphinscheduler-alert-script 源码目录 与告警插件聚合模块继续研究。【免费下载链接】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),仅供参考