mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Migrate to Wire for dependency injection (#32289)
Fixes #30144 Co-authored-by: dsotirakis <sotirakis.dim@gmail.com> Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com> Co-authored-by: Ida Furjesova <ida.furjesova@grafana.com> Co-authored-by: Jack Westbrook <jack.westbrook@gmail.com> Co-authored-by: Will Browne <wbrowne@users.noreply.github.com> Co-authored-by: Leon Sorokin <leeoniya@gmail.com> Co-authored-by: Andrej Ocenas <mr.ocenas@gmail.com> Co-authored-by: spinillos <selenepinillos@gmail.com> Co-authored-by: Karl Persson <kalle.persson@grafana.com> Co-authored-by: Leonard Gram <leo@xlson.com>
This commit is contained in:
@@ -12,12 +12,8 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
glog log.Logger
|
||||
)
|
||||
|
||||
func init() {
|
||||
glog = log.New("tsdb.influx_flux")
|
||||
}
|
||||
)
|
||||
|
||||
// Query builds flux queries, executes them, and returns the results.
|
||||
func Query(ctx context.Context, dsInfo *models.DatasourceInfo, tsdbQuery backend.QueryDataRequest) (
|
||||
|
||||
@@ -11,58 +11,47 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt"
|
||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||
"github.com/grafana/grafana/pkg/infra/httpclient"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/plugins/backendplugin"
|
||||
"github.com/grafana/grafana/pkg/plugins/backendplugin/coreplugin"
|
||||
"github.com/grafana/grafana/pkg/registry"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
"github.com/grafana/grafana/pkg/tsdb/influxdb/flux"
|
||||
"github.com/grafana/grafana/pkg/tsdb/influxdb/models"
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend/datasource"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
HTTPClientProvider httpclient.Provider `inject:""`
|
||||
BackendPluginManager backendplugin.Manager `inject:""`
|
||||
QueryParser *InfluxdbQueryParser
|
||||
ResponseParser *ResponseParser
|
||||
QueryParser *InfluxdbQueryParser
|
||||
ResponseParser *ResponseParser
|
||||
glog log.Logger
|
||||
|
||||
im instancemgmt.InstanceManager
|
||||
}
|
||||
|
||||
var (
|
||||
glog log.Logger
|
||||
)
|
||||
var ErrInvalidHttpMode = errors.New("'httpMode' should be either 'GET' or 'POST'")
|
||||
|
||||
var ErrInvalidHttpMode error = errors.New("'httpMode' should be either 'GET' or 'POST'")
|
||||
|
||||
func init() {
|
||||
registry.Register(®istry.Descriptor{
|
||||
Name: "InfluxDBService",
|
||||
InitPriority: registry.Low,
|
||||
Instance: &Service{},
|
||||
})
|
||||
}
|
||||
|
||||
func (s *Service) Init() error {
|
||||
glog = log.New("tsdb.influxdb")
|
||||
s.QueryParser = &InfluxdbQueryParser{}
|
||||
s.ResponseParser = &ResponseParser{}
|
||||
s.im = datasource.NewInstanceManager(newInstanceSettings(s.HTTPClientProvider))
|
||||
func ProvideService(httpClient httpclient.Provider, backendPluginManager backendplugin.Manager) (*Service, error) {
|
||||
im := datasource.NewInstanceManager(newInstanceSettings(httpClient))
|
||||
s := &Service{
|
||||
QueryParser: &InfluxdbQueryParser{},
|
||||
ResponseParser: &ResponseParser{},
|
||||
glog: log.New("tsdb.influxdb"),
|
||||
im: im,
|
||||
}
|
||||
|
||||
factory := coreplugin.New(backend.ServeOpts{
|
||||
QueryDataHandler: s,
|
||||
})
|
||||
|
||||
if err := s.BackendPluginManager.Register("influxdb", factory); err != nil {
|
||||
glog.Error("Failed to register plugin", "error", err)
|
||||
if err := backendPluginManager.Register("influxdb", factory); err != nil {
|
||||
s.glog.Error("Failed to register plugin", "error", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nil
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.InstanceFactoryFunc {
|
||||
@@ -107,7 +96,7 @@ func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.Inst
|
||||
}
|
||||
|
||||
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
||||
glog.Debug("Received a query request", "numQueries", len(req.Queries))
|
||||
s.glog.Debug("Received a query request", "numQueries", len(req.Queries))
|
||||
|
||||
dsInfo, err := s.getDSInfo(req.PluginContext)
|
||||
if err != nil {
|
||||
@@ -118,7 +107,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
|
||||
return flux.Query(ctx, dsInfo, *req)
|
||||
}
|
||||
|
||||
glog.Debug("Making a non-Flux type query")
|
||||
s.glog.Debug("Making a non-Flux type query")
|
||||
|
||||
// NOTE: the following path is currently only called from alerting queries
|
||||
// In dashboards, the request runs through proxy and are managed in the frontend
|
||||
@@ -134,7 +123,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
|
||||
}
|
||||
|
||||
if setting.Env == setting.Dev {
|
||||
glog.Debug("Influxdb query", "raw query", rawQuery)
|
||||
s.glog.Debug("Influxdb query", "raw query", rawQuery)
|
||||
}
|
||||
|
||||
request, err := s.createRequest(ctx, dsInfo, rawQuery)
|
||||
@@ -148,7 +137,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
|
||||
}
|
||||
defer func() {
|
||||
if err := res.Body.Close(); err != nil {
|
||||
glog.Warn("Failed to close response body", "err", err)
|
||||
s.glog.Warn("Failed to close response body", "err", err)
|
||||
}
|
||||
}()
|
||||
if res.StatusCode/100 != 2 {
|
||||
@@ -216,7 +205,7 @@ func (s *Service) createRequest(ctx context.Context, dsInfo *models.DatasourceIn
|
||||
|
||||
req.URL.RawQuery = params.Encode()
|
||||
|
||||
glog.Debug("Influxdb request", "url", req.URL.String())
|
||||
s.glog.Debug("Influxdb request", "url", req.URL.String())
|
||||
return req, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -22,10 +22,10 @@ func TestExecutor_createRequest(t *testing.T) {
|
||||
s := &Service{
|
||||
QueryParser: &InfluxdbQueryParser{},
|
||||
ResponseParser: &ResponseParser{},
|
||||
glog: log.New("test"),
|
||||
}
|
||||
|
||||
t.Run("createRequest with GET httpMode", func(t *testing.T) {
|
||||
glog = log.New("test")
|
||||
req, err := s.createRequest(context.Background(), datasource, query)
|
||||
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -16,12 +16,8 @@ import (
|
||||
type ResponseParser struct{}
|
||||
|
||||
var (
|
||||
legendFormat *regexp.Regexp
|
||||
)
|
||||
|
||||
func init() {
|
||||
legendFormat = regexp.MustCompile(`\[\[([\@\/\w-]+)(\.[\@\/\w-]+)*\]\]*|\$\s*([\@\/\w-]+?)*`)
|
||||
}
|
||||
)
|
||||
|
||||
func (rp *ResponseParser) Parse(buf io.ReadCloser, query *Query) *backend.QueryDataResponse {
|
||||
resp := backend.NewQueryDataResponse()
|
||||
|
||||
Reference in New Issue
Block a user