Apache DolphinScheduler HTTP 告警插件:参数配置、GET/POST 发送原理与源码级实战指南
【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/gh_mirrors/do/dolphinscheduler
HTTP 告警是 Apache DolphinScheduler 中最通用的告警渠道之一,它允许你把工作流失败、任务告警等消息通过标准 HTTP 请求(GET 或 POST)推送到任意自建系统——例如内部监控平台、企微/钉钉机器人网关、自研消息中心等。本文以官方文档 HTTP 告警指南 为核心,结合仓库中 dolphinscheduler-alert-http 插件的完整源码与测试用例,讲透每一个配置参数的含义、GET/POST 两种发送方式的底层拼接逻辑,以及超时与重试机制,让你既能快速配置上线,也能在排查问题时直达实现层。
一、什么时候选择 HTTP 告警
在 DolphinScheduler 的告警体系里,告警插件通过 SPI 机制(AlertChannelFactory的@AutoService注册)挂载在告警实例管理中。当你的接收端不是一个开箱即用的 SaaS 平台(如钉钉、企微、飞书),而是一个自定义 Web 服务时,HTTP 告警就是最直接的桥接方式:
- 需要把告警转发到自研的运维平台、工单系统或消息网关;
- 接收端只暴露了 HTTP 接口(GET 或 POST),无法使用内置的 IM 或邮件插件;
- 希望在告警请求中自定义请求头(如鉴权 Token)、请求体结构,完全掌控发送报文。
从代码结构看,HTTP 告警插件位于 dolphinscheduler-alert-http,核心由 4 个类组成:插件工厂HttpAlertChannelFactory(定义参数与注册)、通道HttpAlertChannel(入口处理)、常量HttpAlertConstants(参数键与默认值)、发送器HttpSender(真正的 HTTP 请求构造与执行)。
二、创建 HTTP 告警实例
使用 HTTP 告警前,需要先在「安全中心 → 告警实例管理」中创建一个告警实例:
- 进入「安全中心」→「告警实例管理」;
- 点击「创建告警实例」,插件类型下拉框选择
Http; - 填写实例名称(必填)以及下方各配置参数;
- 保存后,在告警组中引用该实例即可,当工作流/任务触发告警时,告警内容会被封装成 HTTP 请求发送出去。
告警实例参数由 HttpAlertChannelFactory.params() 定义。从源码可以确认,该插件实际接收6 个参数:URL、请求方式(requestType)、请求头(headerParams)、请求体(bodyParams)、内容字段(contentField)、超时时间(timeout)。其中 URL、请求方式、请求头、内容字段为必填项(setRequired(true)),请求体与超时时间可留空。
三、参数配置详解
以下参数与官方文档一一对应,并结合源码补充了默认值与校验规则。
| 参数 | 字段名 | 必填 | 说明 |
|---|---|---|---|
| URL | url | 是 | 访问的 HTTP 连接地址,需包含协议、Host、路径;GET 方法时可在 URL 中直接追加参数 |
| 请求方式 | requestType | 是 | POST 或 GET,决定告警消息以何种方式随请求发出 |
| 请求头 | headerParams | 是 | HTTP 请求的完整请求头,JSON 格式,如{"Content-Type":"application/json","token":"xxx"} |
| 请求体 | bodyParams | 否 | HTTP 请求体,JSON 格式;仅 POST 方法生效,GET 无需填写 |
| 内容字段 | contentField | 是 | 承载告警消息内容的字段名,即告警正文最终放到哪个字段里 |
| 超时时间 | timeout | 否 | 请求超时(秒),默认120,见 HttpAlertConstants.DEFAULT_TIMEOUT |
3.1 URL
必须是完整的 URL,包含协议(http://或https://)、Host、路径。GET 方式下可以在 URL 中预置查询参数,例如:
http://10.0.0.10:8080/alert/receive?source=dolphinscheduler3.2 请求头(JSON 格式)
请求头以 JSON 字符串填写,插件会将其解析为键值对并逐一设置到请求中(见 HttpSender.setHeader())。常用于携带 Content-Type、鉴权 Token 等:
{ "Content-Type": "application/json", "Authorization": "Bearer xxxxxx" }3.3 请求体(POST 专用,JSON 格式)
仅 POST 方式生效。填写后,插件会把该 JSON 解析为基础报文,再插入告警内容字段后整体作为请求体发送;留空则请求体只包含告警内容字段。示例:
{ "level": "warning", "source": "dolphinscheduler" }3.4 内容字段
这是告警正文(如失败任务的完整告警内容)最终存放的字段名,GET 与 POST 两种方式都会用到(详见下文)。UI 上各字段的提示文案可在 zh_CN/security.ts 与 en_US/security.ts 中查看。
四、发送类型:GET 与 POST 的底层差异
官方文档指出,请求方式(Request Type)分别对应使用 POST 和 GET 方法发送 HTTP 告警。两者处理告警消息的方式截然不同,见 HttpSender.createHttpRequest():
4.1 GET:告警消息拼接到 URL 参数
GET 方式将告警结果作为 URL 查询参数随请求发出。拼接逻辑在 setMsgInUrl():
- 若 URL 中已包含
?,则用&连接新参数;否则先用?; - 参数格式为
contentField=告警内容; - 告警内容使用
URLEncoder.encode(..., UTF-8)做 URL 编码,避免中文或特殊字符破坏 URL 结构; - 最终通过
new URI(...)构造标准 URI 后发出。
例如 URL 为http://host/alert、内容字段为content、告警内容为Fault tolerance warning时,最终请求为:
http://host/alert?content=Fault+tolerance+warning4.2 POST:告警消息放入请求体
POST 方式将告警结果作为 BODY 参数发送,处理逻辑在 setMsgInRequestBody():
- 若配置了请求体
bodyParams,先将其解析为 JSON 对象(ObjectNode),作为基础报文; - 在对象中追加
contentField: 告警内容; - 序列化为 JSON 字符串,以
StringEntity(..., UTF-8)设置为 POST 请求体。
例如请求体配置为{"level":"warning"}、内容字段为content,则实际发送的报文为:
{ "level": "warning", "content": "告警正文内容" }若请求方式既不是 GET 也不是 POST,插件会直接返回失败结果Request types are not supported(见 HttpSender.send()),因此请务必严格填写POST或GET。
五、源码级原理:从告警触发到 HTTP 发出
一条 HTTP 告警的完整调用链为:
- 告警服务触发告警后,构造
AlertInfo(含AlertData与告警实例参数); - HttpAlertChannel.process() 取出参数 Map,校验非空后交给
HttpSender; HttpSender构造 HTTP 请求(GET 拼 URL / POST 拼 BODY),设置请求头,执行请求并返回AlertResult;- 返回体作为
AlertResult.message,可在告警记录中查看。
5.1 超时控制
超时时间以秒为单位配置(默认 120),在 getResponseString() 中会乘以 1000 换算为毫秒,同时作用于连接超时(connectTimeout)、从连接池获取连接超时(connectionRequestTimeout)和 Socket 读写超时(socketTimeout)。
5.2 重试策略
HTTP 告警内置了重试机制,实现位于 HttpServiceRetryStrategy:
- 最多重试3 次,每次重试前休眠2 秒;
- 对
SSLException(TLS 层错误)不重试; - 对
UnknownHostException、InterruptedIOException、NoHttpResponseException、SocketException等网络类异常进行重试; - 对非幂等的请求(带请求体的
HttpEntityEnclosingRequest)不重试——因此 POST 请求的重试会被谨慎处理,而 GET 请求更可能被安全重试。
这一策略意味着:接收端短时抖动或网络闪断时,告警会自动重试最多 3 次,降低偶发丢告警的概率。
5.3 参数默认值与校验
从 HttpAlertChannelFactory 可以确认各字段的完整校验规则与占位提示,其中 URL、请求头、内容字段、请求方式为必填,请求体可选,超时时间默认为 120 且类型为数字。对应的中英文输入提示定义在 AlertInputTips,会按系统语言环境自动切换。
六、测试用例验证
仓库为 HTTP 告警插件提供了完整的单元测试,是理解行为的最佳佐证:
- HttpSenderTest:构造 GET 请求参数(含 URL、请求方式、请求头、请求体、内容字段、超时时间),验证
send()返回成功,且最终请求 URL 同时包含原始 URL 与内容字段参数——直接印证了 GET 方式“消息拼入 URL”的实现; - HttpAlertChannelFactoryTest:校验插件名称与参数列表;
- HttpAlertChannelTest:校验参数缺失时返回失败结果。
七、配置与排障建议
- 接收端务必能外网/内网可达:URL 必须能被 DolphinScheduler 的 alert-server 访问到,注意防火墙与网络策略;
- GET 注意 URL 长度:告警内容会整体编码后拼入 URL,超长告警可能超出部分网关的 URL 长度限制,若告警正文很大建议改用 POST;
- POST 请求体语义:配置的请求体是“基础 JSON”,插件会向其中注入内容字段后再发送,不要在接收端假设报文只包含你填写的内容;
- 排查手段:发送结果(
AlertResult)会携带服务端响应体或失败原因,可在告警记录中查看;网络类异常会触发最多 3 次、间隔 2 秒的重试; - 超时调优:默认 120 秒对多数场景足够;若接收端处理较慢可适当调大,若接收端响应快但不想等待过久可调小。
通过以上配置与原理说明,你可以快速在 DolphinScheduler 中接入任意 HTTP 接收端,实现告警消息的自定义转发;结合源码中的拼接、编码、超时与重试逻辑,也能在告警丢失或报文不符时准确定位到根因。
【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/gh_mirrors/do/dolphinscheduler
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考