Skip to main content

Plugin architecture

Grafana’s plugin system enables extending Grafana with new visualizations, data sources, and applications without modifying core code.

Plugin types

Grafana supports three main plugin types:

Panel plugins

Visualization types that display data:
  • Graph, table, stat, gauge, etc.
  • Render query results
  • Custom visualization logic
  • Editor UI for configuration

Data source plugins

Connect Grafana to data sources:
  • Query editors
  • Backend query execution
  • Authentication and connection management
  • Alerting support (optional)

App plugins

Full applications within Grafana:
  • Custom pages and navigation
  • Can include multiple panels and data sources
  • Configuration pages
  • Custom workflows

Plugin structure

A typical plugin directory:

Plugin metadata (plugin.json)

The plugin.json file defines plugin metadata:
Key fields:
  • type - Plugin type: panel, datasource, or app
  • id - Unique plugin identifier (format: org-name-type)
  • backend - Whether plugin has a backend component
  • executable - Backend binary name
  • routes - Custom API routes
  • dependencies - Required Grafana version and other plugins

Frontend plugin architecture

Panel plugin example

Data source plugin example

App plugin example

Backend plugin architecture

Backend plugins run as separate processes and communicate with Grafana via gRPC.

Backend structure

From pkg/plugins/plugins.go:

Backend plugin implementation

Backend plugin handlers

QueryData handler

Execute data queries:

CallResource handler

Custom API endpoints:

CheckHealth handler

Health checks:

Stream handler

Streaming data:

Plugin communication

Frontend to backend

Frontend plugins communicate with their backends through the Grafana backend:
The DataSourceWithBackend class handles:
  • Query routing to backend
  • Resource calls
  • Health checks
  • Authentication

Backend to external services

Backend plugins can make external API calls:

Plugin discovery and loading

Plugins are discovered and loaded through a pipeline in pkg/plugins/manager/pipeline/:

Discovery

  1. Scan plugin directories:
    • Core plugins: public/app/plugins/
    • External plugins: <data>/plugins/
  2. Read plugin.json from each directory
  3. Validate plugin structure

Validation

From pkg/plugins/manager/pipeline/validation/:

Initialization

From pkg/plugins/manager/pipeline/initialization/:
  1. Load plugin metadata
  2. Start backend process (if backend: true)
  3. Establish gRPC connection
  4. Register with plugin registry

Registration

Plugin signing

External plugins must be signed:
  1. Private signature - For internal use
  2. Community signature - For community plugins
  3. Commercial signature - For commercial plugins
Unsigned plugins require:

Plugin development workflow

Create plugin

Build plugin

Development mode

Test plugin

Plugin examples in Grafana

Built-in panel plugins

Located in public/app/plugins/panel/:
  • timeseries/ - Time series graph
  • table/ - Table visualization
  • stat/ - Single stat display
  • gauge/ - Gauge visualization

Built-in data source plugins

Located in pkg/tsdb/ (backend) and public/app/plugins/datasource/ (frontend):
Example: pkg/tsdb/prometheus/:

Plugin extensions

Plugins can extend Grafana UI:
Implement in plugin:

Key patterns summary

  • Frontend plugins - React components with Grafana SDK
  • Backend plugins - Go processes with gRPC communication
  • Plugin.json - Metadata and configuration
  • Discovery pipeline - Automatic plugin loading
  • Signature validation - Security through signing
  • Extensions - UI extensibility points
  • Resource handlers - Custom API endpoints