设计新的 Kibana 仪表板布局以支持可折叠部分等

news2025/1/27 4:44:12

作者:来自 Elastic Teresa Alvarez Soler, Hannah Mudge 及 Nathaniel Reese

在 Kibana 中构建可折叠仪表板部分需要彻底改造嵌入式系统并创建自定义布局引擎。这些更新改进了状态管理、层次结构和性能,同时为新的高级仪表板功能奠定了基础。

我们正在开发可折叠部分,以隐藏和显示 Kibana 仪表板中的面板,以帮助组织内容并提高性能。这是一个经典的软件开发故事:有时要前进,就必须……走下坡路?阅读有关如何构建看似简单的热门功能有时会导致比你预期的更大的简化的信息!😅

可折叠部分

背景介绍:Kibana 中的仪表板可以包含许多可视化内容,站点可靠性工程师 (SRE) 使用这些可视化内容来保持系统运行,或安全分析师在调查中使用它们。这些仪表板可能很长且加载速度很慢。用户希望更好地组织仪表板内容,以避免性能陷阱并使其更易于扫描。今天,实现此目的的最佳方法是将仪表板内容拆分为多个仪表板,然后使用仪表板链接面板链接它们以方便导航。不幸的是,这不允许你并排查看内容,并且使仪表板作者需要付出大量努力才能进行更新和维护。为了解决这一需求,我们正在开发可折叠部分以隐藏和显示 Kibana 仪表板中的面板 - 这些部分有助于组织内容,并且不会加载折叠的内容以提高性能。

这些新部分将允许你对主题相关的仪表板面板和数据可视化进行分组,从而更轻松地找到你要查找的信息。最重要的是,你可以轻松隐藏和展开这些部分,从而仅加载所需的数据。这将帮助你创建图表的并排比较并简化仪表板性能。

规划工程方法

一开始,当我们审视客户对该功能的需求时,它看起来像是一个常规规模的工程工作:仪表板包含面板(稍后会详细说明),需要将它们组织到不同的部分中,并且产品需求要求仅在某个部分打开时渲染相关面板。此外,还需要一个拖放系统来布局仪表板,该系统必须考虑这些部分,并能处理各种 “在部分之间移动内容” 类型的用例。看起来像是对现有代码的一次增强,对吧?

不幸的是,经过短暂的概念验证后,我们发现答案是否定的。事情没那么简单。Kibana 使用 “可嵌入” 框架,而该框架缺乏不在仪表板上呈现某些嵌入对象所需的特性。让我们来看看为什么……

什么是 “可嵌入”?

尽管 “可嵌入” 未出现在 “Discover” 和 “Dashboard" 旁边的导航菜单中,但你仍可以在整个 Kibana 中与可嵌入内容进行交互。Discover 中的直方图、仪表板中的每个面板、面板的上下文菜单、可观察性中的镜头图表或安全性中的地图 - 所有这些都可以通过可嵌入内容实现。

可嵌入内容是 React 组件,可提供与 Kibana 深度集成的 API。此 API 允许它们由任何页面持久保存和恢复,使它们能够访问当前搜索上下文,允许它们定义编辑 UI,并且可扩展,以便工程师可以定义组件如何相互交互。它们位于注册表中,注册表将它们的行为与编写代码的位置分开。因此,许多工程师可以同时处理不同的可嵌入内容,而不会互相干扰。

对新嵌入式系统的需求

我们当时正在研究的旧式嵌入式系统可以追溯到 2018 年。嵌入式功能通过自定义用户体验组件抽象来公开。当时,Kibana 正在从 Angular 1 过渡到 React,因此嵌入式系统被设计为与框架无关,这可以顺利实现从 React 的理论过渡。虽然当时需要这种架构,但自那时以来,Kibana 已经发生了很大变化,并且不太可能脱离 React。现在,不灵活且不可知的嵌入式架构是一个日益严重的摩擦点。一些痛点是:

  • 复杂的状态管理:嵌入式中的所有状态都要经过两个可观察对象(输入、输出)之一才能被继承、设置或读取。这要求消费者设置复杂的双向同步管道。
  • 有限的继承:嵌入式只能有一个父级,将继承限制在一个层次结构中。此外,可嵌入状态从父级流向子级,如果已定义,子级状态将覆盖父级状态。
  • 手动渲染:可嵌入需要繁琐的手动渲染过程和 Kibana 其余部分之间的兼容层,后者通过 React 进行渲染。

