1. 页面概览

1.1 是什么

数据血缘页面(LineagePage.vue)用于查询 LightFoundry 平台内的数据血缘关系图。它以"节点 + 边"的形式回答"某条数据从哪来、流向哪":data_lineage 表记录 上游(源表/管道/对象/Action)→ 下游(管道/对象/指标/报表)的边,构成四级血缘链路 源 → 管道 → 对象 → 指标 → 报表;Action 写操作本身也是一条血缘边(对象 → 动作),支撑"谁在何时改了什么"的审计与回溯。

页面的查询入口是「节点类型 + 节点 ID(稳定标识)+ 方向 + 深度」四元组:节点 ID 是稳定标识——对象填对象名(api_name)、管道填管道名、源填表名、指标填指标名;方向可选 downstream(下游)/ upstream(上游);深度 depth 控制 BFS 展开层数。查询结果分两个表格展示:节点表(类型 / ID / 标签)与边表(上游 from → 下游 to,含字段映射 field_map)。

血缘数据由各写路径自动打点产生:元数据导入、管道执行、Action 执行、指标定义、报表创建、数据集同步成功链都会调用血缘服务写入边(打点失败仅记日志、不阻断主流程)。页面本身是只读查询页,不提供写操作。

1.2 核心价值

价值点说明
双向追踪downstream 下溯"数据流向哪"、upstream 上溯"数据从哪来",异常数据一键回溯
四级链路源 → 管道 → 对象 → 指标 → 报表 全链路可视化
字段级映射边带 field_map(源列 → 目标列),可看清列级血缘
稳定标识对象名/表名/管道名等稳定标识,跨系统可引用(G20)
自动打点各写路径自动记录血缘,无需人工维护
自动重查方向 / 深度变更自动重新查询,交互流畅

1.3 一句话总结

数据血缘页面以"节点 + 边"的图模型回答数据的来龙去脉,支撑影响分析与审计回溯。

2. 访问入口

2.1 路由与菜单

路由 path/foundry/lineage
路由 nameFoundryLineage
meta.titleFoundry 数据血缘
侧边栏入口FoundryLayout 侧边栏「数据血缘」(位于「数据源」之后、「数据质量」之前)
前端源码action/web/src/views/LineagePage.vue
API 客户端action/web/src/api/client.js(baseURL /api/v1,30s 超时)

路由注册见 action/web/src/router/index.js

{ path: 'lineage', name: 'FoundryLineage', component: LineagePage, meta: { title: 'Foundry 数据血缘', requiresAuth: true } },

侧边栏入口见 action/web/src/views/FoundryLayout.vuemenuItems 数组 { path: '/foundry/lineage', label: '数据血缘' }

2.2 认证与权限

2.3 端口与 API 前缀

3. 界面布局

+--------------------------------------------------------------+
| 数据血缘                                                       |
+--------------------------------------------------------------+
| [alert 操作结果提示条(可关闭)]                                    |
+--------------------------------------------------------------+
| [血缘查询卡片]                                                   |
|  节点类型* | 节点 ID(稳定标识)* | 方向 | 深度 depth | [查询]       |
|  (type=object 时 ID 右侧出现对象候选下拉)                         |
|  提示:节点 ID 为稳定标识——对象填对象名(api_name)、管道填管道名、      |
|        源填表名、指标填指标名。方向 / 深度变更会自动重新查询。           |
+--------------------------------------------------------------+
| [节点卡片]  节点(N)                                             |
|  # | 类型 | ID | 标签                                             |
+--------------------------------------------------------------+
| [血缘边卡片] 血缘边(N,方向 from → to)                            |
|  # | 上游 from | 下游 to | 字段映射 field_map                      |
+--------------------------------------------------------------+
| [空结果提示](queried 但 result 为 null 时)                        |
|  请填写节点类型与 ID 后点击"查询"。                                  |
+--------------------------------------------------------------+

各板块职责:

4. 交互元素详解

4.1 查询表单

