Horizon UI 系列第五篇:用一个 WebGL 场景把整个部署放到同一张 3D 地图里,把各个 Layer 的服务渲染成立方体,并同时展示实时流量、告警和调用关系。
By 吴晟 | Monday, June 22, 2026
译自英文原文:Meet Horizon UI · 5/17: The 3D Infrastructure Map。
这是 Meet Horizon UI 系列的第五篇。第三篇画的是服务 之间 的地图,第四篇画的是单个服务 内部 的地图。这一篇把视角拉到最远:用一个 WebGL 视图一次看完整个部署。每个 SkyWalking Layer 的服务都会渲染成立方体,堆叠到 3D 空间里,并显示实时流量、告警和它们之间的调用关系。它补上了按 Layer 仪表盘之外的全局视角:退后一步,看整个系统。
而且它不是静态截图。所以这里直接放出来:下面就是运行在 demo 数据上的真实地图。拖动旋转,滚轮缩放,点击立方体:
3D 地图是 /3d/map 里的独立全屏页面,从顶栏里的 3D Infra 入口打开。它刻意拿掉控制台其余部分:没有侧边栏,没有顶栏,没有全局时间选择器。整个浏览器视口都交给场景。SkyWalking 标识放在左下角,右上角的 × 返回 Horizon。里面所有数据都来自 Horizon 其他页面访问的同一个 OAP:服务清单、每个 Layer 的拓扑、每个服务的流量,以及活跃告警。
图 1:一张 3D 图看完整部署:服务是立方体,Layer 是带颜色的 zone,角色按 tier 堆叠。
Tier 是一层横向平面,用来把系统中职责相近的 Layer 放在一起。Tier 从上到下的阅读顺序,就是请求流动的大致方向:从用户直接访问的应用,一路到底层平台。Horizon 内置四个 tier:
Virtual* targets(database、cache、MQ、gateway、GenAI)。OAP 上报的每个 Layer 都会归入一个 tier。Horizon 还没分类的新 Layer,比如 OAP 新增的 Layer,会归入 failover tier(默认 Middleware)并带 “unclassified” 标记。这样它会出现,运维人员也可以重新分配,而不是静默从地图上消失。右侧面板对应整个堆栈:点击 tier 行可以把镜头移到对应位置,用眼睛开关一次显示或隐藏整个 tier(或单个 Layer),并查看当前可见服务数量。
每个服务对应一个 立方体。立方体会在 tier 上按所属 Layer 聚成一个 zone:半透明矩形使用该 Layer 的品牌色,并盖上项目 logo(Istio 的帆、Kubernetes 舵轮、数据库圆柱、队列图标),所以从任何视角都能辨认出 zone。带拓扑的 Layer(General、Service Mesh、Kubernetes Service、Cilium)会按 调用依赖 摆放立方体:上游 caller 在一侧,下游服务在另一侧,对应 2D 服务地图的 3D 版本。没有拓扑的 Layer 则把立方体排成整齐网格。
立方体下方的小 traffic 标签显示该服务的实时主吞吐:应用和 mesh 服务是 requests per minute,数据服务是 queries 或 operations per second,并保留各自单位。只有镜头足够近、文字可辨认时标签才出现;缩远后会淡出,保持场景干净;选中的立方体总会显示它的数字。
当一个服务有 当前正在触发的告警 时(Horizon 轮询最近 20 分钟,并只统计 service 作用域下仍在触发的告警),它的立方体会 红色脉冲。这就是一个信标,即使隔着整个场景也能看到,而告警列表会独立刷新。
在繁忙地图里,几百个立方体中的一个红点仍然可能难找,所以有 Beacon mode。从工具栏打开后,所有 健康 立方体都会变成深色 wireframe,只留下正在告警的服务发光。部署结构仍然清楚,但真正出问题的服务才有颜色。这个模式可以把鸟瞰图快速切成 incident triage 视图。
图 2:Beacon mode 会把健康对象变暗成幽影,所以你只会看到正在触发的服务。
地图不只画节点,也画调用图:
图 3:选中立方体后,身份链接沿 tier 爬升:agent、mesh 和 Kubernetes 各自看到的同一个服务。
拖动旋转,滚轮缩放,方向键 或 WASD 平移视角(按住 Shift 步长更大);左上角工具栏也为触控板提供同样动作的按钮。有一条刻意设计的规则值得知道:3D 场景里的点击永远不会移动视角,只负责选择。点击一个立方体,它会高亮,旁边出现详情卡片(服务名称、tier、Layer,以及会在新标签页打开该服务 Layer 仪表盘的 Open dashboard 按钮),它的 hierarchy links 也会亮起。移动视角的交互入口是 侧边面板 和 工具栏;点击 Layer 行,镜头会滑到它的 zone。把“选择”和“移动视角”分开,点击小立方体才会可靠,不会刚点中它就让它从光标下滑走。
整个部署的数据太大,不适合一次请求拉完,所以地图分阶段加载,底部细长的 timeline strip 会实时展示进度:Services(服务清单和所属 Layer)→ Templates(哪些 Layer 带拓扑)→ Topologies(每个有拓扑 Layer 的调用图)→ Hierarchy(跨 tier 身份链接)→ Layout(摆放立方体)→ Metrics(按批次获取每个服务的流量,让立方体逐步亮起来)。点击任意阶段可以打开抽屉查看详情,也可以点击 Refresh 重新跑完整流程。
两个设计降低了刷新成本。Hierarchy 阶段是增量的:只有上次之后新增的服务需要探测,其余从缓存复用,所以稳定部署在这一步没有额外代价。场景还会按每个 Layer 的结构 hash 重新生成 key;结构没变时刷新会保留你的视角位置,只有服务清单或边真的变化时才重建布局。底层使用 Three.js 加一层很薄的 Vue 封装,同类立方体共享 geometry 和 material。正是这些细节,让几百个服务也能在浏览器标签页里平滑渲染。
上面这些不是一张写死的 “3D 页面”。地图展示什么,由管理员在 /admin/3d-map 的 结构化表单编辑器 里编辑:tier、Layer、颜色和指标都通过表单控制,而不是直接写 JSON。你可以在里面:
Horizon 自带一份默认配置,所以地图开箱就有用。你的修改会以本地 draft 保存,直到点击 Check diff & push 发布到 OAP。它使用和仪表盘相同的 draft → preview → publish 模型,也支持同样的 Export/Import,用于备份或在部署之间迁移配置。地图本身是只读 observe 界面,可以直接运行在当前 OAP 上;发布用于控制地图形态的配置,则属于后续文章会完整介绍的配置化定制。
图 4:地图是配置,不是代码。tier、颜色和每个 Layer 的流量指标都以表单方式编辑,然后发布到 OAP。
3D 地图是全局入口;2D 的按 Layer 页面仍然是最完整的服务地图。查看它只需要读权限(infra-3d:read,内置 viewer 角色及以上持有);调整它需要和仪表盘相同的写权限。字段参考,包括 tier、配置结构和加载阶段,可以看 3D Infrastructure Map 文档。
下一篇回到单个请求:Trace Explorer 会用分布图、瀑布图和调用树帮你定位慢调用。
OpenClaw到底能做什么?有什么用?推荐你先装这几个实用的Skills实践整理
Windows安装Claude Code的实践教程
Claude Code连接MySQL的保姆级教程实践整理
Ollama无法通过本地IP访问11434端口的解决方案实践整理
在Claude Code中配置DeepSeek从报错到成功调用的全流程实践整理
OpenClaw网关启动失败:配置文件权限错误的排查与修复指南实践整理