可折叠部分无法通过单一层次结构实现。可折叠部分需要多个层次结构,以允许面板属于仪表板和可折叠部分。否则,你将无法将面板放入可折叠部分。

新的可嵌入系统

因此,为了实现此功能,我们实际上必须 “深入” 可嵌入系统本身,并现代化管理可嵌入项的方式:我们必须设计一个新的可嵌入系统。很有趣!但同时……范围也很大!

新的可嵌入功能通过普通的旧 JavaScript 对象公开,并且可以通过实现接口来组合其功能。例如,可嵌入可以通过实现 PublishesDataLoading 接口来传达数据加载。这提供了以下好处:

  • 干净的状态管理:每个状态都作为只读可观察对象公开。可以为可变状态公开 Setter 方法。
  • 灵活的继承:可嵌入可以有一个父级链,允许根据需要设置尽可能多的层次结构。每一层都保留自己的状态,以便在使用时决定使用哪个状态。

有了可以容忍我们所需的继承的系统,现在可以构建可折叠部分。

但是,像任何好的重构一样,也有一个问题:可嵌入在 Kibana 中无处不在,为了在不导致回归的情况下实现这一变化,我们需要在 Elastic 的整个体验中迁移到新的可嵌入系统 —— 从 Elastic Security 中的 Alerts 页面到 Elastic Observability 中的 Service Inventory,以及介于两者之间的几乎所有内容。这花费了我们一些时间,但却带来了一些令人兴奋的新可能性。

新的布局引擎

任何仪表板背后的驱动力都是布局引擎,它允许面板被拖动和调整大小 —— 没有它,仪表板将完全是静态的(和无聊的)!

目前,Kibana 使用外部 react-grid-layout 包来驱动我们的仪表板,这是一个由一小群志愿者管理的开源布局引擎。到目前为止,这个布局引擎对我们的仪表板非常有用;然而,不幸的是,它缺少一些关键功能,这些功能可以使可折叠部分开箱即用:要么是 “面板内的面板”,要么是将面板拖到布局的两个独立实例上。

由于 react-grid-layout 背后的团队很小,因此对包的更新很少 —— 这意味着,即使我们开始直接为 react-grid-layout 做出贡献以添加我们需要的功能,将这些更改纳入 Kibana 仪表板也会很慢且不可靠。虽然我们曾短暂考虑过制作一个特定于 Kibana 的 react-grid-layout 分支,以便以与我们的发展相匹配的速度发布更新,但维护成本和不灵活性最终导致我们放弃了这个想法。

在研究了替代的布局引擎包后,我们决定最好的前进道路是开发我们自己的内部布局引擎 —— 一个专门为 Kibana Dashboard 用例而构建的引擎!这个新布局引擎(我们称之为 kbn-grid-layout)的开发工作已经开始。据我们所知,这是第一个利用原生 CSS 网格来定位其面板的布局引擎 —— 我们在研究中发现的所有其他布局引擎都依赖于像素级变换或绝对定位。这使得理解面板在仪表板上的放置方式变得容易得多。

kbn-grid-layout 对所有拖动和调整大小事件使用被动事件处理程序,重点是将这些操作期间的重新渲染次数减少到最低限度,以提高性能。由于我们可以控制这些事件处理程序,因此我们可以比以前更加专注于用户体验,并且我们添加了一些功能,例如在屏幕顶部或底部附近拖动时自动滚动,以及在调整大小事件期间锁定网格高度,以防止浏览器在调整大小事件完成之前响应高度变化而导致的意外行为。

我们目前正在完善实施,包括改进可折叠部分的管理、添加用于拖动和调整大小的键盘支持(Kibana 仪表板目前不支持此功能)等等。这个新的布局引擎不仅能够解锁添加可折叠部分的功能,而且在构建时还以可访问性和效率为首要考虑 — 这意味着一旦我们将最终布局引擎从 react-grid-layout 切换到 kbn-grid-layout,整个仪表板体验就会得到改善!

react-grid-layout