元素含义必填/默认操作效果触发的后端调用
节点类型下拉查询节点类型必填,默认 object;选项:source(源表)/ pipeline(管道)/ object(本体对象)/ metric(指标)/ report(报表)/ action(动作)切换触发 onTypeChange:type=object 且 id 为空时自动填入第一个对象名无(切换本身不发请求)
节点 ID 输入框稳定标识必填,placeholder「对象名 / 表名 / 管道名...」,回车(@keyup.enter)触发查询写入 form.id查询时 GET /api/v1/lineage?type=&id=&direction=&depth=
对象候选下拉type=object 时显示可选,选项来自 GET /ontology/objects选择后把对象名填入 form.id页面加载时 GET /api/v1/ontology/objects
方向下拉追踪方向默认 downstream(下游);选项:downstream / upstream变更自动重查(存在历史查询时)GET /api/v1/lineage
深度 depthBFS 展开层数type=number,min=1,默认 10变更自动重查(存在历史查询时)GET /api/v1/lineage
「查询」按钮提交查询查询中禁用并显示「查询中...」handleQuery:id 为空提示「请填写节点 ID(对象名/表名/管道名等稳定标识)」GET /api/v1/lineage

4.2 结果表格

元素含义
节点表 #序号(1 起)
节点表 类型类型徽章,着色:source 黄、pipeline 蓝、object 青绿、metric 紫、report 红、action 灰
节点表 ID稳定标识(对象名/表名/管道名/指标名/报表名/动作名)
节点表 标签n.label || n.id,label 缺失时退化为 ID
边表 #序号
边表 上游 from上游节点类型徽章 + 展示名(label || id)
边表 下游 to下游节点类型徽章 + 展示名
边表 字段映射 field_mapJSON.stringify(fm),空对象/无映射显示 -

5. 后端关联

5.1 API 客户端

client.js 为共享 axios 实例:

本页使用(apiClient 直接调用):

5.2 端点表

方法路径请求参数响应要点
GET/api/v1/lineagequery: type(必填)、id(必填)、direction(upstream|downstream,默认 downstream)、depth(<=0 用默认上限防环)、field(可选,列名过滤){code:0, data:{nodes:[...], edges:[...]}}
GET/api/v1/ontology/objects{code:0, data:[{object_type:{name,...}, ...}]}(对象候选)

5.3 响应结构

血缘查询响应:

{
  "code": 0,
  "data": {
    "nodes": [
      { "type": "source", "id": "orders", "label": "orders" },
      { "type": "object", "id": "order", "label": "order" },
      { "type": "metric", "id": "order_amount", "label": "order_amount" }
    ],
    "edges": [
      {
        "from": { "type": "source", "id": "orders", "label": "orders" },
        "to": { "type": "object", "id": "order", "label": "order" },
        "field_map": { "order_id": "order_id", "amount": "amount" }
      },
      {
        "from": { "type": "object", "id": "order", "label": "order" },
        "to": { "type": "metric", "id": "order_amount", "label": "order_amount" },
        "field_map": { "amount": "total" }
      }
    ]
  }
}

对象候选响应:

{ "code": 0, "data": [ { "object_type": { "name": "order", "api_name": "order", ... }, ... } ] }

前端 fetchObjectsobjectTypes.value = data.data || [],再映射 objectNames = objectTypes.map(item => item.object_type?.name).filter(Boolean)

5.4 关联模块表

后端包职责
products/foundry/lineageLineageService:Record 打点(幂等)、Trace/TraceField/GetFullLineage 图展开、便捷打点方法
products/foundry/server(pipeline_handlers.go)handleLineageTrace:解析 query 参数、调 Trace 或 TraceField、{code:0,data} 包装
products/foundry/pipeline管道执行打点(RecordSourceToPipeline / RecordPipelineToObject)
products/foundry/metric指标定义打点(RecordObjectToMetric)
products/foundry/report报表创建打点(RecordMetricToReport)
products/foundry/writepathAction 执行打点(RecordActionWrite)
products/foundry/sync同步成功链打点(RecordFieldMapping source→dataset)
products/foundry/ontology对象类型查询(/ontology/objects 候选下拉)

5.5 关键机制

图模型:血缘图 LineageGraph{Nodes, Edges}。节点 Node{Type, ID, Label}(Type/ID 为稳定标识),边 Edge{From, To, FieldMap}(From=上游,To=下游,数据流方向)。

BFS 展开(Trace):从起始节点沿 direction 逐层 BFS,层数受 depth 限制(depth<=0 用默认上限 defaultTraceDepth=10 防环);nodeSeentype|id 去重防环。direction 为 upstream 时从 downstream_type/id 查直接上游边,为 downstream 时从 upstream_type/id 查直接下游边。

