Important: This documentation is about an older version. It's relevant only to the release noted, many of the features and functions have been updated or replaced. Please view the current version.
Developer Guide
You can extend Grafana by writing your own plugins and then share them with other users in our plugin repository.
Short version
- Setup grafana
- Clone an example plugin into
/var/lib/grafana/plugins
ordata/plugins
(relative to grafana git repo if you’re running development version from source dir) - Use one of our example plugins as starting point
Example plugins
There are two blog posts about authoring a plugin that might also be of interest to any plugin authors.
- Timing is Everything. Writing the Clock Panel Plugin for Grafana
- Timing is Everything. Editor Mode in Grafana for the Clock Panel Plugin.
What languages?
Since everything turns into javascript it’s up to you to choose which language you want. That said it’s probably a good idea to choose es6 or typescript since we use es6 classes in Grafana. So it’s easier to get inspiration from the Grafana repo if you choose one of those languages.
Buildscript
You can use any build system you like that support systemjs. All the built content should end up in a folder named dist
and committed to the repository.
By committing the dist folder the person who installs your plugin does not have to run any buildscript.
All our example plugins have build scripted configured.
Keep your plugin up to date
New versions of Grafana can sometimes cause plugins to break. Checkout our PLUGIN_DEV.md doc for changes in Grafana that can impact your plugin.
Metadata
See the coding styleguide for details on the metadata.
module.(js|ts)
This is the entry point for every plugin. This is the place where you should export your plugin implementation. Depending on what kind of plugin you are developing you will be expected to export different things. You can find what’s expected for datasource, panels and apps plugins in the documentation.
The Grafana SDK is quite small so far and can be found here:
The SDK contains three different plugin classes: PanelCtrl, MetricsPanelCtrl and QueryCtrl. For plugins of the panel type, the module.js file should export one of these. There are some extra classes for data sources.
Example:
import {ClockCtrl} from './clock_ctrl';
export {
ClockCtrl as PanelCtrl
};
The module class is also where css for the dark and light themes is imported:
import {loadPluginCss} from 'app/plugins/sdk';
import WorldmapCtrl from './worldmap_ctrl';
loadPluginCss({
dark: 'plugins/grafana-worldmap-panel/css/worldmap.dark.css',
light: 'plugins/grafana-worldmap-panel/css/worldmap.light.css'
});
export {
WorldmapCtrl as PanelCtrl
};
Start developing your plugin
There are three ways that you can start developing a Grafana plugin.
- Setup a Grafana development environment. (described here) and place your plugin in the
data/plugins
folder. - Install Grafana and place your plugin in the plugins directory which is set in your config file. By default this is
/var/lib/grafana/plugins
on Linux systems. - Place your plugin directory anywhere you like and specify it grafana.ini.
We encourage people to setup the full Grafana environment so that you can get inspiration from the rest of grafana code base.
When Grafana starts it will scan the plugin folders and mount every folder that contains a plugin.json file unless the folder contains a subfolder named dist. In that case grafana will mount the dist folder instead. This makes it possible to have both built and src content in the same plugin git repo.
Grafana Events
There are a number of Grafana events that a plugin can hook into:
init-edit-mode
can be used to add tabs when editing a panelpanel-teardown
can be used for clean updata-received
is an event in that is triggered on data refresh and can be hooked intodata-snapshot-load
is an event triggered to load data when in snapshot mode.data-error
is used to handle errors on dashboard refresh.
If a panel receives data and hooks into the data-received
event then it should handle snapshot mode too. Otherwise the panel will not work if saved as a snapshot. Getting Plugins to work in Snapshot Mode describes how to add support for this.
Examples
We currently have three different examples that you can fork/download to get started developing your grafana plugin.
- simple-json-datasource (small datasource plugin for querying json data from backends)
- example-app
- clock-panel
- singlestat-panel
- piechart-panel