插件、包与平台
从最终用户的角度来看,Kibana 是一个与 Elasticsearch 交互的工具,提供了一种简便的方法来可视化和分析数据。
从开发者的角度来看,Kibana 是一个提供了一系列工具的平台,不仅可以构建您今天在 Kibana 中看到的 UI,还可以构建各种各样的应用程序,用于探索、可视化和处理 Elasticsearch 中的数据。该平台使开发者能够构建应用程序,或将额外的功能注入到现有的应用程序中。您是否知道您在 Kibana UI 中看到的大部分内容都是构建在插件内部的?如果您从 Kibana 中删除了所有插件,您将只剩下一个空的导航菜单和一套开发工具。Kibana 平台就像一张空白画布,正等待着开发者前来创造!

从最高层级来看,Kibana 由插件 (plugins)、核心 (core) 和 Kibana 包 (Kibana packages) 组成。

插件提供了 Kibana 中绝大部分的功能。所有的应用程序和 UI 都在这里定义。
核心提供了运行时和最基础的服务。
@kbn 包提供了可以在 Kibana 中任何地方导入的、无状态的可重用功能。
常见问题解答:我应该把代码放在插件中还是包中?
如果代码是有状态的,则必须从插件的生命周期方法中暴露出来。不要静态导出有状态的代码。
使用包的好处
- <b>潜在的减少页面加载时间</b>。所有从插件静态导出的代码都会在每次页面加载时下载,即使并不需要这些代码。使用包时,只有导入的代码才会被下载,这可以通过使用异步导入来最小化。
- <b>将控制权交给使用者,决定如何以及何时异步导入</b>。如果使用者异步导入从插件导出的代码,这没有任何区别,因为上一条所述的原因,它已经被下载了。然而,仅仅将代码移动到包中并不能保证性能提升。但它确实赋予了使用者做出明智性能选择的能力。如果他们需要来自多个包的代码,使用者可以同时从多个包中异步导入。在我们的性能文档中阅读更多信息。
常见问题解答:插件提供的服务与核心提供的服务有什么区别?
我们尽量只将最稳定和最基础的代码放入 Core 中,而可选的附加组件、应用程序和面向解决方案的功能则放入插件中。
目前的情况大致如下。

“平台插件”提供类似核心的功能,只是它们位于核心之外,其公共 API 往往更不稳定。其他插件可能仍然会暴露共享服务,但它们仅供一小部分特定插件使用,可能不是通用的或“平台式”的。
插件是为扩展和定制 Kibana 而编写的代码。插件不一定要成为 Kibana 仓库的一部分,尽管 Kibana 仓库确实包含许多插件!插件通过使用平台服务提供的扩展点来添加定制功能。有时人们会混淆“插件”和“应用程序”这两个术语。虽然插件和应用程序之间通常存在 1:1 的关系,但并非总是如此。一个插件可以注册许多应用程序,也可以一个都不注册。
应用程序是 Kibana UI 中的顶层页面。Discover(发现)、Dashboard(仪表板)、Dev Tools(开发工具)、Maps(地图)等都是应用程序的示例

一个插件可以通过将应用程序添加到核心的应用程序注册表中来注册该应用程序。
插件的公共 API 由从插件的启动 (start) 或设置 (setup) 生命周期方法导出的所有内容,以及存在于三个“作用域”文件夹中的顶层 index.ts 文件中导出的内容组成
- common/index.ts
- public/index.ts
- server/index.ts
任何从这些文件或生命周期方法中导出内容的插件都在暴露公共服务。我们有时称这些为“插件服务”或“共享服务”。
核心和插件在其生命周期的不同部分暴露不同的功能。我们通过服务定义上特定命名的方法来描述核心服务和插件的生命周期。
Kibana 有三个生命周期:setup(设置)、start(启动)和 stop(停止)。每个插件的 setup 函数在 Kibana 于服务器上进行设置时或在浏览器中加载时按顺序调用。start 函数在所有插件的 setup 完成后按顺序调用。stop 函数在 Kibana 优雅地关闭服务器时或浏览器标签页/窗口关闭时按顺序调用。
下表解释了每个生命周期如何与 Kibana 的状态相关联。
| 生命周期 | 用途 | server | browser |
|---|---|---|---|
| setup | 执行“注册”工作以设置运行时环境 | 配置 REST API 端点,注册已保存对象类型等。 | 配置 SPA 中的应用程序路由,在扩展点中注册自定义 UI 元素等。 |
| start | 引导运行时逻辑 | 响应传入的请求,请求 Elasticsearch 服务器等。 | 开始轮询 Kibana 服务器,根据用户交互更新 DOM 树等。 |
| 停止 | 清理运行时 | 在服务器关闭前处置活动句柄。 | 当用户离开 Kibana 时将会话数据存储在 LocalStorage 中等。 |
不同的服务接口可以并且会被传递给 setup、start 和 stop,因为某些功能在正在运行的插件上下文中才有意义,而其他类型的功能可能有限制,或者仅在正在停止的插件上下文中才有意义。
扩展点是由核心或插件的插件 API 提供的函数,其他插件可以使用它来定制 Kibana 体验。扩展点的示例如下
core.application.register(上面提到的扩展点)core.notifications.toasts.addSuccesscore.overlays.showModalembeddables.registerEmbeddableFactoryuiActions.registerActioncore.savedObjects.registerType
通过遵循 Hello World 教程学习如何构建您自己的插件。