add core plugins thru store (#43085)

This commit is contained in:
Will Browne
2021-12-14 15:22:40 +01:00
committed by GitHub
parent 5d18834deb
commit e4ba5f17dd
23 changed files with 139 additions and 95 deletions
+4 -3
View File
@@ -22,7 +22,7 @@ import (
const (
timeSeries = "time_series"
dsName = "grafana-azure-monitor-datasource"
pluginID = "grafana-azure-monitor-datasource"
)
var (
@@ -30,7 +30,7 @@ var (
legendKeyFormat = regexp.MustCompile(`\{\{\s*(.+?)\s*\}\}`)
)
func ProvideService(cfg *setting.Cfg, httpClientProvider *httpclient.Provider, registrar plugins.CoreBackendRegistrar) *Service {
func ProvideService(cfg *setting.Cfg, httpClientProvider *httpclient.Provider, pluginStore plugins.Store) *Service {
proxy := &httpServiceProxy{}
executors := map[string]azDatasourceExecutor{
azureMonitor: &AzureMonitorDatasource{proxy: proxy},
@@ -55,7 +55,8 @@ func ProvideService(cfg *setting.Cfg, httpClientProvider *httpclient.Provider, r
CallResourceHandler: httpadapter.New(resourceMux),
})
if err := registrar.LoadAndRegister(dsName, factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
azlog.Error("Failed to register plugin", "error", err)
}
+3 -2
View File
@@ -71,7 +71,7 @@ const (
perSeriesAlignerDefault string = "ALIGN_MEAN"
)
func ProvideService(cfg *setting.Cfg, httpClientProvider httpclient.Provider, registrar plugins.CoreBackendRegistrar,
func ProvideService(cfg *setting.Cfg, httpClientProvider httpclient.Provider, pluginStore plugins.Store,
dsService *datasources.Service) *Service {
s := &Service{
httpClientProvider: httpClientProvider,
@@ -88,7 +88,8 @@ func ProvideService(cfg *setting.Cfg, httpClientProvider httpclient.Provider, re
CheckHealthHandler: s,
})
if err := registrar.LoadAndRegister(pluginID, factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
slog.Error("Failed to register plugin", "error", err)
}
return s
+5 -2
View File
@@ -52,10 +52,12 @@ const defaultRegion = "default"
const logIdentifierInternal = "__log__grafana_internal__"
const logStreamIdentifierInternal = "__logstream__grafana_internal__"
const pluginID = "cloudwatch"
var plog = log.New("tsdb.cloudwatch")
var aliasFormat = regexp.MustCompile(`\{\{\s*(.+?)\s*\}\}`)
func ProvideService(cfg *setting.Cfg, logsService *LogsService, registrar plugins.CoreBackendRegistrar) (*CloudWatchService, error) {
func ProvideService(cfg *setting.Cfg, logsService *LogsService, pluginStore plugins.Store) (*CloudWatchService, error) {
plog.Debug("initing")
executor := newExecutor(logsService, datasource.NewInstanceManager(NewInstanceSettings()), cfg, awsds.NewSessionCache())
@@ -63,7 +65,8 @@ func ProvideService(cfg *setting.Cfg, logsService *LogsService, registrar plugin
QueryDataHandler: executor,
})
if err := registrar.LoadAndRegister("cloudwatch", factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
plog.Error("Failed to register plugin", "error", err)
return nil, err
}
+6 -2
View File
@@ -14,19 +14,22 @@ import (
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin/coreplugin"
"github.com/grafana/grafana/pkg/setting"
es "github.com/grafana/grafana/pkg/tsdb/elasticsearch/client"
"github.com/grafana/grafana/pkg/tsdb/intervalv2"
)
var eslog = log.New("tsdb.elasticsearch")
const pluginID = "elasticsearch"
type Service struct {
HTTPClientProvider httpclient.Provider
intervalCalculator intervalv2.Calculator
im instancemgmt.InstanceManager
}
func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.CoreBackendRegistrar) (*Service, error) {
func ProvideService(cfg *setting.Cfg, httpClientProvider httpclient.Provider, pluginStore plugins.Store) (*Service, error) {
eslog.Debug("initializing")
im := datasource.NewInstanceManager(newInstanceSettings())
@@ -36,7 +39,8 @@ func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.Co
QueryDataHandler: newService(im, s.HTTPClientProvider),
})
if err := registrar.LoadAndRegister("elasticsearch", factory); err != nil {
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory,
plugins.CoreDataSourcePathResolver(cfg, pluginID)); err != nil {
eslog.Error("Failed to register plugin", "error", err)
return nil, err
}
+9 -6
View File
@@ -32,6 +32,8 @@ const DatasourceID = -1
// Grafana DS command.
const DatasourceUID = "grafana"
const pluginID = "grafana"
// Make sure Service implements required interfaces.
// This is important to do since otherwise we will only get a
// not implemented error response from plugin at runtime.
@@ -41,13 +43,13 @@ var (
logger = log.New("tsdb.grafana")
)
func ProvideService(cfg *setting.Cfg, registrar plugins.CoreBackendRegistrar) *Service {
return newService(cfg.StaticRootPath, registrar)
func ProvideService(cfg *setting.Cfg, pluginStore plugins.Store) *Service {
return newService(cfg, pluginStore)
}
func newService(staticRootPath string, registrar plugins.CoreBackendRegistrar) *Service {
func newService(cfg *setting.Cfg, pluginStore plugins.Store) *Service {
s := &Service{
staticRootPath: staticRootPath,
staticRootPath: cfg.StaticRootPath,
roots: []string{
"testdata",
"img/icons",
@@ -57,10 +59,11 @@ func newService(staticRootPath string, registrar plugins.CoreBackendRegistrar) *
},
}
if err := registrar.LoadAndRegister("grafana", coreplugin.New(backend.ServeOpts{
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, coreplugin.New(backend.ServeOpts{
CheckHealthHandler: s,
QueryDataHandler: s,
})); err != nil {
}), resolver); err != nil {
logger.Error("Failed to register plugin", "error", err)
return nil
}
+7 -5
View File
@@ -1,12 +1,14 @@
package grafanads
import (
"context"
"encoding/json"
"path"
"testing"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/experimental"
@@ -19,7 +21,7 @@ func asJSON(v interface{}) json.RawMessage {
}
func TestReadFolderListing(t *testing.T) {
ds := newService("../../../public", &fakeBackendPM{})
ds := newService(&setting.Cfg{StaticRootPath: "../../../public"}, &fakePluginStore{})
dr := ds.doListQuery(backend.DataQuery{
QueryType: "x",
JSON: asJSON(listQueryModel{
@@ -31,7 +33,7 @@ func TestReadFolderListing(t *testing.T) {
}
func TestReadCSVFile(t *testing.T) {
ds := newService("../../../public", &fakeBackendPM{})
ds := newService(&setting.Cfg{StaticRootPath: "../../../public"}, &fakePluginStore{})
dr := ds.doReadQuery(backend.DataQuery{
QueryType: "x",
JSON: asJSON(readQueryModel{
@@ -42,10 +44,10 @@ func TestReadCSVFile(t *testing.T) {
require.NoError(t, err)
}
type fakeBackendPM struct {
plugins.CoreBackendRegistrar
type fakePluginStore struct {
plugins.Store
}
func (pm *fakeBackendPM) LoadAndRegister(pluginID string, factory backendplugin.PluginFactoryFunc) error {
func (ps *fakePluginStore) AddWithFactory(_ context.Context, _ string, _ backendplugin.PluginFactoryFunc, _ plugins.PluginPathResolver) error {
return nil
}
+4 -2
View File
@@ -37,11 +37,12 @@ type Service struct {
}
const (
pluginID = "graphite"
TargetFullModelField = "targetFull"
TargetModelField = "target"
)
func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.CoreBackendRegistrar) (*Service, error) {
func ProvideService(cfg *setting.Cfg, httpClientProvider httpclient.Provider, pluginStore plugins.Store) (*Service, error) {
s := &Service{
logger: log.New("tsdb.graphite"),
im: datasource.NewInstanceManager(newInstanceSettings(httpClientProvider)),
@@ -51,7 +52,8 @@ func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.Co
QueryDataHandler: s,
})
if err := registrar.LoadAndRegister("graphite", factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
s.logger.Error("Failed to register plugin", "error", err)
return nil, err
}
+5 -2
View File
@@ -22,6 +22,8 @@ import (
"github.com/grafana/grafana/pkg/tsdb/influxdb/models"
)
const pluginID = "influxdb"
type Service struct {
QueryParser *InfluxdbQueryParser
ResponseParser *ResponseParser
@@ -32,7 +34,7 @@ type Service struct {
var ErrInvalidHttpMode = errors.New("'httpMode' should be either 'GET' or 'POST'")
func ProvideService(httpClient httpclient.Provider, registrar plugins.CoreBackendRegistrar) (*Service, error) {
func ProvideService(cfg *setting.Cfg, httpClient httpclient.Provider, pluginStore plugins.Store) (*Service, error) {
im := datasource.NewInstanceManager(newInstanceSettings(httpClient))
s := &Service{
QueryParser: &InfluxdbQueryParser{},
@@ -45,7 +47,8 @@ func ProvideService(httpClient httpclient.Provider, registrar plugins.CoreBacken
QueryDataHandler: s,
})
if err := registrar.LoadAndRegister("influxdb", factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
s.glog.Error("Failed to register plugin", "error", err)
return nil, err
}
+6 -2
View File
@@ -18,6 +18,7 @@ import (
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin/coreplugin"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/loki/pkg/logcli/client"
"github.com/grafana/loki/pkg/loghttp"
"github.com/grafana/loki/pkg/logproto"
@@ -27,12 +28,14 @@ import (
"github.com/prometheus/common/model"
)
const pluginID = "loki"
type Service struct {
im instancemgmt.InstanceManager
plog log.Logger
}
func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.CoreBackendRegistrar) (*Service, error) {
func ProvideService(cfg *setting.Cfg, httpClientProvider httpclient.Provider, pluginStore plugins.Store) (*Service, error) {
im := datasource.NewInstanceManager(newInstanceSettings(httpClientProvider))
s := &Service{
im: im,
@@ -43,7 +46,8 @@ func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.Co
QueryDataHandler: s,
})
if err := registrar.LoadAndRegister("loki", factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
s.plog.Error("Failed to register plugin", "error", err)
return nil, err
}
+5 -2
View File
@@ -26,11 +26,13 @@ import (
var logger = log.New("tsdb.mssql")
const pluginID = "mssql"
type Service struct {
im instancemgmt.InstanceManager
}
func ProvideService(cfg *setting.Cfg, registrar plugins.CoreBackendRegistrar) (*Service, error) {
func ProvideService(cfg *setting.Cfg, pluginStore plugins.Store) (*Service, error) {
s := &Service{
im: datasource.NewInstanceManager(newInstanceSettings(cfg)),
}
@@ -38,7 +40,8 @@ func ProvideService(cfg *setting.Cfg, registrar plugins.CoreBackendRegistrar) (*
QueryDataHandler: s,
})
if err := registrar.LoadAndRegister("mssql", factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
logger.Error("Failed to register plugin", "error", err)
}
return s, nil
+4 -2
View File
@@ -27,6 +27,7 @@ import (
)
const (
pluginID = "mysql"
dateFormat = "2006-01-02"
dateTimeFormat1 = "2006-01-02 15:04:05"
dateTimeFormat2 = "2006-01-02T15:04:05Z"
@@ -43,7 +44,7 @@ func characterEscape(s string, escapeChar string) string {
return strings.ReplaceAll(s, escapeChar, url.QueryEscape(escapeChar))
}
func ProvideService(cfg *setting.Cfg, registrar plugins.CoreBackendRegistrar, httpClientProvider httpclient.Provider) (*Service, error) {
func ProvideService(cfg *setting.Cfg, pluginStore plugins.Store, httpClientProvider httpclient.Provider) (*Service, error) {
s := &Service{
im: datasource.NewInstanceManager(newInstanceSettings(cfg, httpClientProvider)),
}
@@ -51,7 +52,8 @@ func ProvideService(cfg *setting.Cfg, registrar plugins.CoreBackendRegistrar, ht
QueryDataHandler: s,
})
if err := registrar.LoadAndRegister("mysql", factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
logger.Error("Failed to register plugin", "error", err)
}
return s, nil
+5 -2
View File
@@ -25,12 +25,14 @@ import (
"golang.org/x/net/context/ctxhttp"
)
const pluginID = "opentsdb"
type Service struct {
logger log.Logger
im instancemgmt.InstanceManager
}
func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.CoreBackendRegistrar) (*Service, error) {
func ProvideService(cfg *setting.Cfg, httpClientProvider httpclient.Provider, pluginStore plugins.Store) (*Service, error) {
im := datasource.NewInstanceManager(newInstanceSettings(httpClientProvider))
s := &Service{
logger: log.New("tsdb.opentsdb"),
@@ -40,7 +42,8 @@ func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.Co
factory := coreplugin.New(backend.ServeOpts{
QueryDataHandler: s,
})
if err := registrar.LoadAndRegister("opentsdb", factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
return nil, err
}
+5 -2
View File
@@ -23,7 +23,9 @@ import (
var logger = log.New("tsdb.postgres")
func ProvideService(cfg *setting.Cfg, registrar plugins.CoreBackendRegistrar) (*Service, error) {
const pluginID = "postgres"
func ProvideService(cfg *setting.Cfg, pluginStore plugins.Store) (*Service, error) {
s := &Service{
tlsManager: newTLSManager(logger, cfg.DataPath),
}
@@ -32,7 +34,8 @@ func ProvideService(cfg *setting.Cfg, registrar plugins.CoreBackendRegistrar) (*
QueryDataHandler: s,
})
if err := registrar.LoadAndRegister("postgres", factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
logger.Error("Failed to register plugin", "error", err)
}
return s, nil
+6 -2
View File
@@ -15,6 +15,7 @@ import (
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin/coreplugin"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/pkg/tsdb/intervalv2"
"github.com/prometheus/client_golang/api"
apiv1 "github.com/prometheus/client_golang/api/prometheus/v1"
@@ -26,12 +27,14 @@ var (
safeRes = 11000
)
const pluginID = "prometheus"
type Service struct {
intervalCalculator intervalv2.Calculator
im instancemgmt.InstanceManager
}
func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.CoreBackendRegistrar) (*Service, error) {
func ProvideService(cfg *setting.Cfg, httpClientProvider httpclient.Provider, pluginStore plugins.Store) (*Service, error) {
plog.Debug("initializing")
im := datasource.NewInstanceManager(newInstanceSettings(httpClientProvider))
@@ -43,7 +46,8 @@ func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.Co
factory := coreplugin.New(backend.ServeOpts{
QueryDataHandler: s,
})
if err := registrar.LoadAndRegister("prometheus", factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
plog.Error("Failed to register plugin", "error", err)
return nil, err
}
+6 -2
View File
@@ -15,15 +15,18 @@ import (
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/backendplugin/coreplugin"
"github.com/grafana/grafana/pkg/setting"
"go.opentelemetry.io/collector/model/otlp"
)
const pluginID = "tempo"
type Service struct {
im instancemgmt.InstanceManager
tlog log.Logger
}
func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.CoreBackendRegistrar) (*Service, error) {
func ProvideService(cfg *setting.Cfg, httpClientProvider httpclient.Provider, pluginStore plugins.Store) (*Service, error) {
im := datasource.NewInstanceManager(newInstanceSettings(httpClientProvider))
s := &Service{
@@ -35,7 +38,8 @@ func ProvideService(httpClientProvider httpclient.Provider, registrar plugins.Co
QueryDataHandler: s,
})
if err := registrar.LoadAndRegister("tempo", factory); err != nil {
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
if err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver); err != nil {
s.tlog.Error("Failed to register plugin", "error", err)
return nil, err
}
+6 -2
View File
@@ -1,6 +1,7 @@
package testdatasource
import (
"context"
"net/http"
"time"
@@ -14,7 +15,9 @@ import (
"github.com/grafana/grafana/pkg/setting"
)
func ProvideService(cfg *setting.Cfg, registrar plugins.CoreBackendRegistrar) (*Service, error) {
const pluginID = "testdata"
func ProvideService(cfg *setting.Cfg, pluginStore plugins.Store) (*Service, error) {
s := &Service{
queryMux: datasource.NewQueryTypeMux(),
scenarios: map[string]*Scenario{},
@@ -43,7 +46,8 @@ func ProvideService(cfg *setting.Cfg, registrar plugins.CoreBackendRegistrar) (*
CallResourceHandler: httpadapter.New(rMux),
StreamHandler: s,
})
err := registrar.LoadAndRegister("testdata", factory)
resolver := plugins.CoreDataSourcePathResolver(cfg, pluginID)
err := pluginStore.AddWithFactory(context.Background(), pluginID, factory, resolver)
if err != nil {
return nil, err
}