1. 页面概览

1.1 是什么

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

页面的查询入口是「节点类型 + 节点 ID(稳定标识)+ 方向 + 深度 + 字段筛选」五元组:节点 ID 是稳定标识——对象填对象名(api_name)、管道填管道名、源填表名、指标填指标名;方向可选 downstream(下游)/ upstream(上游);深度 depth 控制 BFS 展开层数;字段 filter 填列名后仅保留 field_map 涉及该列的边(列级血缘)。查询结果分三部分展示:血缘图(ECharts graph 关系图,节点-边图谱)+ 节点表(类型 / ID / 标签)与边表(上游 from → 下游 to,含字段映射 field_map)。

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

1.2 核心价值

价值点说明
双向追踪downstream 下溯"数据流向哪"、upstream 上溯"数据从哪来",异常数据一键回溯
图谱可视化ECharts graph 关系图(force 布局,可拖拽/缩放),节点按类型着色、箭头指向下游
四级链路源 → 管道 → 对象 → 指标 → 报表 全链路可视化
字段级映射边带 field_map(源列 → 目标列),可看清列级血缘;字段 filter 可按列过滤
稳定标识对象名/表名/管道名等稳定标识,跨系统可引用(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)、管道填管道名、      |
|        源填表名、指标填指标名。方向 / 深度变更会自动重新查询;           |
|        字段 filter 填列名后仅保留 field_map 涉及该列的边。            |
+--------------------------------------------------------------+
| [血缘图卡片] 血缘图(N 节点 / M 边)                                |
|  ECharts graph(force 布局,节点按类型着色、箭头指向下游,可拖拽/缩放)  |
+--------------------------------------------------------------+
| [节点卡片]  节点(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
字段 filter(可选)列级血缘过滤:仅保留 field_map 涉及该列(作为源列键或目标列值)的边选填;placeholder「列名,如 amount」;回车触发查询非空时在查询参数中加 field(映射后端 TraceField,列级影响分析)GET /api/v1/lineage?field=<列名>
「查询」按钮提交查询查询中禁用并显示「查询中...」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),空对象/无映射显示 -

4.3 血缘图(ECharts graph)

结果就绪且节点数 > 0 时,在节点表上方渲染一张 ECharts graph 关系图(renderGraph):

元素说明
容器.lineage-graph,宽 100%、高 420px(ECharts 需显式高度);节点数 0 时显示「无节点,无法渲染血缘图。」
节点graph.nodes 映射为图节点,id = type|id(去重键)、name = label || id;按 type 分成 6 个 category 并着色(source 黄 / pipeline 蓝 / object 绿 / metric 紫 / report 红 / action 灰,与表格 type 徽章口径一致),symbolSize=34
graph.edges 映射为 linkssource=fromtarget=to),edgeSymbol=['none','arrow'] 箭头指向下游;lineStyle.curveness=0.08
布局layout: 'force'repulsion:260edgeLength:130gravity:0.08);roam:true 支持滚轮缩放/平移,draggable:true 支持拖拽节点
交互悬停节点显示 label || id;悬停边显示 上游 → 下游字段映射 field_mapemphasis.focus='adjacency' 高亮相邻节点/边
图例底部图例按 6 类节点类型列出
生命周期watch(result) 在结果变化后 nextTick 重渲染;结果被清空(查询失败)时 dispose 实例;window resize 触发 resize();组件卸载移除监听并 dispose

依赖说明:使用项目已有依赖 echartsaction/web/package.json"echarts": "^6.1.0"),未新增任何第三方依赖;GraphChart 在共享注册表 action/web/src/utils/echartsRegistry.js 中按需注册(与 Bar/Line/Pie… 同处,属既有按需引入机制的扩展)。该注册表被 ChartRender.vue / Notebook / 报表等复用,新增 GraphChart 为纯增量、不影响其它图表类型。

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},若「字段 filter」非空则追加 field(后端 TraceField 只保留 field_map 涉及该列的边);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(已于 2026-09-13 补齐)查询表单已暴露「字段 filter」输入框,非空时下发 field 查询参数(后端 TraceFieldlineage/service.go:345-373)。边界:输入需与 field_map 中的列名完全一致(大小写敏感、无补全);列级血缘为超集(见上行)
血缘边无权限过滤查询不区分当前用户的可见性,返回全量血缘边
节点无去重展示合并同一 type|id 出现多次时节点表按查询结果顺序展示,无合并折叠
打点失败静默各写路径打点失败仅记日志,页面无法感知缺失的边
图谱可视化(已于 2026-09-13 补齐)已用项目既有依赖 echarts(package.jsonecharts:^6.1.0,未新增依赖)渲染 ECharts graph(force 布局)血缘图,节点按类型着色、箭头指向下游、悬停显示字段映射;GraphChart 在共享 echartsRegistry.js 按需注册。边界:无「节点/边双向高亮筛选、按层级分层布局、导出图片到服务端」等高级图能力;节点极多时 force 布局渲染开销较高
候选加载失败仅提示/ontology/objects 失败不阻断查询,但对象下拉不可用

10.2 后端文件

10.3 项目文档

10.4 相邻页面