SeaTunnel 告警通知实战指南:邮件 + 钉钉双渠道任务失败通知 10 分钟跑通
【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址: https://gitcode.com/GitHub_Trending/se/seatunnel
SeaTunnel 是一个分布式数据集成工具,EmailSink和DingTalk是它内置的两个官方 Sink 连接器。本文用它们搭一条任务告警链路:先跑通邮件通知,再接入钉钉群机器人,最后实现双渠道同时触达并控制消息频率。全部配置预计 10 分钟完成,做完你会收到第一封告警邮件和第一条群消息。
一、告警通知链路长什么样
链路只有三段:数据源产出告警数据 → 引擎调度 Sink → 邮件 / 钉钉渠道出站。
检查任务(source:产出失败记录 / 状态数据) │ 数据行 ├─> EmailSink ─> SMTP 服务器 ─> 运维邮箱(固定正文 + CSV 附件) └─> DingTalk ─> 群机器人 Webhook ─> 钉钉群(文本消息)两点事实先说清:这两个连接器本质是普通数据接收器,仓库里没有独立的"告警框架";触发与否取决于"有没有数据流入"。Email 连接器文档和 DingTalk 连接器文档给出了全部参数定义,本文配置项均以此为据。
二、动手前检查清单
一屏看完,任何一项不满足都建议先补齐再写配置。
| 检查项 | 要求 | 验证方式 |
|---|---|---|
| SeaTunnel 版本 | 包含 EmailSink、DingTalk 两个连接器的版本 | 安装目录connectors下能看到对应 jar |
| JDK | 8 及以上;邮件实现依赖 JDK 自带com.sun.mail包,JDK 8 下最稳定 | java -version |
| 网络出口(邮件) | SMTP 服务器 465 或 25 端口可达 | 在运行节点telnet smtp.example.com 465 |
| 网络出口(钉钉) | 可访问oapi.dingtalk.com(HTTPS) | 浏览器或curl访问机器人 Webhook 域名 |
| 邮箱账号 | 已开启 SMTP 服务,并生成授权码(专用密码) | 邮箱设置页可见授权码 |
| 钉钉机器人 | 群内已创建自定义机器人,安全设置为"加签" | 能拿到access_token与SEC开头密钥 |
三、5 分钟跑通邮件通知 📧
目标:用 FakeSource 模拟一条告警记录,验证邮箱能收到带附件的邮件。
新建alert-email.conf,source 部分用一行 FakeSource 模拟一条"失败记录"即可,sink 配置如下:
sink { EmailSink { email_from_address = "sender@example.com" email_to_address = "ops@example.com" email_host = "smtp.example.com" email_transport_protocol = "smtp" email_smtp_auth = true email_smtp_port = 465 email_authorization_code = "你的授权码" email_message_headline = "SeaTunnel 任务告警" email_message_content = "任务明细见附件" } }参数含义与 EmailSinkOptions 定义一一对应:
| 参数 | 说明 | 示例 |
|---|---|---|
| email_from_address | 发件人地址,认证时也作为用户名 | sender@example.com |
| email_to_address | 收件人,多个用英文逗号分隔 | a@x.com,b@x.com |
| email_host | SMTP 服务器地址 | smtp.qq.com |
| email_transport_protocol | 传输协议 | smtp / smtps |
| email_smtp_auth | 是否开启认证;为 true 时自动启用 SSL | true |
| email_smtp_port | SMTP 端口,默认 465 | 465 |
| email_authorization_code | 邮箱授权码,不是登录密码 | 16 位专用密码 |
| email_message_headline | 邮件标题(固定文本) | SeaTunnel 任务告警 |
| email_message_content | 邮件正文(固定文本) | 任务明细见附件 |
| email_attachment_name | 附件文件名,默认 emailsink.csv | alert.csv |
关于"消息模板"要说实话:标题和正文是写死的字符串,不支持变量替换;上游数据行会被写成 CSV 附件随邮件发出。所以动态告警信息放在附件里,正文写清背景即可。
运行验证:
./bin/seatunnel.sh --config alert-email.conf -e local收件箱收到带 CSV 附件的邮件、日志出现 "Sent message successfully" 即成功。注意 EmailSinkWriter 实现中的逻辑:至少写入一行数据才发信,上游没数据时会跳过并记 "No data to send"。
四、钉钉机器人配置与加签 🤖
目标:把同一份告警数据推到钉钉群。
- 群设置 → 智能群助手 → 添加"自定义"机器人,安全设置选"加签"。
- 复制 Webhook 地址(形如
https://oapi.dingtalk.com/robot/send?access_token=...)和SEC开头的密钥。 - 配置 sink:
sink { DingTalk { url = "https://oapi.dingtalk.com/robot/send?access_token=XXXXXX" secret = "SECXXXXXXXXXXXXXXXXXXXX" } }加签原理一句话:连接器用 secret 对时间戳\n密钥做 HmacSHA256 再 Base64、URL 编码,把 timestamp 和 sign 拼到 Webhook 后发出,钉钉服务端据此校验来源,见 DingTalkWriter 实现。
| 参数 | 说明 | 示例 |
|---|---|---|
| url | 机器人 Webhook 完整地址 | https://oapi.dingtalk.com/robot/send?access_token=... |
| secret | 与机器人绑定的加签密钥 | SEC093249eef... |
消息格式上,该连接器把每一行数据序列化为一条 text 类型消息发出(msgtype 在源码中固定为 text)。想要更易读的告警措辞,在上游把行数据组织成完整句子,例如+I[2026-09-17 12:00, job-order-sync, FAILED, OOM at writer]。
五、双渠道同时触达与频率控制
同一个作业里声明两个 sink,数据并行发往两个渠道:
sink { EmailSink { # 同第三节的完整配置 } DingTalk { url = "https://oapi.dingtalk.com/robot/send?access_token=XXXXXX" secret = "SECXXXXXXXX" } }触发条件与限流现状:DingTalk 每收到一行就发一条群消息;EmailSink 只在有数据时、Writer 关闭时发一封。两个连接器都没有内置的频控参数,因此防骚扰要靠数据侧:
- 上游加 filter 或去重,只让"首次失败""状态变化"的行流出,避免重复推送;
- 需要聚合时,优先走邮件渠道——多行数据天然合并成一个附件;
- 巡检类作业按周期调度,周期内汇总后再产出告警行。
六、排错手册
| 现象 | 常见原因 | 处理动作 |
|---|---|---|
| 日志报 Send email failed / SMTP 认证失败 | 填了登录密码而非授权码;email_smtp_auth=true时端口未用 465 | 生成邮箱专用密码;核对 host、port、protocol 三者匹配;确认 SMTP 出口可达 |
| 作业成功但没收到邮件 | source 未产出一行数据(空数据不发信) | 查日志 "No data to send, skipping email";确认 source 行数大于 0 |
| 钉钉返回签名校验失败 | secret 与机器人不匹配;运行机时间与标准时间偏差过大 | 重新复制 webhook 与 secret;用 NTP 同步机器时钟 |
| 钉钉返回安全策略错误 | 机器人安全设置用了"自定义关键词"而非"加签" | 群机器人安全设置改为"加签"后重新取 secret |
| 发送超时、连接被重置 | 网络出口受限 | 放开 465(邮件)与 443(钉钉)出站,或配置代理 |
延伸方向
- 把"周期巡检作业"固定成模板:检查类 source 定时运行,仅在发现失败时向两个 sink 输出记录,形成低噪音的失败通知。
- 仓库中还有 connector-slack 等结构类似的接收器,可按同一模式扩展渠道。
- 附件 CSV 的字段顺序与分隔符由上游 schema 和
email_field_delimiter决定,可按团队规范固化成统一附件格式。
先让一条 FakeSource 数据到达你的邮箱和钉钉群,再谈调度与模板——链路通了,后面的事都是配置。
【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址: https://gitcode.com/GitHub_Trending/se/seatunnel
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考