- 数据工程
- 数据编排
- ETL
- 任务调度
- 批处理
- 流处理
- 数据集成
- 后端
【免费下载链接】mage-ai
🧙 Build, run, and manage data pipelines for integrating and transforming data.
本篇文章基于开源仓库 mage-ai 中mage_integrations/mage_integrations/sources/monday的官方连接器说明,深入讲解如何在 Mage 数据集成(Data Integration)管道中接入 Monday(monday.com)作为数据源:包括api_token、board_id、board_limit三个核心配置项的作用与取值、API Token 的获取方式,以及该连接器内部通过 GraphQL 查询实现的boards、workspaces、groups、columns、board_views五大数据流(stream)及其分页、Schema 与错误处理机制。阅读本文后,你将能够在自己的 Mage 项目中完整配置并运行 Monday 数据源同步任务。
Monday 数据源在 mage-ai 中的定位
Mage 数据集成框架(mage_integrations)将“源(Source)”定义为“你希望从中加载数据并同步到另一个系统的外部系统”,Monday 就是官方提供的一个 SaaS 类数据源,用于将 monday.com 上的看板(Board)、工作区(Workspace)、分组(Group)、列(Column)和视图(View)等数据抽取出来,供下游数据管道使用。你可以在 docs/data-integrations/overview.mdx 的 “Sources” 一节中看到它与其他数据源的并列关系。
从仓库结构看,该连接器的完整实现位于:
- 入口与数据加载逻辑:mage_integrations/mage_integrations/sources/monday/init.py
- HTTP 客户端封装:mage_integrations/mage_integrations/sources/monday/client.py
- 数据流定义:mage_integrations/mage_integrations/sources/monday/streams.py
- 各数据流的 JSON Schema:mage_integrations/mage_integrations/sources/monday/schemas/
- 配置模板:mage_integrations/mage_integrations/sources/monday/templates/config.json
必需配置项:api_token、board_id 与 board_limit
配置 Monday 数据源时,必须提供以下凭据与参数(下表来自连接器 README 与配置模板):
| Key | 描述 | 示例值 |
|---|---|---|
api_token | 用于身份认证的 API Token。 | abcdefghijklmnopqrstuvwxyz |
board_id | 用于查询看板(board)相关数据的看板 ID。 | 12345678 |
board_limit | boards数据流中每页返回的看板数量。 | 25 |
其中board_limit在 templates/config.json 中默认值为25,board_id默认为null(即不指定具体看板,由boards查询动态发现)。
三个配置项在源码中的实际作用
api_token:在 client.py 中,Client.get_headers()直接以Authorization: <api_token>请求头方式透传给 Monday API,因此该 Token 必须具备读取看板、分组、列、视图等对象的权限范围。board_id:虽然它出现在配置项中,但从源码看,groups、columns、board_views这三个子数据流实际使用的看板 ID 来自父数据流boards动态下发的board_id(见后文“父子数据流”一节),board_id配置项更多用于显式限定查询范围或配合上游配置使用。board_limit:直接影响boards数据流的 GraphQL 查询变量与分页行为。在 streams.py 中,BoardsStream.get_url_params()会将board_limit作为board_limit变量传入查询;同时 get_next_page_token() 判断“本页返回的看板数是否等于board_limit”来决定是否继续翻页,因此调大它可减少请求次数,但需注意不要超过 Monday API 单次查询的看板数量上限。
如何获取 api_token
按连接器 README 的指引,获取 API Token 的官方路径是访问 Monday 开发者文档中的 “Accessing API tokens” 章节(developer.monday.com下/api-reference/docs/authentication#accessing-api-tokens)。基本流程是:
- 登录你的 monday.com 账号;
- 进入账户管理员设置,找到开发者/API 相关入口;
- 创建或复制一个 API Token(仅对管理员可见,且应妥善保管);
- 将该 Token 填入数据源配置的
api_token字段。
获取 Token 后,你可以直接用它与 Monday GraphQL API 的https://api.monday.com/v2端点交互进行验证——这正是该连接器内部真实调用的 API 地址(见 client.py 的base_url)。
连接器架构与调用链
从源码结构可以梳理出该数据源的完整调用链:
- 入口类
Monday(Source)(init.py)继承自mage_integrations.sources.base.Source,在初始化时构造Client,并通过load_data()根据stream.tap_stream_id从STREAMS注册表中实例化对应的数据流类。 - 客户端
Client继承自 mage_integrations/mage_integrations/sources/http/client.py 中的Client基类,重写了base_url与get_headers(),所有请求最终由基类make_request()发出(POST + JSON body,GraphQL 查询以query字段提交)。 - 数据流基类
BaseStream实现了通用的加载循环:不断以client.request(method='post', body={'query': ..., 'variables': ...})拉取数据,将parse_response()的结果分批 yield 出去,再根据get_next_page_token()判断是否继续翻页,直到没有下一页为止。
值得一提的是,基类make_request()带有@utils.ratelimit(100, 60)限速装饰器(即每 60 秒最多 100 次请求),并默认设置 300 秒的请求超时;同时通过 STATUS_CODE_EXCEPTION_MAPPING 将 400/401/403/404/405/409/429/500/503 等状态码映射为BadRequestError、AuthenticationError、RateLimitError等具体异常。也就是说,配置的 Token 失效(401)或触发 Monday 限流(429)时,Mage 都会抛出对应类型的可读异常,便于在管道日志中快速定位问题。
五大数据流(Stream)详解
STREAMS注册表(streams.py)共注册了 5 个数据流,每个数据流都有对应的 JSON Schema 文件与主键定义:
| 数据流 | 主键 | 复制键 | Schema 文件 | 数据内容 |
|---|---|---|---|---|
boards | id | 无 | schemas/boards.json | 看板及其内嵌的 items(条目)与 column_values |
workspaces | id | 无 | schemas/workspaces.json | 工作区信息(name、kind、description) |
groups | id | 无 | schemas/groups.json | 看板内的分组(title、position、color) |
columns | id | 无 | schemas/columns.json | 看板内的列定义(archived、width、type 等) |
board_views | id | 无 | schemas/board_views.json | 看板的视图(name、type、settings_str) |
boards:唯一支持分页的顶层数据流
BoardsStream是分页与父子关系的核心。它通过带page和board_limit变量的 GraphQL 查询拉取看板列表:
query ($page: Int!, $board_limit: Int!) { boards(limit: $board_limit, page: $page, order_by: created_at) { id, updated_at, name, description, state, workspace_id, items { id, name, state, created_at, updated_at, column_values { id, title, text, type, value, additional_info } } } }其分页逻辑为:第一页从page = 1开始,若本页返回的记录数恰好等于board_limit,则page加 1 继续请求,否则视为已到末页、停止翻页。同时,BoardsStream.get_child_context()会把每条看板记录的id作为子数据流的上下文(board_id)下发给groups、columns、board_views。
另外注意post_process()会把看板与 items 的id从字符串转换为整数,而 schemas/boards.json 也相应地将id声明为integer类型。
workspaces:从看板反查工作区
WorkspacesStream的查询会遍历boards节点的workspace字段,取出每个看板所属工作区的id/name/kind/description,并在parse_response()中跳过workspace为null的记录(即未归属任何工作区的看板)。由于它依赖全局看板列表反查,实际含义是“所有可访问看板对应的工作区去重集合”。
groups / columns / board_views:三个父子子数据流
这三个数据流都声明了parent_stream_type = BoardsStream与ignore_parent_replication_keys = True,即它们以boards为父流、按看板逐个查询,各自的 GraphQL 查询通过boards(ids: $board_id)定位具体看板:
- groups:查询分组的
title / position / id / color,post_process()中把position转为浮点数并回填board_id; - columns:查询列的
archived / id / settings_str / title / type / width,同样回填board_id; - board_views:查询视图的
id / name / type / settings_str。
这意味着:只要配置了api_token,boards流会自动发现所有可访问的看板,并驱动三个子流完成全量看板元数据抽取,无需手工为每个看板填写board_id配置;board_id配置项在此处更多作为兜底/定向手段存在。
Schema 与数据一致性
每个数据流都在 schemas/ 下提供独立的 JSON Schema,字段类型与实际查询结果严格对应。几个值得注意的类型设计:
boards.json中id、workspace_id为integer,updated_at声明为date-time格式字符串,items为宽松对象数组(additionalProperties: true),兼容 Monday items 中动态变化的 column_values;groups.json中position为number(与源码中float()转换一致),board_id声明为number;columns.json与board_views.json的id为string(Monday 的列 ID 与视图 ID 本质上是字符串标识);- 所有 Schema 均设置
additionalProperties: false约束已定义字段,防止无关字段进入目标表。
主键方面,5 个数据流均以id作为唯一主键(见各流的primary_keys),且均未设置复制键(replication_key = None),因此这些数据流默认按“全量替换/追加”方式同步,适合看板元数据这类低频变化的数据。
在 Mage 中配置并使用 Monday 数据源
- 新建数据集成管道:在 Mage 项目中创建一个 Data Integration 类型的管道,Source 选择Monday;
- 填写配置:依次填入
api_token(必填)、board_id(可选,用于限定看板)、board_limit(默认 25,控制boards流每页拉取数量),可参照 templates/config.json 的结构; - 选择要同步的数据流:勾选
boards、workspaces、groups、columns、board_views中需要的流,并选择目标(Destination); - 运行管道:点击运行后,可打开日志观察各流的加载情况;每个流完成后会打印
Finish loading data for stream <StreamName>日志(见 streams.py)。
配置或运行时的常见问题排查:
- 401 AuthenticationError:
api_token无效或权限不足,重新在 monday.com 管理后台生成 Token; - 429 RateLimitError:请求过于频繁,连接器已内置 60 秒 100 次的限速,可适当调大
board_limit减少分页请求次数; - boards 流不返回数据:确认账号下有可访问的看板,且 Token 具备对应工作区/看板的读取权限。
小结
Monday 数据源是 mage-ai 数据集成体系中典型的“GraphQL API + 父子流”型连接器:对外只需api_token一个强校验凭据,配合board_limit控制boards流的分页规模,即可自动发现看板并级联抽取groups、columns、board_views与workspaces数据。理解其 streams.py 中的分页判定与子流board_id下发机制,能帮助你在调优同步性能与排查权限问题时事半功倍。
- 数据工程
- 数据编排
- ETL
- 任务调度
- 批处理
- 流处理
- 数据集成
- 后端
【免费下载链接】mage-ai
🧙 Build, run, and manage data pipelines for integrating and transforming data.
相关推荐
10个提升Python编程效率的技巧:Ultimate-Python-Resource-Hub高手经验分享
10个提升Python编程效率的技巧:Ultimate Python Resource Hub高手经验分享 Ultimate Python Resource H
数据工程数据编排ETL任务调度批处理流处理数据集成后端前端Pearcleaner:macOS应用彻底卸载的终极解决方案
Pearcleaner:macOS应用彻底卸载的终极解决方案 你是否曾注意到,在macOS上删除应用后,磁盘空间并没有明显增加?这并非错觉——大多数应用在卸载时
数据工程数据编排ETL任务调度批处理流处理数据集成后端前端AMD量化模型生产部署终极指南:容器化、监控与性能优化全流程
AMD量化模型生产部署终极指南:容器化、监控与性能优化全流程 在当今AI应用快速发展的时代, AMD量化模型 的生产部署已成为企业实现高效推理的关键技术。本文将
数据工程数据编排ETL任务调度批处理流处理数据集成后端前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考