500 个服务时快 6 倍:我们如何将 Kibana APM 服务地图从 Canvas 重构到 React DOM

作者:Elasticsearch日期:2026/7/30

作者:来自 Elastic Jenny Pavlova

每个服务节点都会显示告警、 SLO 和异常健康状态,因此你可以仅筛选违反阈值的服务,并将结果嵌入到任何 Kibana 仪表板中,同时支持在整个拓扑中使用完整的键盘导航。

我们基于 React Flow 重构了 Elastic Observability 中的 Kibana APM 服务地图。在拥有 500 个服务时,渲染时间仅为 64ms,相比之前基于 Cytoscape.js 的实现快约 6 倍,同时 JavaScript 体积减少了 60%( 69 KiB 对比 172 KiB )。服务节点现在会显示告警、 SL 和异常健康状态,因此你可以仅筛选违反阈值的服务,并将结果嵌入到任何 Kibana 仪表板中,同时支持在整个拓扑中使用完整的键盘导航。从告警到定位失败的依赖项仅需四次点击: Elastic APM 的嵌入式服务地图更深入地介绍了告警面板、 SLO 徽章以及仪表板嵌入功能。

下面分别是这次重构之前和之后的服务地图:

以前

现在

为什么 APM 服务地图从 Cytoscape.js 图可视化迁移到 React Flow

迁移带来的收益非常直观: React Flow 将节点渲染为真正的 React 组件,而不是通过 Canvas 绘制循环,因此即使面对大型拓扑,平移和缩放依然保持流畅;我们的 Elastic UI ( EUI )节点和徽章能够原生渲染(不再需要每次更新时重新渲染整个 Canvas);此外,基于 DOM 的渲染使节点能够天然被屏幕阅读器识别,而基于 Canvas 的渲染则无法做到这一点。

它也更加轻量:图形库从 172.4 KiB( cytoscape.js )减少到 69 KiB( @xyflow/react ),减少了约 103 KiB 的 JavaScript 下载体积,#248470

使用 React Flow 后, APM 服务地图快了多少?

