认识 Horizon UI · 3/17:拓扑与服务依赖

Horizon UI 系列第三篇:由模板驱动的拓扑引擎、拓扑降噪、从服务调用下钻到实例、endpoint 依赖图,以及跨 Layer 的 Smartscape 视图。

译自英文原文: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:单个 Layer 的服务地图。六边形节点用边框表示 SLA 健康色带,节点上方显示主指标,内部显示组件图标,下方显示名称,每条边带 RPM 标记。 图 1:一套由模板驱动的拓扑引擎:带健康色带的六边形节点、带 RPM 标记的边、真实组件图标;图上的每个指标都按 Layer 配置。

过滤拓扑噪声

真实拓扑通常很嘈杂。一张密集地图里会混入 OAP 没法完整识别的推测节点,比如裸露的 rcmd:80、未接入探针的地址。Horizon 的 Filter 控件可以关掉这些噪声,同时保留真实依赖。它会自动生成一个 按 Layer 分组 的过滤分面,展示方式和侧边栏一致。每一行都有 Layer 自己的图标和本地化名称,比如 Virtual DatabaseJava Agent,还会有一个 Others 分组,用来收纳 OAP 无法分类的节点,以及一个独立的 User 开关。取消勾选 Others 后,未接入探针的杂点和悬空边会消失,而数据库、缓存和队列(各自的 VIRTUAL_* 行)仍然留在图上。过滤在客户端执行,每次刷新都会重新推导分组选项,所以不会陈旧。

图 2:拓扑 Filter。一个自动推导出的按 Layer 分组过滤器(每行带 Layer 图标和名称)、一个 Others 分组,以及 User 开关,用来从密集地图里去掉推测节点。 图 2:快速降噪,去掉无法解析的 “Others” 节点,同时保留真实依赖。

当某个 Layer 的服务属于 OAP service group,地图上的服务聚焦选择器也会按这些 group 分组。点击 group header 可以 批量选中或清空该组里的所有服务,所以你能一次聚焦一张繁忙地图中某个团队负责的那一片。

图 3:支持 group 的服务选择器。服务按 OAP Service.group 分组,点击 group header 可批量聚焦或清空整个 group。 图 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:Instance map。客户端服务实例在左,服务端服务实例在右,中间是实例级调用,并带每条调用的指标侧栏。 图 4:从一条聚合调用下钻到背后的实例到实例流量。

按 endpoint 追完整请求链

服务拓扑回答“哪些服务调用了这个服务”。API dependency 标签页回答更具体的问题:“哪些 endpoint 调用了这个 endpoint,它又调用了哪些 endpoint”。选择一个 endpoint 后,图会按方向分列:callers 在左,焦点 endpoint 在中间,callees 在右。它同样用 SLA 色边框、每条边上的 RPM 和时延,以及最重边标签。选中节点后会出现一个 + handle,点击后拉入 它自己 的 callers 和 callees。这样你可以一跳一跳追链路,不需要一次展开整张图。把节点拖开后,跳转链接(Open endpointService →)会在新标签页打开,当前正在探索的图仍然保留。

图 5:API dependency 图。callers 在左,焦点 endpoint 在中间,callees 在右,通过 + handle 扩展一跳,每条边带时延和 SLA 着色 RPM。 图 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 上报的提示。 图 6:选中节点上的 chevron-stack 标记。它在选择时按需探测,只在服务存在跨 Layer 对应对象时显示。

点击这个标记,拓扑会在 Smartscape 叠加视图下变暗:焦点节点在原位高亮重绘,它的对应对象按 OAP 的 Layer 顺序纵向展开,靠近请求入口的 Layer 在上,靠近基础设施的 Layer 在下。之后两步点击就能在对应 Layer 中打开任意对象,并完成预选。(叠加视图打开时自动刷新会暂停,避免内容在你眼前移动。)

图 7:Smartscape 叠加视图。一个逻辑服务投射到多个 Layer(General agent、Service Mesh、mesh data plane、Kubernetes),按 Layer 顺序展开,每个对应对象都可以进入自己的 Layer。 图 7:一个服务在所有上报 Layer 中的样子,用叠加视图展示跨 Layer 层级关系。

后续阅读

这些地图上的每个指标、阈值和边权重,都位于 Layer template 的 topology 块里。换句话说,你会用和仪表盘一样的配置驱动方式调整它们,这也是后续文章的主题。字段参考可以看 layer-template 里的 topology 文档。

下一篇转向服务内部:Deployment 标签页如何展示集群服务的实例关系,以及 BanyanDB 如何接入 SkyWalking 自观测。