当前位置: 首页 > news >正文

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

作者:来自 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

<ResponsiveReactGridLayoutcols={{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

<GridLayoutlayout={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

相关文章:

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

作者&#xff1a;来自 Elastic Teresa Alvarez Soler, Hannah Mudge 及 Nathaniel Reese 在 Kibana 中构建可折叠仪表板部分需要彻底改造嵌入式系统并创建自定义布局引擎。这些更新改进了状态管理、层次结构和性能&#xff0c;同时为新的高级仪表板功能奠定了基础。 我们正在开…...

修改maven的编码格式为utf-8

1.maven默认编码为GBK 注:配好MAVEN_HOME的环境变量后,在运行cmd. 打开cmd 运行mvn -v命令即可. 2.修改UTF-8为默认编码. 设置环境变量 变量名 MAVEN_OPTS 变量值 -Xms256m -Xmx512m -Dfile.encodingUTF-8 3.保存,退出cmd.重新打开cmd 运行mvn -v命令即可. 源码获取&…...

解锁罗技键盘新技能:轻松锁定功能键(罗技K580)

在使用罗技键盘的过程中&#xff0c;你是否曾因 F11、F12 功能键的默认设置与实际需求不符而感到困扰&#xff1f; 别担心&#xff0c;今天就为大家分享一个简单实用的小技巧 —— 锁定罗技键盘的 F11、F12 功能键&#xff0c;让你的操作更加得心应手&#xff01; 通常情况下…...

HTB:Active[RE-WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…...

[C语言日寄] 源码、补码、反码介绍

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

安卓逆向之脱壳-认识一下动态加载 双亲委派(一)

安卓逆向和脱壳是安全研究、漏洞挖掘、恶意软件分析等领域的重要环节。脱壳&#xff08;unpacking&#xff09;指的是去除应用程序中加固或保护措施的过程&#xff0c;使得可以访问应用程序的原始代码或者数据。脱壳的重要性&#xff1a; 分析恶意软件&#xff1a;很多恶意软件…...

Nuxt:利用public-ip这个npm包来获取公网IP

目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子&#xff1a; <template…...

babylon.js-3:了解STL网格模型

网格模型上色 本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。 文章目录 网格模型上色运用场景概要延申正文加载器库的支持认识 OBJ 和 STL 文件GUI 色板选择器网格模型异步加载加载动画网格模型上色官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明OBJ …...

基于SpringBoot的假期周边游平台的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【MySQL】初始MySQL、库与表的操作

目录 基本使用 使用案例 SQL分类 存储引擎 库的操作 字符集和校验规则 查看系统默认字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定编码常见数据库 校验规则对数据库的影响 操纵数据库 库的备份与恢复 表的操作 创建表 查看表 …...

将DeepSeek接入Word,打造AI办公助手

最近&#xff0c;DeepSeek热度一路高涨&#xff0c;成为AI领域的焦点。通过开放的API&#xff0c;我们可以将DeepSeek接入Word&#xff0c;直接进行AI对话。更进一步&#xff0c;还能利用DeepSeek辅助修改文档&#xff0c;甚至提出一些排版建议。 Word报告工具已经新增“DeepS…...

Coze,Dify,FastGPT,对比

在当今 AI 技术迅速发展的背景下&#xff0c;AI Agent 智能体成为了关键领域&#xff0c;Coze、Dify 和 FastGPT 作为其中的佼佼者&#xff0c;各有千秋。 平台介绍 - FastGPT&#xff1a;由环界云计算公司发起&#xff0c;是基于大语言模型&#xff08;LLM&#xff09;的开源…...

Kafka 日志存储 — 磁盘存储

Kafka 依赖与磁盘来存储和缓存消息&#xff0c;采用文件追加的方式来写入消息。顺序写盘的速度快于随机写内存。 1 磁盘存储 除顺序写入外&#xff0c;Kafka中大量使用了页缓存、零拷贝等技术来进一步提升吞吐性能。 1.1 页缓存 页缓存是操作系统实现的一种磁盘缓存&#x…...

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…...

GL C++显示相机YUV视频数据使用帧缓冲FBO后期处理,实现滤镜功能。

一.前言&#xff1a; GitHub地址&#xff1a;GitHub - wangyongyao1989/WyFFmpeg: 音视频相关基础实现 系列文章&#xff1a; 1. OpenGL Texture C 预览Camera视频&#xff1b; 2. OpenGL Texture C Camera Filter滤镜; 3. OpenGL 自定义SurfaceView Texture C预览Camera视…...

【hot100】刷题记录(7)-除自身数组以外的乘积

题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#x…...

解决.NET程序通过网盘传到Linux和macOS不能运行的问题

问题描述&#xff1a;.net程序用U盘传到虚拟机macOS和Linux可以正常运行&#xff0c;但是网盘传过去就不行。 解决方法&#xff1a; 这是文件权限的问题。当你通过U盘将文件传输到虚拟机的macOS和Linux系统时&#xff0c;文件的权限和所有权可能得到了保留或正确设置。但如果…...

练习(复习)

大家好&#xff0c;今天我们来做几道简单的选择题目来巩固一下最近学习的知识&#xff0c;以便我们接下来更好的学习。 这道题比较简单&#xff0c;我们前面学过&#xff0c;在Java中&#xff0c;一个类只能继承一个父类&#xff0c;但是一个父类可以有多个子类&#xff0c;一个…...

Class2(2020):Shell基础(二)——Shell脚本设计基础

本系列博客为MIT的《Missing in CS Class》的课程笔记。 Class2(2020):Shell基础(二)——Shell脚本设计基础 注&#xff1a;若无特殊说明&#xff0c;本文中带有[]的部分均为可选参数。 脚本文件 脚本语言为解释执行&#xff0c;其运行需有解释器&#xff0c;如Python。Shel…...

HBase-2.5.10 伪分布式环境搭建【Mac】

文章目录 前言一、搭建单节点Zookeeper1. 解压zookeeper2. 配置环境变量3. 修改配置文件4. 启动zk 二、搭建伪分布式Hbase1. 解压hbase2. 配置环境变量3. 修改配置4. 启动HBase 前言 搭建hbase伪分布式环境 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例仅供参…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...