认识 Horizon UI · 3/17:拓扑与服务依赖
译自英文原文:Meet Horizon UI · 3/17: Topology & Service Dependency。
这是 Meet Horizon UI 系列的第三篇。第二篇讲的是如何从仪表盘数字里理解服务;这一篇讲如何把服务关系画成一张 地图:谁调用谁,调用量有多大,以及同一个逻辑服务在不同上报 Layer 中是什么样子。
SkyWalking 拓扑背后的调用数据只有一份,但 Horizon 不只画一种图。它有每个 Layer 自己的服务地图,可以从单条调用下钻到背后的实例,可以看 endpoint 级依赖图,也可以用跨 Layer 叠加视图把一个服务在不同 Layer 中的形态连起来。它们共用同一套引擎,只是回答的问题不同。(Deployment 标签页,也就是单个集群服务 内部 实例的地图,以及 WebGL 3D 地图,都足够大,会在接下来的文章里单独讲。)
一套拓扑引擎,适配不同 Layer
打开任意 Layer 的 Topology 标签页,你会看到一张从左到右排列的层次化服务地图:User 存在时位于最左侧,每个服务按调用深度落在不同列里;同一列内部保留图遍历时的顺序,所以主调用链可以自上而下读。每个服务都是一个 六边形节点,节点上展示的所有东西都来自这个 Layer 的配置,没有写死逻辑:
- 六边形 边框 承载节点的 ring 指标,用类似 SLA 的健康色带展示(绿色 → 红色);
- 组件 图标 放在六边形内部,和 Trace 瀑布图使用同一套图标,所以 PostgreSQL 节点像 PostgreSQL,Kafka 节点像 Kafka;
- 节点的主数字,也就是 center 指标,带单位显示在六边形 上方;
- 服务 名称 显示在节点 下方,secondary 指标(默认是时延)显示在名称下面;
- 每条 边 都带调用吞吐的 RPM 标记,使用服务端指标,缺失时回退到客户端指标。
这里需要强调一点:上面这些都只是 General Layer 的内置默认配置。节点的 center / ring / secondary 指标,以及边指标,都位于 Layer dashboards admin → Topology 作用域,本质上是带单位和角色的 MQE 表达式。所以你可以把任意槽位指向另一条指标,同一套引擎就会为另一个 Layer 画出不同地图,或者按你的方式重画当前 Layer。(这些选择会像其他模板内容一样,跟着 Layer template 的 export/import 走。)
图 1:一套由模板驱动的拓扑引擎:带健康色带的六边形节点、带 RPM 标记的边、真实组件图标;图上的每个指标都按 Layer 配置。
过滤拓扑噪声
真实拓扑通常很嘈杂。一张密集地图里会混入 OAP 没法完整识别的推测节点,比如裸露的 rcmd:80、未接入探针的地址。Horizon 的 Filter 控件可以关掉这些噪声,同时保留真实依赖。它会自动生成一个 按 Layer 分组 的过滤分面,展示方式和侧边栏一致。每一行都有 Layer 自己的图标和本地化名称,比如 Virtual Database、Java Agent,还会有一个 Others 分组,用来收纳 OAP 无法分类的节点,以及一个独立的 User 开关。取消勾选 Others 后,未接入探针的杂点和悬空边会消失,而数据库、缓存和队列(各自的 VIRTUAL_* 行)仍然留在图上。过滤在客户端执行,每次刷新都会重新推导分组选项,所以不会陈旧。
图 2:快速降噪,去掉无法解析的 “Others” 节点,同时保留真实依赖。
当某个 Layer 的服务属于 OAP service group,地图上的服务聚焦选择器也会按这些 group 分组。点击 group header 可以 批量选中或清空该组里的所有服务,所以你能一次聚焦一张繁忙地图中某个团队负责的那一片。
图 3:支持 service group 的服务选择器,可以一次聚焦整个分组。
从服务调用下钻到实例关系
服务到服务的边是一条聚合调用;它背后是真实实例之间的通信。点击地图上的一条调用并选择 Instance map →,Horizon 会画出这层关系:客户端服务的实例在左列,服务端服务的实例在右列,中间是实例级调用,并带有客户端→服务端方向动画。它复用服务地图上的所有能力:健康 ring 节点、每条调用的 client/server 指标侧栏、带 Open instance dashboard 的节点 popover,并且按 Layer 自己的词汇标注列名,比如 Kubernetes 上叫 Pods,data plane 上叫 Sidecars。两个服务选择器会根据关系联动:server 列表来自当前 client 的 callees,client 列表来自当前 server 的 callers;每次改动其中一个,另一个都会重新推导。
图 4:从一条聚合调用下钻到背后的实例到实例流量。
按 endpoint 追完整请求链
服务拓扑回答“哪些服务调用了这个服务”。API dependency 标签页回答更具体的问题:“哪些 endpoint 调用了这个 endpoint,它又调用了哪些 endpoint”。选择一个 endpoint 后,图会按方向分列:callers 在左,焦点 endpoint 在中间,callees 在右。它同样用 SLA 色边框、每条边上的 RPM 和时延,以及最重边标签。选中节点后会出现一个 + handle,点击后拉入 它自己 的 callers 和 callees。这样你可以一跳一跳追链路,不需要一次展开整张图。把节点拖开后,跳转链接(Open endpoint、Service →)会在新标签页打开,当前正在探索的图仍然保留。
图 5:按 endpoint 一跳一跳走请求链,每条边都有时延。
同一个服务在不同 Layer 中的形态
一个逻辑服务经常会同时通过多个 Layer 上报:General agent、Service Mesh sidecar、mesh data plane、Kubernetes pod。SkyWalking 从 OAP 10 开始就建模了这种跨 Layer 层级关系;Horizon 把这层关系放进了地图交互。选中一个节点后,它会按需探测 hierarchy。如果这个服务有跨 Layer 对应对象,节点上会贴一个小的 chevron-stack 标记。
图 6:选中节点上的 chevron-stack 标记。它在选择时按需探测,只在服务存在跨 Layer 对应对象时显示。
点击这个标记,拓扑会在 Smartscape 叠加视图下变暗:焦点节点在原位高亮重绘,它的对应对象按 OAP 的 Layer 顺序纵向展开,靠近请求入口的 Layer 在上,靠近基础设施的 Layer 在下。之后两步点击就能在对应 Layer 中打开任意对象,并完成预选。(叠加视图打开时自动刷新会暂停,避免内容在你眼前移动。)
图 7:一个服务在所有上报 Layer 中的样子,用叠加视图展示跨 Layer 层级关系。
后续阅读
这些地图上的每个指标、阈值和边权重,都位于 Layer template 的 topology 块里。换句话说,你会用和仪表盘一样的配置驱动方式调整它们,这也是后续文章的主题。字段参考可以看 layer-template 里的 topology 文档。
下一篇转向服务内部:Deployment 标签页如何展示集群服务的实例关系,以及 BanyanDB 如何接入 SkyWalking 自观测。