Elastic Kibana平台插件开发核心概念解析

Elastic Kibana平台插件开发核心概念解析

kibana Your window into the Elastic Stack kibana 项目地址: https://gitcode.com/gh_mirrors/ki/kibana

前言

作为Elastic Stack的重要组成部分,Kibana不仅是一个强大的数据可视化工具,更是一个高度可扩展的开发平台。本文将深入解析Kibana平台架构的核心概念,帮助开发者理解如何基于Kibana平台构建自定义插件。

Kibana平台架构概览

从用户角度看,Kibana是与Elasticsearch交互的工具,提供数据可视化和分析功能。而从开发者视角看,Kibana是一个功能强大的开发平台,主要由三个核心部分组成:

  1. 插件(Plugins) - 提供Kibana中绝大多数功能,所有应用程序和UI都在这里定义
  2. 核心(Core) - 提供运行时环境和最基础的服务
  3. @kbn包 - 提供可在Kibana任何地方导入的静态工具

有趣的是,Kibana UI中几乎所有内容都是通过插件构建的。如果移除所有插件,剩下的将只是一个空导航菜单和一组开发者工具。这充分展示了Kibana平台作为"空白画布"的特性。

插件系统深度解析

插件的基本概念

插件是用于扩展和定制Kibana的代码模块,它们通过使用平台服务提供的扩展点来添加自定义功能。虽然插件不必是Kibana代码库的一部分,但Kibana代码库本身包含许多内置插件。

需要特别注意的是,"插件"和"应用程序"这两个概念经常被混淆。虽然通常一个插件对应一个应用程序,但这并非绝对。一个插件可以注册多个应用程序,也可以不注册任何应用程序。

应用程序(Applications)

应用程序是Kibana UI中的顶级页面,如Dashboard、Canvas、Maps、App Search等都是典型的应用程序示例。插件可以通过向核心的应用程序注册表添加应用来注册应用程序。

插件的公共API

插件的公共API包括:

  1. 从插件的生命周期方法(start或setup)导出的所有内容
  2. 位于三个"作用域"文件夹中的顶级index.ts文件导出的内容:
    • common/index.ts
    • public/index.ts
    • server/index.ts

任何从这些文件或生命周期方法导出的内容都构成了插件的公共服务,有时我们也称之为"插件服务"或"共享服务"。

生命周期方法详解

核心服务和插件在其生命周期的不同阶段会暴露不同的功能。我们通过服务定义中特定命名的函数来描述这些生命周期。

Kibana有三个生命周期阶段:

  1. setup阶段 - 执行"注册"工作,为运行时环境做准备

    • 服务器端:配置REST API端点、注册保存对象类型等
    • 浏览器端:在SPA中配置应用路由、在扩展点注册自定义UI元素等
  2. start阶段 - 引导运行时逻辑

    • 服务器端:响应传入请求、请求Elasticsearch服务器等
    • 浏览器端:开始轮询Kibana服务器、根据用户交互更新DOM树等
  3. stop阶段 - 清理运行时

    • 服务器端:在服务器关闭前释放活动句柄
    • 浏览器端:当用户离开Kibana时将会话数据存储在LocalStorage中

不同的服务接口会被传递给setup、start和stop方法,因为某些功能在运行中的插件上下文中才有意义,而其他类型的功能可能有特殊限制或仅在插件停止的上下文中才有意义。

扩展点机制

扩展点是核心或插件API提供的函数,其他插件可以使用这些函数来自定义Kibana体验。常见的扩展点示例包括:

  • core.application.register (应用程序注册)
  • core.notifications.toasts.addSuccess (通知提示)
  • core.overlays.showModal (模态框显示)
  • embeddables.registerEmbeddableFactory (可嵌入组件注册)
  • uiActions.registerAction (UI动作注册)
  • core.savedObjects.registerType (保存对象类型注册)

开发实践建议

代码组织决策:插件还是包?

在开发过程中,一个重要决策是将代码放在插件中还是@kbn包中。以下是关键考虑因素:

选择包的优点:

  1. 可能减少页面加载时间
  2. 让消费者控制如何及何时异步导入

选择包的缺点:

  1. 不符合按领域组织的原则
  2. 开发开销较大
  3. 开发性能较低(重建时间通常比插件长)

基本原则:

  • 如果代码是有状态的(stateful),必须从插件的生命周期方法中暴露
  • 不要静态导出有状态的代码

核心服务与插件服务的区别

我们尝试将最稳定和基础的代码放入Core,而将可选附加组件、应用程序和面向解决方案的功能放入插件。不过在实践中,这一界限有时会变得模糊:

  • 核心服务:提供最基础、最稳定的功能
  • 平台插件:提供类似核心的功能,但位于核心之外,API变化更频繁
  • 其他插件:可能暴露共享服务,但通常只供特定插件子集使用

历史背景与未来方向

Kibana平台和插件基础设施最初设计时,我们只考虑了两种代码:核心服务和其他插件服务。但现实中,许多平台级服务最终位于核心之外,形成了"平台插件"的概念。

另一个意外结果是插件模型被当作微服务使用。插件成为我们提供给开发者的唯一封装形式,这导致了大量小型插件的产生。我们正在考虑提供新的服务构建方式,既能满足封装需求,又不必强制创建插件。

未来,我们将继续努力澄清核心功能、平台级插件功能和其他插件功能之间的关系,为开发者提供更清晰的指导。

结语

理解Kibana平台的这些核心概念是开发高质量插件的基础。通过合理利用生命周期方法、扩展点和公共服务,开发者可以构建出功能强大且稳定的Kibana扩展。随着平台的不断演进,这些概念可能会有所发展,但掌握这些基本原理将帮助开发者适应未来的变化。

kibana Your window into the Elastic Stack kibana 项目地址: https://gitcode.com/gh_mirrors/ki/kibana

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄或默Nursing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值