DataHub Slack Action 接入指南:把数据资产变更实时推送到你的 Slack 频道
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
本篇技术指南围绕 DataHub Actions 框架中的 Slack Action 展开,讲解如何将 DataHub 中的标签变更、文档更新、属主变更、Domain 创建等元数据事件,实时以人性化的通知消息推送到你指定的 Slack 频道。读完本文,你将掌握 Slack App 的创建与安装、凭证获取、环境变量/配置文件两种激活方式,以及事件过滤、系统活动抑制、消息渲染等底层实现原理,可直接在 quickstart、k8s/helm 或裸机 Python 环境完成接入。
概述:Slack Action 能做什么
Slack Action 是 DataHub Actions 生态中的一种 Action 插件,负责把 DataHub 上的重要元数据变更事件转发到 Slack 工作区的指定频道。它不是一个通用聊天机器人,而是面向数据治理场景的“变更通知器”。
根据 关联文档,它的核心能力包括:
- 向 Slack 频道发送重要事件的变更通知,例如:
- 为实体(dataset、dashboard 等)添加或移除标签(Tag);
- 在实体级或字段(列)级更新文档(Documentation);
- 为实体添加或移除属主(Ownership);
- 创建 Domain;
- 以及其他由
EntityChangeEvent_v1承载的实体变更事件。
用户体感
Action 启动时会先向目标频道发送一条“欢迎消息”,告知 DataHub Bot 已上线并开始监视事件;此后每收到一个符合条件的事件,就会发送一条格式化通知。原文档提供了两种消息形态的示意:欢迎消息 与 事件通知消息(原文档截图托管于外部静态资源,本文不再重复引用)。
支持的事件类型
| 事件类型 | 是否支持 | 说明 |
|---|---|---|
EntityChangeEvent_v1 | ✅ 支持 | Action 的核心输入,承载“谁在什么时间对哪个实体做了什么操作”的语义 |
MetadataChangeLogEvent_v1 | ❌ 不处理 | 当前版本不会被 Slack Action 处理 |
这一点在源码中有明确的“双重保险”:容器内置的配置文件 slack_action.yaml 中通过filters只放行EntityChangeEvent_v1(并开启enable_mcl_pre_deserialization_filter: true在反序列化前就跳过 MCL 事件),而 Action 本体在 slack.py 中同样只对event.event_type == "EntityChangeEvent_v1"分支处理,其余类型一律记录 debug 日志并跳过。
工作流程与源码结构
从源码结构看,Slack Action 的完整链路如下:
- 事件来源:Action 通过 Kafka 事件源订阅 DataHub 的元数据变更日志(
MetadataChangeLog_Versioned_v1)和平台事件(PlatformEvent_v1),见 slack_action.yaml 的source.config.connection与topic_routes; - 事件过滤:只有
EntityChangeEvent_v1进入 Action; - 语义化组装:
social_util.get_message_from_entity_change_event()把原始事件翻译成人类可读的句子(social_util.py); - 限流发送:
post_message()使用@sleep_and_retry+@limits(calls=1, period=1)保证每秒最多发送 1 条消息,避免触发 Slack API 速率限制(slack.py); - 消息排版:
SlackNotification.get_payload()使用 Slack Block Kit 结构(section + divider)渲染标题与属性列表(slack.py)。
插件入口在 setup.py 中注册为 entry point:slack = datahub_actions.plugin.action.slack.slack:SlackNotificationAction,这就是 YAML 配置里action.type: slack能被框架解析的原因。
前提:在 Slack 工作区创建并安装 DataHub App
接入前必须先配置好 Slack App,以下步骤需要Slack 工作区管理员操作:
- 打开 https://api.slack.com/apps/;
- 点击Create New App,选择From an app manifest方式创建;
- 选择目标工作区;
- 粘贴下面的 Manifest YAML(建议把
name与display_name改为DataHub App YOUR_TEAM_NAME,便于团队识别,非强制):
display_information: name: DataHub App description: An app to integrate DataHub with Slack background_color: "#000000" features: bot_user: display_name: DataHub App always_online: false oauth_config: scopes: bot: - channels:history - channels:read - chat:write - commands - groups:read - im:read - mpim:read - team:read - users:read - users:read.email settings: org_deploy_enabled: false socket_mode_enabled: false token_rotation_enabled: false各 Bot Scope 的作用与通知能力直接相关:chat:write允许 Bot 发消息、channels:read/groups:read/im:read/mpim:read用于解析频道,users:read/users:read.email用于把 Actor 的 URN 解析为可读的用户名,team:read用于读取工作区信息。
- 确认能看到Basic Information页签;
- 点击Install to Workspace,Slack 会列出 App 申请的权限说明并让你选择一个默认频道;
- 注意:Slack App 只能向它被加入的频道发消息,权限授权界面也会明确提示这一点;
- 选择接收通知的频道并点击Allow;
- 回到 https://api.slack.com/apps/ 即可管理该 App。
获取三项凭证与配置信息
完成安装后,需要收集以下三项信息:
1. Signing Secret(签名密钥)
在 App 的Basic Information页,找到App Credentials区域,记录Signing Secret。
2. Bot Token(Bot 用户令牌)
进入OAuth & Permissions页,找到Bot User OAuth Token。DataHub 的 Bot 将使用该令牌与你的 Slack 工作区通信。
3. Slack Channel ID(目标频道 ID)
决定通知要发往哪个频道(例如#datahub-notifications、#data-notifications,或团队已有的数据/管道告警频道),并确保已把 App 添加到该频道。随后获取频道 ID:
- 桌面端:打开频道About页,滚动到底部即可看到 Channel ID;
- 浏览器端:从 URL 中提取。例如频道 URL 中的
TUMKD5EGJ/C029A3M079U,其中Channel ID =C029A3M079U。
部署与激活:三种方式
DataHub Cloud(托管版)
若使用 DataHub Cloud,请直接参考 DataHub Cloud 的 Slack 通知配置指南,按托管平台的指引完成通知配置,无需自行部署 Action。
Docker Quickstart
使用 docker quickstart 运行时无需额外安装软件,datahub-actions容器已预装 Slack Action。只需导出环境变量并重启容器:
| 环境变量 | 必填 | 用途 |
|---|---|---|
DATAHUB_ACTIONS_SLACK_ENABLED | ✅ | 设为"true"以启用 Slack Action |
DATAHUB_ACTIONS_SLACK_SIGNING_SECRET | ✅ | 填入前面获取的 Signing Secret |
DATAHUB_ACTIONS_SLACK_BOT_TOKEN | ✅ | 填入前面获取的 Bot User OAuth Token |
DATAHUB_ACTIONS_SLACK_CHANNEL | ✅ | 填入接收消息的 Slack Channel ID |
DATAHUB_ACTIONS_SLACK_DATAHUB_BASE_URL | ❌ | 默认http://localhost:9002,即 DataHub UI 地址;本地 quickstart 一般无需修改 |
:::note 首次导出这些环境变量后,需要重启datahub-actions容器。最简单的做法是通过 Docker Desktop 界面重启,或执行datahub docker quickstart --stop && datahub docker quickstart重启整个实例。 :::
示例:
export DATAHUB_ACTIONS_SLACK_ENABLED=true export DATAHUB_ACTIONS_SLACK_SIGNING_SECRET=<slack-signing-secret> export DATAHUB_ACTIONS_SLACK_BOT_TOKEN=<bot-user-oauth-token> export DATAHUB_ACTIONS_SLACK_CHANNEL=<slack_channel_id> # 可选:DATAHUB_ACTIONS_SLACK_DATAHUB_BASE_URL 默认 http://localhost:9002 datahub docker quickstart --stop && datahub docker quickstart这些环境变量与容器内配置文件的映射关系可以直接在 slack_action.yaml 中看到:enabled: ${DATAHUB_ACTIONS_SLACK_ENABLED:-false}、bot_token: ${DATAHUB_ACTIONS_SLACK_BOT_TOKEN}等,全部通过${VAR:-default}语法读取;容器入口 start.sh 会把/etc/datahub/actions/system/conf下所有*.yml/*.yaml以-c参数交给datahub-actions actions命令加载。
k8s / Helm
与 quickstart 类似,无需单独安装软件,只需把上述环境变量注入datahub-actions容器即可激活集成。差异在于:Helm 部署下DATAHUB_ACTIONS_SLACK_DATAHUB_BASE_URL为必填,例如你的 DataHub UI 托管在https://datahub.my-company.biz,就需要设置DATAHUB_ACTIONS_SLACK_DATAHUB_BASE_URL=https://datahub.my-company.biz,否则通知消息中拼接的实体链接会指向错误地址。
裸机(CLI 或 Python 方式)
如果直接以 Python 库或 CLI 方式使用datahub-actions,需要先在 Python 虚拟环境中安装 Slack 插件:
pip install "acryl-datahub-actions[slack]"从 setup.py 可以看到该 extra 依赖slack-bolt>=1.15.5(Slack 官方 SDK,Action 内部通过slack_bolt.App构建客户端)。
然后编写配置文件并启动:
示例 Slack Action 配置文件
name: datahub_slack_action enabled: true source: type: "kafka" config: connection: bootstrap: ${KAFKA_BOOTSTRAP_SERVER:-localhost:9092} schema_registry_url: ${SCHEMA_REGISTRY_URL:-http://localhost:8081} topic_routes: mcl: ${METADATA_CHANGE_LOG_VERSIONED_TOPIC_NAME:-MetadataChangeLog_Versioned_v1} pe: ${PLATFORM_EVENT_TOPIC_NAME:-PlatformEvent_v1} ## 3a. 可选:事件过滤器(map),按事件字段精确匹配 # filter: # event_type: <filtered-event-type> # event: # # Filter event fields by exact-match # <filtered-event-fields> # 3b. 可选:事件转换器(array) # transform: # - type: <transformer-type> # config: # # Transformer-specific configs (map) action: type: slack config: # Action-specific configs (map) base_url: ${DATAHUB_ACTIONS_SLACK_DATAHUB_BASE_URL:-http://localhost:9002} bot_token: ${DATAHUB_ACTIONS_SLACK_BOT_TOKEN} signing_secret: ${DATAHUB_ACTIONS_SLACK_SIGNING_SECRET} default_channel: ${DATAHUB_ACTIONS_SLACK_CHANNEL} suppress_system_activity: ${DATAHUB_ACTIONS_SLACK_SUPPRESS_SYSTEM_ACTIVITY:-true} datahub: server: "http://${DATAHUB_GMS_HOST:-localhost}:${DATAHUB_GMS_PORT:-8080}"配置文件的datahub.server用于让 Action 通过 Graph 客户端反向解析实体名称(把 URN 渲染成人类可读名字);在容器化部署中还会额外带上系统客户端鉴权头(见 slack_action.yaml 的datahub.extra_headers.Authorization)。
Slack Action 配置参数
| 字段 | 必填 | 默认值 | 说明 |
|---|---|---|---|
base_url | ❌ | http://localhost:9002/ | DataHub UI 的访问地址,用于拼接通知中实体链接。源码中SlackNotificationConfig的默认值为http://localhost:9002/(slack.py)。原文档参数表中该行描述存在笔误,请以源码默认值为准 |
signing_secret | ✅ | — | Signing Secret,用SecretStr类型保存,日志打印时会被脱敏为********** |
bot_token | ✅ | — | Bot User OAuth Token,同样以SecretStr脱敏存储 |
default_channel | ✅ | — | 接收通知的 Slack Channel ID |
suppress_system_activity | ❌ | True | 是否抑制系统级活动事件。设为False会收到数据摄取等底层系统事件通知,当前版本会产生大量刷屏消息,不建议修改 |
消息渲染与语义化:源码级解析
通知内容并非把原始 JSON 直接转发,而是经过social_util.py语义化组装(social_util.py):
- 操作动词映射:
ADD → added、UPDATE/MODIFY → updated、REMOVE → removed、CREATE → created、REINSTATE → reinstated; - 消息模板按事件类别分派:
lifecycle:actor has {operation} {entityType} {entityLink}.technical_schema:区分“修改了 schema 字段”与“修改了 schema”,字段变更会附带父实体链接并携带?schemaFilter=<字段名>深链;- 其他类别(如
tag、ownership、documentation、domain):actor has {operation} {category} {modifier} for {entityType} {entityLink}.
- 不同实体类型的链接形态:
dataFlow链接到/pipelines/{urn}、dataJob链接到/tasks/{urn},普通实体链接到/{entityType}/{urn};schemaField会向上解析父实体的 Schema 页; - 消息格式适配:Slack 使用 mrkdwn 语法,如链接
<url|title>、加粗*text*(Teams 则使用 Markdown 语法,二者由channel参数区分)。
欢迎消息则由get_welcome_message()生成,包含 DataHub 主页地址、运行主机名、启动时间与时区(social_util.py)。
事件过滤与系统活动抑制
Slack Action 默认只关心“人”产生的操作。在 slack.py 中,若事件的auditStamp.actor是系统 Actor(DATAHUB_SYSTEM_ACTOR_URN)且suppress_system_activity为True,Action 会直接return丢弃该事件——这正是文档强调“不建议改为False”的原因:数据摄取等自动化过程会产生大量底层事件,放开后 Slack 通知会变得非常嘈杂。
如需更精细的控制,可在 Action 管道的filter/transform段配置事件过滤与转换器(即配置文件中被注释的3a/3b部分),框架会在事件进入 Action 之前先执行过滤与转换。
故障排查:从日志验证激活状态
配置正确时,datahub-actions容器的日志会显示 Slack Action 成功启用并运行:
docker logs datahub-datahub-actions-1 ... [2022-12-04 07:07:53,804] INFO {datahub_actions.plugin.action.slack.slack:96} - Slack notification action configured with bot_token=SecretStr('**********') signing_secret=SecretStr('**********') default_channel='C04CZUSSR5X' base_url='http://localhost:9002' suppress_system_activity=True [2022-12-04 07:07:54,506] WARNING {datahub_actions.cli.actions:103} - Skipping pipeline datahub_teams_action as it is not enabled [2022-12-04 07:07:54,506] INFO {datahub_actions.cli.actions:119} - Action Pipeline with name 'ingestion_executor' is now running. [2022-12-04 07:07:54,507] INFO {datahub_actions.cli.actions:119} - Action Pipeline with name 'datahub_slack_action' is now running. ...其中INFO ... Slack notification action configured with ...来自 slack.py,注意密钥已脱敏为**********;Action Pipeline with name 'datahub_slack_action' is now running.表示管道已启动。
如果 Slack Action 未被启用,日志会给出明确提示:
docker logs datahub-datahub-actions-1 .... No user action configurations found. Not starting user actions. [2022-12-04 06:45:27,509] INFO {datahub_actions.cli.actions:76} - DataHub Actions version: unavailable (installed editable via git) [2022-12-04 06:45:27,647] WARNING {datahub_actions.cli.actions:103} - Skipping pipeline datahub_slack_action as it is not enabled [2022-12-04 06:45:27,649] WARNING {datahub_actions.cli.actions:103} - Skipping pipeline datahub_teams_action as it is not enabled [2022-12-04 06:45:27,649] INFO {datahub_actions.cli.actions:119} - Action Pipeline with name 'ingestion_executor' is now running. ...遇到此类日志时,请检查DATAHUB_ACTIONS_SLACK_ENABLED是否已导出为"true",以及容器是否在导出变量后重启过。
小结
Slack Action 是 DataHub 元数据变更通知的轻量落地方案:只需一个 Slack App、三个凭证字段和一个目标频道,即可把标签、文档、属主、Domain 等实体变更以结构化消息推送给团队。若需要更精细的事件裁剪,可结合filter/transform管道配置;若关心发送限流、消息模板或新增实体链接形态,可直接阅读 slack.py 与 social_util.py 两处源码继续深入。
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考