diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 7bca7e2f01f..e4c3dd91b79 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -62,6 +62,7 @@ pages: - ['reference/templating.md', 'Reference', 'Templating'] - ['reference/scripting.md', 'Reference', 'Scripting'] - ['reference/playlist.md', 'Reference', 'Playlist'] +- ['reference/plugins.md', 'Reference', 'Plugins'] - ['reference/export_import.md', 'Reference', 'Import & Export'] - ['reference/admin.md', 'Reference', 'Administration'] - ['reference/http_api.md', 'Reference', 'HTTP API'] diff --git a/docs/sources/reference/plugins.md b/docs/sources/reference/plugins.md new file mode 100644 index 00000000000..8ed4e30853d --- /dev/null +++ b/docs/sources/reference/plugins.md @@ -0,0 +1,50 @@ +--- +page_title: Plugin guide +page_description: Plugin guide for Grafana +page_keywords: grafana, plugins, documentation +--- + +# Plugins + +!Plugin support for panels is only available in nightly! + +Adding support for all datasources and suggested panels would bloat grafana and make it impossible to maintain. That's why we implemented a plugin system that makes it possible for anyone to develop support for a datasource or custom panel without adding it to Grafana itself. + +## Installing plugins + +Installing a plugin is very simple. Just download it and place it in the Grafana plugins folder and restart grafana. + +The default plugin folder is configurable under paths.plugins + +It's also possible to add one specific plugin by linking to its folder. + +``` +[plugin.mirror] +path = /home/evil-queen/datasource-plugin-mirror +``` + +## Plugin implementation ## + +Each plugin is defined in plugin.json file in the plugin folder. + +Instead of massive documentation about how it works we created a reference implementation of a plugin. +You can find each reference implementation further down on this page. + +## Datasource plugins + +Datasource have three responsibilities. + + * UI for configuring its settings + * Datasource object that can send queries, metricqueries and healthcheck the datasource + * Query editor within panels + +https://github.com/grafana/datasource-plugin-genericdatasource + +## Panel plugins + +Panel plugins are responsible for + + * UI for Panel options. + * Creating a directive that can render something based on datasource data. + +We currently dont have a reference implementation for panel plugins but you can checkout https://github.com/grafana/panel-plugin-piechart diff --git a/pkg/api/cloudwatch/cloudwatch.go b/pkg/api/cloudwatch/cloudwatch.go index 0995c88da4b..babcf9fddb0 100644 --- a/pkg/api/cloudwatch/cloudwatch.go +++ b/pkg/api/cloudwatch/cloudwatch.go @@ -43,18 +43,29 @@ func init() { } } -func handleGetMetricStatistics(req *cwRequest, c *middleware.Context) { +var awsCredentials map[string]*credentials.Credentials = make(map[string]*credentials.Credentials) + +func getCredentials(profile string) *credentials.Credentials { + if _, ok := awsCredentials[profile]; ok { + return awsCredentials[profile] + } + sess := session.New() creds := credentials.NewChainCredentials( []credentials.Provider{ &credentials.EnvProvider{}, - &credentials.SharedCredentialsProvider{Filename: "", Profile: req.DataSource.Database}, + &credentials.SharedCredentialsProvider{Filename: "", Profile: profile}, &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(sess), ExpiryWindow: 5 * time.Minute}, }) + awsCredentials[profile] = creds + return creds +} + +func handleGetMetricStatistics(req *cwRequest, c *middleware.Context) { cfg := &aws.Config{ Region: aws.String(req.Region), - Credentials: creds, + Credentials: getCredentials(req.DataSource.Database), } svc := cloudwatch.New(session.New(cfg), cfg) @@ -92,17 +103,9 @@ func handleGetMetricStatistics(req *cwRequest, c *middleware.Context) { } func handleListMetrics(req *cwRequest, c *middleware.Context) { - sess := session.New() - creds := credentials.NewChainCredentials( - []credentials.Provider{ - &credentials.EnvProvider{}, - &credentials.SharedCredentialsProvider{Filename: "", Profile: req.DataSource.Database}, - &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(sess), ExpiryWindow: 5 * time.Minute}, - }) - cfg := &aws.Config{ Region: aws.String(req.Region), - Credentials: creds, + Credentials: getCredentials(req.DataSource.Database), } svc := cloudwatch.New(session.New(cfg), cfg) @@ -140,17 +143,9 @@ func handleListMetrics(req *cwRequest, c *middleware.Context) { } func handleDescribeAlarmsForMetric(req *cwRequest, c *middleware.Context) { - sess := session.New() - creds := credentials.NewChainCredentials( - []credentials.Provider{ - &credentials.EnvProvider{}, - &credentials.SharedCredentialsProvider{Filename: "", Profile: req.DataSource.Database}, - &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(sess), ExpiryWindow: 5 * time.Minute}, - }) - cfg := &aws.Config{ Region: aws.String(req.Region), - Credentials: creds, + Credentials: getCredentials(req.DataSource.Database), } svc := cloudwatch.New(session.New(cfg), cfg) @@ -188,17 +183,9 @@ func handleDescribeAlarmsForMetric(req *cwRequest, c *middleware.Context) { } func handleDescribeAlarmHistory(req *cwRequest, c *middleware.Context) { - sess := session.New() - creds := credentials.NewChainCredentials( - []credentials.Provider{ - &credentials.EnvProvider{}, - &credentials.SharedCredentialsProvider{Filename: "", Profile: req.DataSource.Database}, - &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(sess), ExpiryWindow: 5 * time.Minute}, - }) - cfg := &aws.Config{ Region: aws.String(req.Region), - Credentials: creds, + Credentials: getCredentials(req.DataSource.Database), } svc := cloudwatch.New(session.New(cfg), cfg) @@ -232,17 +219,9 @@ func handleDescribeAlarmHistory(req *cwRequest, c *middleware.Context) { } func handleDescribeInstances(req *cwRequest, c *middleware.Context) { - sess := session.New() - creds := credentials.NewChainCredentials( - []credentials.Provider{ - &credentials.EnvProvider{}, - &credentials.SharedCredentialsProvider{Filename: "", Profile: req.DataSource.Database}, - &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(sess), ExpiryWindow: 5 * time.Minute}, - }) - cfg := &aws.Config{ Region: aws.String(req.Region), - Credentials: creds, + Credentials: getCredentials(req.DataSource.Database), } svc := ec2.New(session.New(cfg), cfg) diff --git a/public/app/features/annotations/partials/editor.html b/public/app/features/annotations/partials/editor.html index 851db4b4f01..0f244998c17 100644 --- a/public/app/features/annotations/partials/editor.html +++ b/public/app/features/annotations/partials/editor.html @@ -44,7 +44,7 @@
| - + {{annotation.name}} | diff --git a/public/app/partials/submenu.html b/public/app/partials/submenu.html index 2feec7edbca..485186696c3 100644 --- a/public/app/partials/submenu.html +++ b/public/app/partials/submenu.html @@ -13,7 +13,7 @@ |