<ResponsiveReactGridLayout
  cols={
  
  {
    lg: 48,
    sm: 1,
  }}
  layouts={layouts}
  className={classes}
  width={viewportWidth}
  breakpoints={breakpoints}
  onLayoutChange={
    onLayoutChangeCallback
  }
  isResizable={
    !expandedPanel && !focusedPanel
  }
  isDraggable={
    !expandedPanel && !focusedPanel
  }
  rowHeight={20}
  margin={useMargins ? [8, 8] : [0, 0]}
  draggableHandle={'.embPanel--dragHandle'}
  useCSSTransforms={false}
>
  {panelComponents}
</ResponsiveReactGridLayout>

kbn-grid-layout

<GridLayout
  layout={currentLayout}
  gridSettings={
  
  {
    gutterSize: useMargins ? 8 : 0,
    rowHeight: 20,
    columnCount: 48,
  }}
  renderPanelContents={
    renderPanelCallback
  }
  onLayoutChange={
    onLayoutChangeCallback
  }
  expandedPanelId={expandedPanel}
  accessMode={accessMode}
/>

在发布之前查看

我们即将走出可嵌入的困境,并准备与所有客户一起享受我们的劳动成果,从每周发布的 Elastic Serverless 到我们的自托管用户。我们的客户将能够设计一个包含许多部分的仪表板,默认情况下可以折叠这些部分,从而允许调查仅加载所需的面板内容,同时保持冗长的仪表板整洁。如果你想向我们提供反馈或注册早期测试,请告诉我们!我们将在未来几个月内宣布此功能何时可供使用。敬请期待!

Elasticsearch 包含许多新功能,可帮助你为你的用例构建最佳搜索解决方案。深入了解我们的示例笔记本以了解更多信息,开始免费云试用,或立即在你的本地机器上试用 Elastic。

原文:Engineering a new Kibana dashboard layout to support collapsible sections & more - Elasticsearch Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2283188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Python和Tkinter标准模块建立密码管理器

用Python和Tkinter标准模块建立密码管理器 创建一个简单的密码管理器应用程序&#xff0c;帮助用户存储和管理他们的密码。使用Python的tkinter模块来创建一个图形用户界面&#xff08;GUI&#xff09;。 本程序支持 添加、查看、搜索、复制、修改、删除 功能。 本程序使用 …

day1代码练习

输出3-100以内的完美数&#xff0c;(完美数&#xff1a;因子和(因子不包含自身)数本身) #include <stdio.h>// 判断一个数是否为完美数的函数 int panduan(int n) {if (n < 2) {return 0; // 小于2的数不可能是完美数}int sum 1; // 因子和初始化为1&#xff08;因…

为什么redis会开小差?Redis 频繁异常的深度剖析与解决方案

文章目录 导读为什么redis会开小差&#xff1f;1.连接数过多2.bigkey3.慢命令操作4.内存策略不合理5.外部数据双写一致性6.保护机制未开启7. 数据集中过期8. CPU饱和9. 持久化阻塞10. 网络问题结论 导读 提起分布式缓存&#xff0c;想必大多数同学脑海中都会浮出redis这个名字…

C# Interlocked 类使用详解

总目录 前言 在多线程编程中&#xff0c;确保多个线程对共享资源的安全访问是一个关键挑战。C# 提供了多种同步机制来处理并发问题&#xff0c;其中 System.Threading.Interlocked 类提供了一种轻量级的方法来进行原子操作。它允许您执行一些常见的增量、减量、交换等操作&…

VS Code i18n国际化组件代码code显示中文配置 i18n ally

VUE项目做i18n国际化之后&#xff0c;代码中的中文都变成了code这时的代码就会显得非常难读&#xff0c;如果有一个插件能把code转换成中文显示就好了 vscode插件搜索“i18n ally” 在项目根文件夹下创建文件&#xff1a;.vscode/settings.json settings.json 内容如下 {"…

MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log

文章目录 一、前言1.1 MySQL体系结构1.2 MySQL日志分类1.3 其他几种日志1.3.1 查询日志1.3.2 慢查询日志1.3.3 错误日志 二、bin log 二进制日志2.1 bin log简介2.2 binlog日志格式2.3 日志删除2.4 写入/刷盘机制 三、undo log 回滚日志3.1 undo log简介3.2 隐藏字段 —— 事务…

一文速通stack和queue的理解与使用

CSTL之stack和queue 1.stack1.1.stack的基本概念1.2.stack的接口 2.queue2.1.queue的基本概念2.2.queue的接口 3.priority_queue3.1.priority_queue的基本概念3.2.priority_queue的接口3.3.仿函数 4.容器适配器5.deque5.1.deque的简单了解5.2.deque的优缺点 &#x1f31f;&…

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN &#xff0c;以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

