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