通用血缘链路接口
本页包含两部分:
- A. 通用关系图组件协议(
/commonRelation):一个可复用的前端组件,通过backurl指定后端「控制接口」,按约定协议渲染任意上下游关系图(血缘、依赖、调用链等)。本节描述该组件要求后端实现的接口契约与数据需求。 - B. 平台内置数据血缘后端(
/blood,view_blood.py):平台自带的数据血缘后端实现,为「数据血缘」页面(前端路由/bloodRelation)提供节点检索、自动补全与节点详情。本节按当前源码核实其真实接口。
说明(已对照源码核实):A、B 是两条不同链路。前端路由中
/commonRelation指向CommonPipeline/DWStandard组件(myapp/frontend/src/routerConfig.tsx:96),而/bloodRelation指向Blood/Blood组件(routerConfig.tsx:102),二者是不同页面。view_blood.py的/blood接口当前服务于/bloodRelation,其响应结构与下文 A 节描述的通用协议(dag/layout)并不一致(B 节用blood平铺列表 +control,且为 GET 而非 POST)。接入通用组件时请以实际联调为准。
A. 通用关系图组件协议
使用方式
/frontend/commonRelation?backurl=<控制接口地址>
URL 参数 backurl 指定「控制接口」地址,组件首次加载时请求该接口,拿到初始关系图与布局配置。
前端路由
/commonRelation→CommonPipeline/DWStandard(“通用关系图”),见myapp/frontend/src/routerConfig.tsx:96。
控制接口(backurl 指向)
返回内容(节选,省略号处为同结构子节点):
{
"message": "success",
"status": 0,
"result": {
// 控制参数
"control": {
"direction": "vertical", // 排列方向,目前未使用
"node_ops": ["detail", "explore"] // 节点可进行的操作,目前未使用
},
// 上下游关系图(树形,children 递归)
"dag": [
{
"children": [ /* 子节点,结构同父节点 */ ],
"color": "#1B813E", // 节点颜色
"detail_url": "/workflow_modelview/api/web/node_detail/dev/pipeline/xxx", // 节点详情查询地址
"icon": "", // 节点图标
"message": "", // 节点消息
"name": "logic-python-output-0cbb-task0-2131831615" // 节点名
}
],
"layout": {
// 搜索框配置
"search": {
"default": [], // 默认搜索显示列表
"prefix": ["type1", "type2"], // 搜索固定前缀
"search_url": "", // 搜索可选值接口
"submit_url": "" // 选定节点名后的 dag 链路查询接口
},
// 布局详情信息展示
"detail": [
[ { "label": "集群", "name": "cluster", "value": "dev" } ]
],
"icon": "", // 图标
"title": "logic-python-output-0cbb", // 显示标题
// 右上角菜单按钮
"right_button": [
{ "label": "Terminate", "url": "/workflow_modelview/api/stop/23" },
{ "label": "pipeline", "url": "/pipeline_modelview/api/web/2" }
]
}
}
}
搜索接口(layout.search.search_url)
POST 请求 /xx/search,请求体:
{
"query": "xxx" // 形如 prefix:search_text
}
返回可选节点列表:
{
"status": 0,
"message": "success",
"result": [
{ "id": "xx", "value": "" }
]
}
详情接口(节点的 detail_url)
POST 或 GET 请求 /xx/<node_id>,请求体可省略:
{
"before_num": "2", // 向上游展开层数
"after_num": "2" // 向下游展开层数
}
返回体(按 tab → group 组织):
{
"message": "success",
"status": 0,
"result": {
"control": { "width": "700px" },
"detail": [
{
"tabName": "输入输出",
"bottomButton": [
{ "text": "在线日志(no)", "url": "/k8s/web/log/dev/pipeline/xxx/main" }
],
"content": [
{
"groupName": "消息",
"groupContent": { "label": "消息", "type": "html", "value": "运行正常" }
},
{
"groupName": "任务详情",
"groupContent": { "label": "任务详情", "type": "map", "value": { "log path": "xxx/main.log" } }
}
]
},
{ "tabName": "pod信息", "bottomButton": [], "content": [ /* ... */ ] },
{ "tabName": "结果可视化", "bottomButton": [], "content": [ /* ... */ ] },
{ "tabName": "workflow信息", "bottomButton": [], "content": [ /* ... */ ] }
]
}
}
groupContent.type 取值:html / text / map,前端按类型渲染。
主要数据需求
- 各平台节点血缘,以及需要在血缘中展示的属性;
- 任务流运行后每个节点的运行结果。
B. 平台内置数据血缘后端 /blood
平台自带的数据血缘后端,源码 myapp/views/view_blood.py,类 Blood,route_base = "/blood",通过 appbuilder.add_api(Blood) 注册。为「数据血缘」页面(前端路由 /bloodRelation → Blood/Blood)提供数据。
数据来源:myapp/init/init-blood.json(由 myapp/init/gen_init_blood.py 生成),在 Flask 进程启动时一次性载入到模块级变量,请求路径不再读盘。文件路径可由配置项 BLOOD_JSON_PATH 覆盖(view_blood.py:44);文件读不到不阻断启动,接口降级返回空集。
JSON 结构:node_type_zh(节点类型→中文名)、type_style(类型→{color,shape,platform})、nodes(node_id→节点)、details(node_id→详情)。
B.1 血缘节点搜索 GET /blood/search/node
根据 keyword 或 node_id 返回相关血缘子图 + 全图 control 配置。源码 view_blood.py:141。
查询参数(query string):
| 参数 | 说明 | 默认 |
|---|---|---|
keyword(或 name) |
关键字模糊匹配(命中 node_id / name / platform / node_type / label 任一) | 空 |
node_id |
指定中心节点 id(命中则以它为焦点取子图) | 空 |
depth_up |
向上游展开层数 | 3 |
depth_down |
向下游展开层数 | 3 |
匹配逻辑:优先按 node_id 取子图;否则按 keyword 匹配后取并集;都未命中则降级到默认焦点节点(优先 table_ods_user_log,否则字典首个)。
返回体:
{
"status": 0,
"message": "success",
"result": {
"blood": [ /* 节点对象平铺列表,按 node_id 排序 */ ],
"control": {
"node_ops": ["detail", "explore"], // detail=查看详情, explore=继续展开上下游
"direction": "horizontal", // 整图布局方向
"platform_color": { "<platform>": "<color>" }, // 平台→颜色(图例)
"node_type_zh": { "<node_type>": "<中文名>" }, // 节点类型中文名
"focus_node_id": "<焦点节点 id>",
"total": 0 // 节点总数
}
}
}
B.2 节点名称自动补全 GET /blood/search/name
供前端输入框自动补全,只在 node_id / name 上做子串匹配(label 不参与,命中更精准)。源码 view_blood.py:199。
查询参数:keyword(或 q),limit(默认 20,范围 1–100)。
返回体:
{
"status": 0,
"message": "success",
"result": {
"options": [
{
"node_id": "xxx",
"name": "xxx",
"platform": "xxx",
"node_type": "xxx",
"node_type_zh": "xxx",
"value": "xxx", // 对齐 antd Select/AutoComplete
"label": "name (node_type_zh)"
}
],
"total": 0
}
}
排序:完全相等 > 起始匹配 > 其他,排序后再按 limit 截断。
B.3 节点详情 GET /blood/show/<node_id>
返回某节点的详情(按 tab/group 组织),并附带 _meta 节点基础信息。源码 view_blood.py:246。
- 节点不存在时返回
status: -1,message形如node_id [xxx] 不存在或暂无详情(经 i18n 包裹)。 - 存在时返回
details[node_id]内容,并注入_meta:node_id/name/platform/node_type/node_type_zh/label。
{
"status": 0,
"message": "success",
"result": {
"_meta": { "node_id": "xxx", "name": "xxx", "platform": "xxx", "node_type": "xxx", "node_type_zh": "xxx", "label": [] }
// ... 其余为 details 中该节点的 tab/group 结构
}
}
说明:B 节三个接口均为 GET(
expose_api未指定methods,默认 GET),与 A 节通用协议中 search/detail 描述的 POST 不同;返回结构也不同(B 用blood平铺列表,A 用dag树)。接入时以实际源码myapp/views/view_blood.py为准。