六类节点类型:source(源表)/ pipeline(管道)/ object(本体对象)/ metric(指标)/ report(报表)/ action(动作),ValidType 校验,非法类型返回校验错误。

字段级过滤(TraceField)field query 参数存在时,仅保留 field_map 涉及该列的边(作为源列键或目标列值),是列级影响分析(支撑 lineage?field=amount);为空时等价于 Trace。

打点幂等Record 写入前查重——同 upstream/downstream 组合已存在时,field_map 非空则更新、否则保持原样,均不重复插入。

自动重查:前端 watch([direction, depth])lastQuery 存在时自动调用 handleQuery 重新查询,无需手动点「查询」。

6. 核心流程详解

6.1 查询血缘主流程

  1. 页面加载(onMounted)调用 fetchObjects()GET /ontology/objects 加载对象候选(失败仅提示「加载对象候选失败」,不阻断功能)。
  2. 选择节点类型(默认 object);type=object 且 id 为空时自动填入第一个对象名。
  3. 填写节点 ID(对象名/表名/管道名等稳定标识),可回车触发查询。
  4. 点击「查询」(handleQuery):id 为空先提示;组装 params {type, id: id.trim(), direction: direction || 'downstream', depth: depth || 10}GET /lineage
  5. 成功:result.value = data.data || {nodes:[], edges:[]},记录 lastQueryqueried = true,渲染节点表与边表。
  6. 失败:alert「血缘查询失败:错误详情」,result.value = null(空结果提示区出现)。
  7. 之后修改方向或深度:watch 检测 lastQuery 存在则自动重查。

6.2 对象候选选择分支

6.3 血缘数据从哪来(打点链路)

打点时机便捷方法
元数据导入 / 管道执行成功RecordSourceToPipelinesource → pipeline
管道执行成功且目标对象映射存在RecordPipelineToObjectpipeline → object
指标定义创建RecordObjectToMetricobject → metric
报表创建RecordMetricToReportmetric → report
Action 写操作执行RecordActionWriteobject → action
同步引擎成功链RecordFieldMappingsource → dataset

打点失败仅记日志、不阻断主流程(对齐 pipeline 包约定)。

7. 权限与安全

7.1 认证

7.2 数据级安全

7.3 写操作防护

本页为纯只读页,无写操作;查询参数 type/id/direction/depth 均只读校验(type 非法返回校验错误,depth<=0 用默认上限防环)。

8. 常见问题与排错

8.1 查询结果为空(有节点、无边)

  1. 确认方向语义:想查"数据从哪来"选 upstream,想查"数据流向哪"选 downstream;
  2. 确认节点 ID 与打点时的稳定标识完全一致(大小写、命名规则);
  3. 确认该节点的打点时机已发生(如对象指标定义是否创建、管道是否成功执行、同步是否成功);
  4. GET /api/v1/lineage?field=列名 做字段级过滤,排查是否只是 field_map 为空导致边无字段映射。

8.2 提示「血缘查询失败:invalid lineage type」

8.3 对象候选下拉为空

  1. 打开 DevTools Network 确认 /api/v1/ontology/objects 的响应状态;
  2. 确认 Foundry 后端 18081 已启动、/ontology/objects 路由已注册;
  3. 确认平台已创建对象类型(本体工作台)——候选来自对象类型列表;
  4. 候选加载失败不阻断功能:手动输入对象名(api_name)仍可查询。

8.4 深度很大时响应慢 / 图过大

9. 已知缺陷与边界

缺陷/边界说明
字段级血缘为超集TraceField 按全部边展开后过滤字段边,结果可能包含经"非字段边"到达深层的字段边(列级精准链路待收敛)
无字段过滤 UI前端未暴露 field 查询参数入口,字段级过滤仅可经手工 API 调用
血缘边无权限过滤查询不区分当前用户的可见性,返回全量血缘边
节点无去重展示合并同一 type|id 出现多次时节点表按查询结果顺序展示,无合并折叠
打点失败静默各写路径打点失败仅记日志,页面无法感知缺失的边
无图可视化结果以双表格展示,无 ECharts 图谱渲染(图数据已就绪可扩展)
候选加载失败仅提示/ontology/objects 失败不阻断查询,但对象下拉不可用

10.2 后端文件

10.3 项目文档

10.4 相邻页面