在决定将 APM 服务地图从 Cytoscape.js 迁移到 React Flow 之前,我们对两个图形库在 100、200 和 500 个服务规模下进行了基准测试(使用合成链式拓扑,通过 Lighthouse 和组件级耗时进行测量,并对多次运行结果取平均值, #248470 ):

服务数量Cytoscape.js 渲染React Flow 渲染提升幅度
10061.6 ms15.0 ms约 76%
200102.5 ms28.1 ms约 73%
500392.5 ms64.1 ms约 84%

在拥有 500 个服务时, React Flow 仅需约 64 ms 即可完成地图渲染,而 Cytoscape.js 需要约 393 ms,速度约快 6 倍。仅图布局计算这一步就提升了约 70%–78% 的性能。主线程总阻塞时间减少了约 20%,尽管所有内容都作为真实 DOM 渲染,峰值内存占用也略有降低。更多结果可参考基准测试结果评论

APM 服务地图中的键盘导航与无障碍支持

现在,当你在拓扑中导航时,服务地图会实时播报你当前所在的位置,并为每一次交互提供屏幕阅读器的实时上下文( #251444 )。

基于空间位置的方向键导航: 方向键会根据视觉上的相对位置进行导航,而不是按照文档的逻辑顺序。即使在复杂的蛇形布局中,焦点也会移动到你按下方向键所对应方向上最近的服务。

直接快捷键: 按下 Enter 或 Space 可打开详情面板( flyout ),按下 Escape 可关闭。

实时播报: 每一次交互都会通过屏幕阅读器进行播报,例如“已选择从 A 到 B 的连接”。

APM 服务地图布局算法如何工作

APM 服务地图使用 Dagre 进行层次化图布局,然后应用蛇形折叠( serpentine folding ),避免较长的依赖链生成难以阅读的超高宽高比长条布局:

1)Dagre 层次化布局: 我们使用图布局引擎 Dagre,并支持在水平和垂直布局方向之间切换,你可以在选项面板中进行修改。如果 Dagre 无法计算布局,服务地图会回退到确定性的网格布局,从而保持可交互性并避免出现错误。

2)针对长链的蛇形折叠( serpentine folding ): 较长的依赖流水线会形成狭长且难以阅读的条状布局,需要大量缩放才能查看。当宽高比变得过于极端时,我们会将各层( rank )折叠为上下堆叠、来回蛇形排列的带状结构,使“适应视图( fit view )”能够更紧密地缩放到实际的服务区域。如果拓扑本身已经足够紧凑,或者跨带状结构的边过多,则会跳过蛇形折叠。( #272900

服务依赖关系映射与 Kibana 仪表板嵌入背后的实现原理

视觉上的焕然一新最容易被注意到,而支撑重构后服务地图的一些架构变化包括:

使用统一资源节点,实现更简洁的服务依赖关系映射

我们现在会将外部依赖统一归并为资源节点( resource node ),从而减少视觉噪音。我们还修复了消息队列 span 的分组方式,使这类模式不再产生孤立节点( orphaned node )。( #252713

基于 ES|QL 和 Lens 驱动的服务地图详情面板图表

服务详情面板( flyout )中的基础设施和 RED 指标图表现在基于 ES|QL 和 Kibana 核心的 Lens 可视化引擎构建,使服务地图能够提供与整个 Kibana 一致的图表使用体验。( #273713

将服务地图嵌入到任何 Kibana 仪表板

将服务地图添加到仪表板只需一次点击。在 APM 的任意服务地图视图中打开“复制到仪表板( Copy to dashboard )”菜单,当前的环境、服务过滤器、 KQL 查询以及过滤器标签( filter chips )都会一并带到仪表板中。像 now-15m 这样的相对时间范围会原样保留,而不会冻结为绝对时间戳,因此该面板会在仪表板中持续保持实时更新。(#272277

嵌入后,面板会根据所在位置自动进行调整。它会根据当前视图模式显示或隐藏相应的控件,并遵循全局时间设置,同时不会覆盖你配置的相对时间范围。( #274551

APM 服务地图的下一步计划

服务地图重构是一个基础,而不是终点。除了 9.5 中已经提供的功能之外,后续的一些功能已经列入 APM 服务地图路线图

贡献者

我负责领导这次迁移,并与一支优秀的团队一起构建了这些功能。感谢 Samuel Brito、Gonçalo Rica Pais da Silva、Irene Blanco Fabregat、Carlos Crespo、Miriam Aparicio Garcia、Sandra G 和 Nathan Smith 在工程方面的贡献,也感谢 Karolina Kurstak 和 Roshan Gonsalkorale 在设计和产品工作方面的支持。

原文:APM service map 6x faster: Kibana's React Flow migration — Elastic Observability Labs


500 个服务时快 6 倍:我们如何将 Kibana APM 服务地图从 Canvas 重构到 React DOM》 是转载文章,点击查看原文


相关推荐


京东零售组织新变革:取消两级管理岗,推全栈化开发
AIHR数智引擎2026/7/22

近日,京东零售的组织调整方案流传出来。 很多人第一反应是:大厂又在砍中层。但把方案里的三条细节放在一起看,你会发现这事和"裁员"关系不大,它真正改写的,是"管理者"这三个字的定义。 细节一:C4、C5 两级管理者的"管理者身份"被取消。人还在,但"管人"这顶帽子没了,他们直接挂靠到 C3;以后员工请假、调休,C3 一个人拍板。 细节二:创新零售业务的前端团队并进服务端,全员转做全栈开发。第三季度开始,首批全栈工程师就要直接介入业务。 细节三:C2 序列的团队规模必须大于 50 人,没达标


AI编程出海第一步:别急着写代码,先找到老外真正愿意付费的需求
卷福同学2026/7/14

最近在学AI编程出海的项目,简单说就是做海外网站,让老外们付费使用。而第一步就是要确定网站做什么,也就是找需求 1.伪需求 对于小白来说,可能会想到和AI对话,聊出来一个需求,然后就开始做站了。但是这种AI直接生成的需求,只是看起来可以做,却没考虑到真实用户需求,往往做出来后没人用,或者已有成熟工具站了 2.真实的用户需求 以工具站为例,介绍2种方式来找真实的用户需求 Google Suggest 谷歌自动补齐,填写一个关键词到谷歌搜索,接着在前中后尝试输入a…z,会自动带出搜索词下拉列表,


协程深度解析:明明只有 8 个异步任务,为何 App 线程数瞬间突破 一倍?
潜龙勿用之化骨龙2026/7/6

在 Kotlin 协程中,有一个非常隐蔽但真实存在的问题: 你只是加了 Dispatchers.IO,线程数却变多了,多的不是一点点,而是成倍增长 更关键的是: 👉 这个问题在 Application 启动阶段,比 ViewModel 更严重 0. 先讲清楚“业务真实场景” 为了让问题更贴近真实工程,我们假设一个典型 App: App 启动 & UI 初始化行为 整个应用在启动时,会同时触发两类并发任务: ① Application 启动阶段(全局初始化) 启动 App → 自动


码农的AI翻身(三)你好,我叫 Embedding
Kfaino2026/6/28

AI翻身(三) 你好,我叫 Embedding——AI终于学会了理解,而不是死记硬背 大家好。 我叫 Embedding。 有人叫我: 向量。 有人叫我: 词向量。 还有人喜欢给我起一个特别高大上的名字: 语义空间映射。 听起来很厉害。 其实。 我就是一个翻译。 不过。 我翻译的不是中文和英文。 我翻译的是: 文字和数学。 我第一次见到老板的时候 老板(Transformer)对我说: "以后,人类说什么,你负责翻译。" 我愣住了。 "我不会中文啊。" 老板笑了。 "没关系。" "我也不会


笑抽了!DeepSeek识图,豆包完胜了!
甲维斯2026/6/19

听说 DeepSeek 识图功能上线了,我非常兴奋啊!终于要补上多模态这个短板了么? 打开APP和官网看了一眼: 真的出现了一个识图模式!哇塞! 我赶紧拿“梁爷爷”的图片试一波! 看到结果那一刻我瞬间,我忍不住笑出了声! 我的世界观被颠覆了。 原来这个人是腾讯公司高级副总裁、微信创始人张小龙。 我继续追问:那这个人是谁呢? 哇,世界观再次被颠覆!原来这两个人是同一个人?只是换了一个休息的造型而已??? 牛逼,还说出了 1、2、3、4,有理有据!好的,我信你了,这个人叫“张小龙”! 但是


Claude Code 每次调用 API 时,上下文是怎么"拼"出来的?
candyTong2026/6/11

Claude Code 每次调用模型 API 时,传给 API 的 payload 由三部分组成: System Prompt — 定义 Agent 的身份、行为规范和会话上下文 Tools — 工具 schema 列表,告诉模型有哪些能力可用 Messages — 对话消息,包含用户指令、CLAUDE.md 配置、工具执行结果 这三部分都会在 Agent Loop 调用模型时传入,但它们的来源不同:System Prompt 和 Tools 主要在进入循环前准备好,并在循环中保持相对稳定;


AI 降低了『写代码』的门槛,但是没有降低『软件开发』的复杂度
勇哥Java实战2026/6/4

好久没写文章了。 心里想写,却总觉得缺点由头。直到最近经历了几件事,彻底颠覆并重塑了我对 AI 编程的认知,骨鲠在喉,不吐不快。 我想聊聊那个被很多人忽略的真相:AI 确实拉低了「写代码」的门槛,但它并没有降低「软件开发」的复杂度。 1 售前朋友给我的惊喜 我曾经开源过一个项目——platform-sms。这是一个基于 SpringBoot 开发的短信网关服务,提供客户端 SDK,支持阿里云、腾讯云、亿美、合一等主流短信渠道,非常适合中小型公司。 这个项目最核心的设计亮点,在于我参考了阿里知名


CCFast 驰骋低代码BPM-积木菜单设计思想
驰骋低代码、工作流、表单引擎2026/5/28

CCFast 驰骋低代码 BPM:积木菜单设计思想  一、概述:为什么从“菜单”出发做低代码 1. CCFast 驰骋低代码 BPM 是一款开源的低代码开发与流程平台,面向企业信息化与业务流程数字化场景。 2. 本文章阐述:驰骋低代码 BPM 的整体体验与交付结构,根植于一套清晰、可扩展的菜单体系。 3. 其核心理念可以概括为:以菜单体系为骨架的低代码开发与运行平台——不是零散堆页面,而是用“可被授权、可被复用、可被组合”的菜单单元搭建系统。 4. 底座能力运行在组织结构管理与系统权限


RAG 系列(八):RAG 评估体系——用数据说话
冬奇Lab2026/5/6

为什么"感觉不错"不是标准? 前面七篇文章,我们搭起了一整套 RAG 流程:分块、Embedding、向量库、检索策略。系统跑起来了,你问它几个问题,回答看起来"还不错"。 但问题接踵而至: 迭代后真的变好了吗? 你换了 Embedding 模型、调了 chunk_size、加了 MMR,但回答质量真的提升了吗?还是只是"感觉"变好了? 问题出在哪里? 某个问题回答得很差,是检索阶段没召回相关文档,还是生成阶段模型在胡说八道? 怎么向老板汇报? "我觉得我们的 RAG 系统挺好的"——这句话在


告别重复劳动:一套插件让 AI 替你写代码、修Bug、做测试、上生产
吴文周2026/4/26

Claude Code 团队 AI 插件实践:从新人上线到全栈自动化的渐进式指南 特别鸣谢:本文由 南京大翼航空 团队实践沉淀而成,感谢团队在 AI 辅助研发领域的持续探索与投入。 后续规划:本文为 dw 插件生态的总览。后续将为每个 skill 单独撰写详细教程文章,涵盖实战案例、配置细节和踩坑经验,敬请关注。 本文涉及的研发规范体系均基于 Claude Code 的插件机制实现。插件是 Claude Code 官方提供的扩展方式,支持自定义命令、Skill、Hook、Agent 等,是

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读