
数据目录数据治理数据血缘后端前端数据工程数据集成【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址https://gitcode.com/GitHub_Trending/da/datahub点击查看免费下载本篇技术指南以 ThoughtSpot 集成测试文档 为核心骨架结合 DataHub 仓库中 ThoughtSpot 连接器的源码实现source.py、config.py、client.py与测试基础设施test_thoughtspot.py、conftest.py完整讲解这套集成测试的测试策略、Mock 基础设施、实体覆盖范围、Golden 文件验证机制与常见故障排查。读完本文你将掌握如何在无 ThoughtSpot 云实例的前提下用requests-mock构建出可信的 REST API v2.0 模拟环境验证一条从 API 客户端 → Source → MCPMetadata Change Proposal的完整抽取链路并学会如何运行、扩展与更新这类 API 型连接器的集成测试。测试背景为什么必须 Mock 云端 APIThoughtSpot 是纯云服务不提供 Docker 镜像无法像 MySQL、Kafka 等自托管中间件一样通过docker-compose起一个本地实例供测试连接。因此这套集成测试选择了对 ThoughtSpot REST API v2.0 端点进行 Mock 的方案用requests-mock注册与真实云端响应结构一致的端点覆盖工作区Workspace、Liveboard、Answer、Logical Table 等对象跑通完整抽取管线API 客户端 → Source → MCP验证每一层的数据传递与转换覆盖错误处理分支认证失败、权限不足、连接失败等保证确定性固定响应 冻结时间戳time-machine使 Golden 文件可以逐字节比对。该测试策略与 PowerBI 这类同属 API 型无 Docker 镜像连接器的集成测试模式保持一致——这是 DataHub 仓库中对“纯云 API 源”的通用验证思路可复用到其他云端 BI/数据源连接器。测试文件组成集成测试目录metadata-ingestion/tests/integration/thoughtspot/下共 6 个文件文件作用test_thoughtspot.py主测试文件包含端到端摄取、过滤、连接、Schema、Lineage、容器层级等全面测试thoughtspot_mces_golden.jsonGolden 文件保存期望的元数据输出README 记录的基准为 24KB / 52 events当前仓库实际文件约 66KB含 90 个 MCP原因是连接器后续扩展了browsePathsV2、tag、使用统计等 aspectthoughtspot_recipe.yml示例摄取配方ingestion recipe用于生成 Golden 文件与测试连接器conftest.pypytest fixturesmock_thoughtspot_apiMock 全部 API 端点、test_resources_dir__init__.py包标记使目录成为可被 pytest 自动发现的测试包运行测试前置依赖测试依赖 DataHub 开发环境需要以下 Python 包pytest测试框架requests-mockAPI 请求 Mock 库本测试的核心依赖time-machine冻结时间戳保证 Golden 输出确定性此外测试代码还依赖datahub.ingestion.run.pipeline.Pipeline、datahub.testing.mce_helpersGolden 文件比对以及tests.test_helpers.test_connection_helpers连接测试辅助这些均来自仓库自身模块说明测试必须在DataHub 主仓库的 Python 环境而非独立子仓库环境中运行。运行全部集成测试进入仓库的metadata-ingestion目录并激活开发虚拟环境后执行cd metadata-ingestion source venv/bin/activate PYTHONPATHsrc:$PYTHONPATH \ pytest tests/integration/thoughtspot/ -v原 README 中的示例命令包含作者本地的绝对路径/Users/treff7es/...此处已转换为仓库根目录下的相对路径效果一致。关键在于PYTHONPATH必须指向metadata-ingestion/src确保datahub.*包从主仓库代码加载。运行单个测试# Golden 文件校验端到端摄取 pytest tests/integration/thoughtspot/test_thoughtspot.py::test_thoughtspot_ingest -v # 实体过滤模式 pytest tests/integration/thoughtspot/test_thoughtspot.py::test_thoughtspot_ingest_with_filters -v # 连接测试 pytest tests/integration/thoughtspot/test_thoughtspot.py::test_thoughtspot_connection_success -v更新 Golden 文件当连接器实现发生变更例如新增 aspect、修改 URN 生成逻辑、改变字段映射时需重新生成 Golden 文件pytest tests/integration/thoughtspot/test_thoughtspot.py::test_thoughtspot_ingest --update-golden-files -v该选项由mce_helpers.check_golden_file支持会把当前管线输出写回 Golden 文件。务必人工 review diff确认变更符合预期后再提交——Golden 文件是回归测试的“真相来源”不应机械覆盖。测试覆盖范围实体类型实体说明Mock 数据量ContainersWorkspaces工作区容器带元数据与属主2 个Sales Analytics、Marketing DashboardDashboardsLiveboards挂靠在工作区下的仪表盘2 个Q4 Sales Dashboard、Customer InsightsChartsAnswers保存的可视化查询2 个Monthly Revenue Chart、User Growth TrendDatasets逻辑表2 个 Worksheet 1 个 Table另含 1 个 SQL View3 个带正确 subtype 的数据集验证的 AspectcontainerProperties工作区元数据名称、描述以及customProperties中的platform、instance、workspace_iddashboardInfo仪表盘标题、描述与图表引用SDK V2 使用chartEdges字段chartInfo图表元数据含inputs字段承载血缘输入datasetProperties数据集元数据dataPlatformInstance平台实例关联所有实体 ALWAYS 必需status实体状态subTypes实体子类型Folder、Dashboard、Chart、View、Tableownership从 API 提取的属主信息container父子关系Liveboard → Workspace、Chart → Liveboard扩展 aspectschemaMetadata列级 Schema、upstreamLineage/viewProperties血缘与 SQL View、browsePathsV2浏览路径、dashboardUsageStatistics/chartUsageStatistics使用统计、tagKey标签实际当前 Golden 文件thoughtspot_mces_golden.json按实体类型与 aspect 统计的 90 个 MCP 分布如下已用脚本核实container2 个实体 ×containerProperties、dataPlatformInstance、status、subTypes、browsePathsV2dashboard2 个实体 ×dashboardInfo、container、dataPlatformInstance、status、subTypes、browsePathsV2、ownership、dashboardUsageStatisticschart2 个实体 ×chartInfo、container、dataPlatformInstance、status、subTypes、browsePathsV2、chartUsageStatistics 2 个带 ownershipdataset4 个实体 ×datasetProperties、container、dataPlatformInstance、status、subTypes、browsePathsV2、ownership 3 个 schemaMetadata 1 个 upstreamLineage 1 个 viewPropertiestag3 个 tagKey连接测试连接测试覆盖四种场景README 明确标注✅ 有效凭据bearer token→ 连接成功✅ 无效 token → 401 Unauthorized✅ 权限不足 → 403 Forbidden✅ 错误 URL → 连接失败需要特别说明的是test_thoughtspot.py源码中的注释指出特定错误场景已从集成测试移除——因为client.test_connection()方法内部会捕获所有异常并返回False无法通过test_connection接口区分具体错误类型错误处理改由test_thoughtspot_source.py单元测试验证。这与 README 中“✅”列出的场景并不矛盾README 描述的是连接器的整体能力目标而集成测试只保留了对成功路径的断言assert_basic_connectivity_success细粒度错误分支由单元测试兜底。Mock 基础设施深度剖析conftest.py中的mock_thoughtspot_apifixture 是整套测试的心脏它基于requests-mock的Mocker注册了以下端点base URL 为https://test.thoughtspot.cloud/api/rest/2.01. 连接测试端点GET /system/config返回{releaseVersion: 9.0.0.cl, deploymentType: CLOUD}用于连接测试断言基本连通性。2. 认证端点POST /auth/token/full返回{token: test-bearer-token, valid_time_in_sec: 3000}。这是最容易被忽略的 Mock 点ThoughtSpotClient在_authenticate中会调用该端点铸造 bearer token若不 MockSDK 会真实发起 HTTPS 请求测试在 fixture 初始化阶段就会失败。该 Mock 对应连接器配置中的auth.type: trusted或password模式——两种模式都会在每次摄取运行时通过auth_token_full铸造短期 token。3. 元数据搜索端点POST /metadata/search注册了两次一次为固定响应用于特定场景一次为动态回调metadata_search_callback根据请求体中的metadata[0].type分发type返回对象ORG工作区列表workspaces_responseLIVEBOARDLiveboard 列表ANSWERAnswer 列表LOGICAL_TABLE逻辑表列表其他空列表SDK 发送的请求体形状为{metadata: [{type: LIVEBOARD}], record_offset: 0, record_size: 100}回调解析该结构并返回{metadata: [...]}信封结构。4. TML 导出端点POST /metadata/tml/exportmetadata_tml_export_callback是一个动态回调解析请求体metadata列表中的对象 IDSDK 发送{identifier: id}格式返回{info: {...}, edoc: ...}列表。edoc是 TMLThoughtSpot Modeling LanguageYAML 内容其中LOGICAL_TABLE类型包装为table: {name, columns}形状的 YAMLSQL_VIEW类型返回sql_view: {name, sql_query}形状sql_query携带原始 SQL如SELECT region, SUM(revenue) AS total FROM mock_warehouse.public.sales GROUP BY region供 SQL 解析器生成跨平台血缘。5. 组织搜索端点POST /orgs/search返回{orgs: [{id, name, description}, ...]}。注意工作区容器Workspace不是从/metadata/search来的而是从/orgs/search构建且线格式为扁平 dict无metadata_header信封。6. 标签与连接目录端点POST /tags/search→ 空列表标签 aspect 处理由单元测试单独覆盖POST /connection/search→{connections: []}禁用外部血缘输出让断言聚焦于内部 Worksheet → Table 血缘。测试数据结构与响应形状每个 Mock 实体包含的字段对应 README 的 Response Structure 一节id唯一标识如workspace-1、liveboard-1、answer-1、worksheet-1、table-1name显示名description实体描述author属主信息id、name、emailcreated/modified时间戳毫秒metadata_type实体类型type子类型数据集为WORKSHEET或ONE_TO_ONE_LOGICAL另支持SQL_VIEW值得注意的细节源码注释中明确记录Liveboard/Answer 响应顶层携带stats块views、favorites、last_accessed镜像真实metadata_search的include_statsTrue响应形状——连接器通过client._paginated_metadata_search的扁平化逻辑将其提升到响应对象的stats字段进而由_process_usage_stats发出DashboardUsageStatistics/ChartUsageStatisticsaspect无需额外 API 往返Answer 的source_tables使用{id, name}dict 形状SourceTableRefcoercer 接受该形状裸 GUID 字符串会被丢弃并告警逻辑表的列信息位于metadata_detail.columns对应include_detailsTrue_parse_columns_from_metadata_detail读取header.{id,name,description}、dataType、type、physicalColumnName与sourcesmetadata_header中带扁平化字段author_name用于属主解析与owner_id用于关联所属 Workspace 容器。源码级纵深连接器与测试的对应关系连接器架构ThoughtSpotSource定义于 source.py类装饰器标注为platform_name(ThoughtSpot)、support_status(SupportStatus.BETA)、config_class(ThoughtSpotConfig)继承StatefulIngestionSourceBase与TestableSource后者提供test_connection支持。核心处理流程get_workunits_internal及各_process_*方法与测试用例一一对应_process_workspace_containerL1046由/orgs/search响应构建 Container 实体_process_liveboardL1089构建 Dashboard 实体与容器关系_process_visualizationL1193构建 Chart 实体_process_answerL1378处理 Answer含source_tables→ 血缘_process_datasetL1589处理 Logical Table含 Schema 解析与 SQL View 血缘_process_usage_statsL2036消费metadata_search的stats块配置项与测试配方的对应config.py 定义了三层配置模型ThoughtSpotConnectionConfig连接、TrustedAuth/PasswordAuth认证通过type判别联合、ThoughtSpotConfig摄取顶层。thoughtspot_recipe.yml展示了完整配方source: type: thoughtspot config: # 连接配置 connection: base_url: https://test.thoughtspot.cloud # 不要带 /api/rest/2.0会自动拼接 auth: type: trusted # 或 password username: testuser secret_key: test-secret-key-12345 # 支持 ${THOUGHTSPOT_SECRET_KEY} 环境变量 timeout_seconds: 30 # 默认 30大元数据响应可调大 max_retries: 3 # 默认 3指数退避 # 多实例部署 platform_instance: prod # 实体过滤默认 allow all workspace_pattern: { allow: [.*] } liveboard_pattern: { allow: [.*] } answer_pattern: { allow: [.*] } worksheet_pattern: { allow: [.*] } # 功能开关 include_ownership: true include_usage_stats: false # Golden 中关闭行为由单元测试覆盖 # 有状态摄取删除检测 stateful_ingestion: enabled: true remove_stale_metadata: true sink: type: file config: filename: ./thoughtspot_mces.json关键配置项的源码细节base_url有 validator 自动去除尾部斜杠与/api/rest/2.0后缀normalize_base_urlauth是判别联合discriminated uniontype: trusted使用username secret_key生产推荐因为密码轮换策略容易破坏定时摄取type: password使用username password两者均每次运行铸造短期 bearer tokentmll_export_batch_size默认 100与metadata_fetch_batch_size默认 100分块 TML 导出与metadata/search详情回填避免大租户单请求体超限超时单批失败发结构化告警而非静默丢弃org_identifier可选数字 org id 或 org 名转发到每次元数据 API 调用将摄取限定到单个 org非成员调用返回 403 属预期行为避免把数据静默写入错误命名空间liveboard_tag_filter/answer_tag_filter可选服务端按标签过滤比客户端名称过滤更高效include_usage_stats默认 true把 TS UI Views 列的同款累计计数作为DashboardUsageStatistics/ChartUsageStatistics发出约 50 字节/实体零额外往返external_connections按 TS 连接 GUID 或显示名配置跨平台血缘的platform_instance、env、preserve_column_case、convert_urns_to_lowercase覆盖。测试用例与实现细节的印证test_thoughtspot_ingesttest_thoughtspot.pyPipeline.create以代码形式内联配方run_idthoughtspot-testsink 为file输出到tmp_path最后check_golden_file比对。Golden 中systemMetadata.lastObserved为1705305600000正是FROZEN_TIME 2024-01-15 09:00:00对应的毫秒时间戳验证了time_machine.travel冻结时间的作用。test_thoughtspot_ingest_with_filtersL82配置workspace_pattern.allow: [^Sales.*]、liveboard_pattern.allow: [.*]deny: [^Draft.*]断言输出中“Sales Analytics”存在而“Marketing Dashboard”被过滤。test_thoughtspot_schema_extractionL176断言存在schemaMetadataaspect 且字段含fieldPath、nativeDataType——对应metadata_detail.columns与 TML 导出中列信息的解析。test_thoughtspot_lineage_extractionL242断言chartInfo.inputs中存在{string: urn:li:...}形状的输入SDK V2 把血缘存在chartInfo.inputs而非独立upstreamLineageaspect同时验证 Answer → Dataset、Visualization → Answer、Dashboard → ChartchartEdges[].destinationUrn以urn:li:chart:开头三层血缘。test_thoughtspot_container_hierarchyL314逐步验证工作区容器 URN → Liveboard 的containeraspect 引用工作区 URN → Chart 实体存在 → Dashboard 的chartEdges引用urn:li:chart:URN完整覆盖 Workspace → Liveboard → Visualization 容器链。确定性设计Golden 文件如何保持可复现集成测试的可复现性依赖三重机制固定响应所有 Mock 端点的响应体硬编码在conftest.py不依赖任何外部状态冻结时间FROZEN_TIME 2024-01-15 09:00:00定义在conftest.py并在test_thoughtspot.py中同步维护模块导入期需要字面量通过time_machine.travel(FROZEN_TIME, tickFalse)冻结系统时间同时mock_timefixture 冻结 DataHub 的时间工具保证lastObserved等时间戳逐字节稳定Golden 比对mce_helpers.check_golden_file支持--update-golden-files更新模式。故障排查导入错误ModuleNotFoundError: No module named datahub.metadata确认使用的是DataHub 主仓库的 venv而非独立 ThoughtSpot 仓库的 venv设置PYTHONPATH包含 ThoughtSpot 源码目录metadata-ingestion/src。Golden 文件比对失败检查连接器实现是否变更配置、映射、URN 生成等用--update-golden-files重新生成review diff确认变更符合预期后才提交。Mock 不生效确认requests-mock已安装检查测试中的base_url与 Mock 注册路径一致注意 Mock 注册的是https://test.thoughtspot.cloud/api/rest/2.0/...而配置里的base_url不含/api/rest/2.0由连接器自动拼接确认metadata_search_callback中请求体过滤逻辑匹配实际发送的{metadata: [{type: ...}]}结构。何时使用真实 APIMock 测试可以进一步演进为针对真实 ThoughtSpot 测试实例运行适用场景包括已有测试凭据可用后续实现更多 API 端点如血缘详情、使用统计时做真实校验需要验证生产 API 响应结构变化对连接器的影响。即便如此Mock 集成测试仍是 CI 回归的主力——它零成本、确定性高、能覆盖绝大多数解析与映射逻辑真实 API 验证只作为发布前的补充手段。延伸阅读连接器入口与处理流程source.py配置模型与参数详解config.pyAPI 客户端与分页/认证逻辑client.py数据模型models.py测试主文件test_thoughtspot.pyMock 基础设施conftest.py示例配方thoughtspot_recipe.ymlGolden 文件thoughtspot_mces_golden.json赞分享数据目录数据治理数据血缘后端前端数据工程数据集成【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址https://gitcode.com/GitHub_Trending/da/datahub点击查看免费下载相关推荐DataHub ThoughtSpot 连接器完全指南从 Liveboard 到血缘的元数据接入实战DataHub ThoughtSpot 连接器完全指南从 Liveboard 到血缘的元数据接入实战 导读 本文围绕 DataHub 开源仓库中的 Thoug数据目录数据治理数据血缘后端前端数据工程数据集成SAP Datasphere 元数据连接器完全指南基于 OData/CSN 的 DataHub 集成实战SAP Datasphere 元数据连接器完全指南基于 OData/CSN 的 DataHub 集成实战 output SAP Datasphere 元数据数据目录数据治理数据血缘后端前端数据工程数据集成DataHub ThoughtSpot 元数据连接器全指南实体映射、血缘覆盖与故障排查DataHub ThoughtSpot 元数据连接器全指南实体映射、血缘覆盖与故障排查 本指南以 DataHub 官方 ThoughtSpot 元数据连接器数据目录数据治理数据血缘后端前端数据工程数据集成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考