后端开发的Grafana插件系统使您可以将Grafana与几乎任何东西集成,并提供自定义可视化。该系统基于HashiCorp的Go Plugin System over RPC.,通过RPC实现。我们实现的Grafana服务器将每个后端插件作为子进程启动,并通过gRPC与其进行通信。
本文介绍了该系统的背景、用例、优势和关键功能。
背景
在版本3.0中,Grafana添加了对前端插件的支持,使Grafana社区能够创建自定义面板和数据源。这是非常成功的,使Grafana对我们用户社区的实用性大大提高。
然而,这些插件的一个限制是它们在客户端(浏览器)上运行。因此,它们无法支持需要服务器端功能的用例。
自Grafana v7.0以来,我们支持服务器端插件,消除了这一限制。我们使用“后端插件”一词来表示具有后端组件的插件。后端插件通常还需要前端组件。例如,一些后端数据源插件需要在前端上查询编辑器组件。
实现后端插件的用例
以下示例给出了后端插件的一些常见用例:
- 为数据源启用Grafana警报。
- 连接到SQL数据库服务器和其他通常无法从浏览器连接的非HTTP服务。
- 在用户之间保持状态,例如,通过为数据源查询缓存。
- 使用在Grafana中不受支持的自定义身份验证方法和/或授权检查。
- 使用自定义数据源请求代理(有关更多信息,请参阅资源)。
插件开发的利益
Grafana的方法对开发人员有益:
- 稳定性:插件不会使您的Grafana进程崩溃:插件中的恐慌不会使服务器恐慌。
- 易于开发:Grafana为Go提供了官方支持的SDK和工具,以帮助创建插件。
- 安全性:插件只能访问它们被提供的接口和参数,而不能访问进程的整个内存空间。
后端插件系统的能力
Grafana的后台插件系统暴露了一些关键的功能或构建模块,供您的后台插件实现:
- 查询数据
- 资源
- 健康检查
- 收集指标
- 流媒体
查询数据
查询数据功能允许后台插件处理从仪表板、Explore或Grafana Alerting提交的数据源查询。响应包含数据帧,用于可视化度量、日志和跟踪。
注意:后台数据源插件必须实现查询数据功能。
资源
资源功能允许后台插件处理发送到Grafana HTTP API的自定义HTTP请求,并使用自定义HTTP响应进行响应。在这里,请求和响应格式可以有所不同。例如,您可以使用JSON、纯文本、HTML或静态资源(如图像和文件)等。
与响应包含数据帧的查询数据功能相比,资源功能为插件开发者提供了更大的灵活性,以扩展和开放Grafana用于新的和有趣的使用案例。
实现资源的用例:
- 实现自定义数据源代理,提供Grafana内置数据代理不支持的某些身份验证、授权或其他要求。
- 以适合数据源查询编辑器使用的格式返回数据或信息,以提供自动完成功能。
- 返回静态资源,如图像或文件。 向设备发送命令,例如微控制器或物联网设备。
- 从设备请求信息,例如微控制器或物联网设备。
- 使用自定义资源、方法和操作扩展Grafana的HTTP API。
- 使用分块传输编码以分块方式返回大型数据响应或启用某些流媒体功能。
健康检查
健康检查功能允许后端插件返回插件的状态。对于数据源后端插件,当用户在UI中编辑数据源并选择“保存&测试”时,健康检查会自动调用。 插件的健康检查端点通过Grafana HTTP API暴露,允许外部系统持续轮询插件的健康状况,以确保它按预期运行和工作。
收集指标
后端插件可以使用基于文本的Prometheus公开格式收集和返回运行时、进程和自定义指标。如果您使用Go语言的Grafana插件SDK实现后端插件,那么Go应用程序的Prometheus仪器库是内置的。此SDK提供了Go运行时指标和进程指标。要将自定义指标添加到仪器后端插件,请参考“在您的插件中实现指标”。
流式处理
流式处理功能允许后端插件处理流式数据源查询。有关更多信息,请参考流式数据源插件的示例。
数据通信模型
Grafana使用通信模型,您可以选择加入实例管理以简化开发过程。如果您这样做,则每个请求到后端插件的所有必要信息(配置)将提供给插件,以使插件满足请求并返回响应。此模型简化了插件作者不必跟踪或请求其他状态以满足请求的过程。
缓存和连接池
Grafana 后端插件 SDK 提供实例管理功能,方便与多个已配置的 Grafana 数据源或应用程序(称为实例)进行交互。这使得插件可以轻松地在实例之间保持状态清晰分离。SDK 确保通过缓存在内存中表示的实例来优化插件资源,直到 Grafana 中的配置发生更改。请参阅 HTTP Backend plugin example or the App with backend example,,以了解如何使用数据源和应用程序插件的实例管理。
提到的实例状态特别适用于保留到下游服务器的客户端连接,例如 HTTP、gRPC、TCP、UDP 等,以启用对连接池的使用,优化对下游服务器的使用和连接重用。通过使用连接池,插件避免了使用机器上所有可用的 TCP 连接。
要查看支持连接池的插件示例,请参阅 HTTP 后端插件示例,该示例显示每个插件实例创建将在实例生命周期内重复使用的 HTTP 客户端,从而重用 HTTP 连接。