orbbec 奥比中光相机单目及多目调用方式python代码

这篇文章会介绍使用orbbec相机的一些常用代码梯子 orbbec 奥比中光Astra相机单目及多目调用方式编译sdk调用单相机调用多相机orbbec 奥比中光Astra相机单目及多目调用方式 Orbbec相机是一个专注于深度感知和计算机视觉应用的设备,通常用于3D扫描、手势识别、增强现实(AR)以及…

力扣hot100-->滑动窗口、贪心

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…

PBFT算法

在我的博客中对于RAFT算法也有详细的介绍&#xff0c;raft算法包含三种角色&#xff0c;分别是&#xff1a;跟随者&#xff08; follower &#xff09;&#xff0c;候选人&#xff08;candidate &#xff09;和领导者&#xff08; leader &#xff09;。集群中的一个节点在某一…

跨境电商代购系统独立站深度分享

在全球化日益加深的今天&#xff0c;跨境电商代购系统独立站作为一种新兴的电子商务模式&#xff0c;正逐渐成为连接全球消费者与优质商品的重要桥梁。本文将详细介绍跨境电商代购系统独立站的基本功能以及技术实现的重难点&#xff0c;以期为相关从业者提供一些有价值的参考和…

携程旅行 登录分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 所有加密流程基本一样就说…

西藏酥油茶:高原上的醇香温暖

西藏酥油茶:高原上的醇香温暖 在西藏高原,有一种饮品,它不仅滋养了一代又一代的藏民,还承载着丰富的文化与历史,它就是西藏酥油茶。酥油茶,藏语称为“恰苏玛”,意为搅动的茶,是藏族人民日常生活中不可或缺的一部分,更是待客、祭祀等活动中的重要礼仪物品。 历史与文化渊源 酥…

刷题总结 回溯算法

为了方便复习并且在把算法忘掉的时候能尽量快速的捡起来 刷完回溯算法这里需要做个总结 回溯算法的适用范围 回溯算法是深度优先搜索&#xff08;DFS&#xff09;的一种特定应用&#xff0c;在DFS的基础上引入了约束检查和回退机制。 相比于普通的DFS&#xff0c;回溯法的优…

Antd React Form使用Radio嵌套多个Select和Input的处理

使用Antd React Form使用Radio会遇到嵌套多个Select和Input的处理&#xff0c;需要多层嵌套和处理默认事件和冒泡&#xff0c;具体实现过程直接上代码。 实现效果布局如下图 代码 <Formname"basic"form{form}labelWrap{...formItemLayoutSpan(5, 19)}onFinish{on…

Linux(Centos、Ubuntu) 系统安装jenkins服务

该文章手把手演示在Linux系统下如何安装jenkins服务、并自定义jenkins数据文件位置、以及jenkins如何设置国内镜像源加速&#xff0c;解决插件下载失败问题 安装方式&#xff1a;war包安装 阿里云提供的war下载源地址&#xff1a;https://mirrors.aliyun.com/jenkins/war/?s…

【基于无线电的数据通信链】Link 11 仿真测试

〇、废话 Link 11 仿真测试 涉及多个方面&#xff0c;包括信号仿真、协议模拟、数据链路层的仿真以及网络性能评估等。Link 11 是一种基于 HF&#xff08;高频&#xff09; 或 UHF&#xff08;超高频&#xff09; 波段的无线通信协议&#xff0c;主要用于军事通信系统中。为了…

VScode 开发 Springboot 程序

1. 通过maven创建springboot程序 输入 mvn archetype:generate 选择模板&#xff0c;一般默认选择为第 7 种方式&#xff1b; 选择之后&#xff0c;一般要你填写如下内容&#xff1a; groupId: 组织名称&#xff1b;artifactId: 项目名称&#xff1b;version: 版本&#xff0…

深入MapReduce——引入

引入 前面我们已经深入了HDFS的设计与实现&#xff0c;对于分布式系统也有了不错的理解。 但HDFS仅仅解决了海量数据存储和读写的问题。要想让数据产生价值&#xff0c;一定是需要从数据中挖掘出价值才行&#xff0c;这就需要我们拥有海量数据的计算处理能力。 下面我们还是…