Plugins: Bump Plugin SDK version and address instance management breaking changes (#68900)

* bump sdk and propagate ctx

* fix tests
pull/68955/head
Will Browne 2 years ago committed by GitHub
parent 7e816d010c
commit 286b9e08e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      go.mod
  2. 2
      go.sum
  3. 2
      pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go
  4. 12
      pkg/tsdb/azuremonitor/azuremonitor.go
  5. 4
      pkg/tsdb/azuremonitor/azuremonitor_test.go
  6. 8
      pkg/tsdb/cloud-monitoring/cloudmonitoring.go
  7. 2
      pkg/tsdb/cloud-monitoring/resource_handler.go
  8. 4
      pkg/tsdb/cloud-monitoring/resource_handler_test.go
  9. 5
      pkg/tsdb/cloudwatch/annotation_query.go
  10. 44
      pkg/tsdb/cloudwatch/cloudwatch.go
  11. 4
      pkg/tsdb/cloudwatch/log_actions.go
  12. 4
      pkg/tsdb/cloudwatch/log_sync_query.go
  13. 27
      pkg/tsdb/cloudwatch/metric_find_query.go
  14. 7
      pkg/tsdb/cloudwatch/metric_find_query_test.go
  15. 5
      pkg/tsdb/cloudwatch/models/api.go
  16. 5
      pkg/tsdb/cloudwatch/resource_handler.go
  17. 9
      pkg/tsdb/cloudwatch/routes/accounts.go
  18. 7
      pkg/tsdb/cloudwatch/routes/accounts_test.go
  19. 9
      pkg/tsdb/cloudwatch/routes/dimension_keys.go
  20. 5
      pkg/tsdb/cloudwatch/routes/dimension_keys_test.go
  21. 5
      pkg/tsdb/cloudwatch/routes/dimension_values.go
  22. 5
      pkg/tsdb/cloudwatch/routes/dimension_values_test.go
  23. 5
      pkg/tsdb/cloudwatch/routes/log_group_fields.go
  24. 7
      pkg/tsdb/cloudwatch/routes/log_group_fields_test.go
  25. 9
      pkg/tsdb/cloudwatch/routes/log_groups.go
  26. 23
      pkg/tsdb/cloudwatch/routes/log_groups_test.go
  27. 5
      pkg/tsdb/cloudwatch/routes/metrics.go
  28. 5
      pkg/tsdb/cloudwatch/routes/metrics_test.go
  29. 2
      pkg/tsdb/cloudwatch/routes/middleware.go
  30. 7
      pkg/tsdb/cloudwatch/routes/middleware_test.go
  31. 5
      pkg/tsdb/cloudwatch/routes/namespaces.go
  32. 3
      pkg/tsdb/cloudwatch/routes/namespaces_test.go
  33. 4
      pkg/tsdb/cloudwatch/time_series_query.go
  34. 8
      pkg/tsdb/elasticsearch/elasticsearch.go
  35. 6
      pkg/tsdb/graphite/graphite.go
  36. 4
      pkg/tsdb/graphite/graphite_test.go
  37. 2
      pkg/tsdb/influxdb/healthcheck.go
  38. 6
      pkg/tsdb/influxdb/influxdb.go
  39. 5
      pkg/tsdb/influxdb/mocks_test.go
  40. 8
      pkg/tsdb/loki/loki.go
  41. 6
      pkg/tsdb/loki/streaming.go
  42. 8
      pkg/tsdb/mssql/mssql.go
  43. 8
      pkg/tsdb/mysql/mysql.go
  44. 6
      pkg/tsdb/opentsdb/opentsdb.go
  45. 10
      pkg/tsdb/parca/service.go
  46. 16
      pkg/tsdb/phlare/service.go
  47. 8
      pkg/tsdb/postgres/postgres.go
  48. 2
      pkg/tsdb/prometheus/healthcheck.go
  49. 8
      pkg/tsdb/prometheus/prometheus.go
  50. 6
      pkg/tsdb/tempo/tempo.go

@ -61,7 +61,7 @@ require (
github.com/grafana/alerting v0.0.0-20230428095912-33c5aa68a5ba github.com/grafana/alerting v0.0.0-20230428095912-33c5aa68a5ba
github.com/grafana/grafana-aws-sdk v0.15.0 github.com/grafana/grafana-aws-sdk v0.15.0
github.com/grafana/grafana-azure-sdk-go v1.7.0 github.com/grafana/grafana-azure-sdk-go v1.7.0
github.com/grafana/grafana-plugin-sdk-go v0.160.0 github.com/grafana/grafana-plugin-sdk-go v0.162.0
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0
github.com/hashicorp/go-hclog v1.5.0 github.com/hashicorp/go-hclog v1.5.0
github.com/hashicorp/go-plugin v1.4.9 github.com/hashicorp/go-plugin v1.4.9

@ -1067,6 +1067,8 @@ github.com/grafana/grafana-plugin-sdk-go v0.94.0/go.mod h1:3VXz4nCv6wH5SfgB3mlW3
github.com/grafana/grafana-plugin-sdk-go v0.114.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk= github.com/grafana/grafana-plugin-sdk-go v0.114.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk=
github.com/grafana/grafana-plugin-sdk-go v0.160.0 h1:jELbsqee5kRz9vD1hZeP8+984xMZDU/M6uGv0RhOR34= github.com/grafana/grafana-plugin-sdk-go v0.160.0 h1:jELbsqee5kRz9vD1hZeP8+984xMZDU/M6uGv0RhOR34=
github.com/grafana/grafana-plugin-sdk-go v0.160.0/go.mod h1:dPhljkVno3Bg/ZYafMrR/BfYjtCRJD2hU2719Nl3QzM= github.com/grafana/grafana-plugin-sdk-go v0.160.0/go.mod h1:dPhljkVno3Bg/ZYafMrR/BfYjtCRJD2hU2719Nl3QzM=
github.com/grafana/grafana-plugin-sdk-go v0.162.0 h1:ij2ARWohf0IoK9yCVC1Wup4Gp6zwBq2AueVXRYsv/to=
github.com/grafana/grafana-plugin-sdk-go v0.162.0/go.mod h1:dPhljkVno3Bg/ZYafMrR/BfYjtCRJD2hU2719Nl3QzM=
github.com/grafana/kindsys v0.0.0-20230323180930-c2a9ced5c751 h1:X5jwaMcpUMQ+xv7fKhs9U+oBxfo2x+x8GpHWybDSgk0= github.com/grafana/kindsys v0.0.0-20230323180930-c2a9ced5c751 h1:X5jwaMcpUMQ+xv7fKhs9U+oBxfo2x+x8GpHWybDSgk0=
github.com/grafana/kindsys v0.0.0-20230323180930-c2a9ced5c751/go.mod h1:213a3clTiegHfheYcLPLeEyHv/azK/fAF67OEbzuLzw= github.com/grafana/kindsys v0.0.0-20230323180930-c2a9ced5c751/go.mod h1:213a3clTiegHfheYcLPLeEyHv/azK/fAF67OEbzuLzw=
github.com/grafana/kindsys v0.0.0-20230427152021-bb328815be7a h1:i2YhC6eTyDp+7Ftv5c6VZDUQskmKX4oIPGf38qfiZiU= github.com/grafana/kindsys v0.0.0-20230427152021-bb328815be7a h1:i2YhC6eTyDp+7Ftv5c6VZDUQskmKX4oIPGf38qfiZiU=

@ -69,7 +69,7 @@ func (s *httpServiceProxy) Do(rw http.ResponseWriter, req *http.Request, cli *ht
func (s *Service) getDataSourceFromHTTPReq(req *http.Request) (types.DatasourceInfo, error) { func (s *Service) getDataSourceFromHTTPReq(req *http.Request) (types.DatasourceInfo, error) {
ctx := req.Context() ctx := req.Context()
pluginContext := httpadapter.PluginConfigFromContext(ctx) pluginContext := httpadapter.PluginConfigFromContext(ctx)
i, err := s.im.Get(pluginContext) i, err := s.im.Get(ctx, pluginContext)
if err != nil { if err != nil {
return types.DatasourceInfo{}, err return types.DatasourceInfo{}, err
} }

@ -162,8 +162,8 @@ type azDatasourceExecutor interface {
ResourceRequest(rw http.ResponseWriter, req *http.Request, cli *http.Client) ResourceRequest(rw http.ResponseWriter, req *http.Request, cli *http.Client)
} }
func (s *Service) getDataSourceFromPluginReq(req *backend.QueryDataRequest) (types.DatasourceInfo, error) { func (s *Service) getDataSourceFromPluginReq(ctx context.Context, req *backend.QueryDataRequest) (types.DatasourceInfo, error) {
i, err := s.im.Get(req.PluginContext) i, err := s.im.Get(ctx, req.PluginContext)
if err != nil { if err != nil {
return types.DatasourceInfo{}, err return types.DatasourceInfo{}, err
} }
@ -185,7 +185,7 @@ func (s *Service) newQueryMux() *datasource.QueryTypeMux {
dst := dsType dst := dsType
mux.HandleFunc(dsType, func(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { mux.HandleFunc(dsType, func(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
executor := s.executors[dst] executor := s.executors[dst]
dsInfo, err := s.getDataSourceFromPluginReq(req) dsInfo, err := s.getDataSourceFromPluginReq(ctx, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -199,8 +199,8 @@ func (s *Service) newQueryMux() *datasource.QueryTypeMux {
return mux return mux
} }
func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (types.DatasourceInfo, error) { func (s *Service) getDSInfo(ctx context.Context, pluginCtx backend.PluginContext) (types.DatasourceInfo, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return types.DatasourceInfo{}, err return types.DatasourceInfo{}, err
} }
@ -321,7 +321,7 @@ func parseSubscriptions(res *http.Response) ([]string, error) {
} }
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return &backend.CheckHealthResult{ return &backend.CheckHealthResult{
Status: backend.HealthStatusError, Status: backend.HealthStatusError,

@ -113,7 +113,7 @@ type fakeInstance struct {
settings types.AzureMonitorSettings settings types.AzureMonitorSettings
} }
func (f *fakeInstance) Get(pluginContext backend.PluginContext) (instancemgmt.Instance, error) { func (f *fakeInstance) Get(_ context.Context, _ backend.PluginContext) (instancemgmt.Instance, error) {
return types.DatasourceInfo{ return types.DatasourceInfo{
Cloud: f.cloud, Cloud: f.cloud,
Routes: f.routes, Routes: f.routes,
@ -122,7 +122,7 @@ func (f *fakeInstance) Get(pluginContext backend.PluginContext) (instancemgmt.In
}, nil }, nil
} }
func (f *fakeInstance) Do(pluginContext backend.PluginContext, fn instancemgmt.InstanceCallbackFunc) error { func (f *fakeInstance) Do(_ context.Context, _ backend.PluginContext, _ instancemgmt.InstanceCallbackFunc) error {
return nil return nil
} }

@ -82,7 +82,7 @@ func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceReq
} }
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -336,7 +336,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
return nil, err return nil, err
} }
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -637,8 +637,8 @@ func addConfigData(frames data.Frames, dl string, unit string, period string) da
return frames return frames
} }
func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (*datasourceInfo, error) { func (s *Service) getDSInfo(ctx context.Context, pluginCtx backend.PluginContext) (*datasourceInfo, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -397,7 +397,7 @@ func writeResponse(rw http.ResponseWriter, code int, msg string) {
func (s *Service) getDataSourceFromHTTPReq(req *http.Request) (*datasourceInfo, error) { func (s *Service) getDataSourceFromHTTPReq(req *http.Request) (*datasourceInfo, error) {
ctx := req.Context() ctx := req.Context()
pluginContext := httpadapter.PluginConfigFromContext(ctx) pluginContext := httpadapter.PluginConfigFromContext(ctx)
i, err := s.im.Get(pluginContext) i, err := s.im.Get(ctx, pluginContext)
if err != nil { if err != nil {
return nil, nil return nil, nil
} }

@ -95,13 +95,13 @@ type fakeInstance struct {
services map[string]datasourceService services map[string]datasourceService
} }
func (f *fakeInstance) Get(pluginContext backend.PluginContext) (instancemgmt.Instance, error) { func (f *fakeInstance) Get(_ context.Context, _ backend.PluginContext) (instancemgmt.Instance, error) {
return &datasourceInfo{ return &datasourceInfo{
services: f.services, services: f.services,
}, nil }, nil
} }
func (f *fakeInstance) Do(pluginContext backend.PluginContext, fn instancemgmt.InstanceCallbackFunc) error { func (f *fakeInstance) Do(_ context.Context, _ backend.PluginContext, _ instancemgmt.InstanceCallbackFunc) error {
return nil return nil
} }

@ -1,6 +1,7 @@
package cloudwatch package cloudwatch
import ( import (
"context"
"errors" "errors"
"fmt" "fmt"
"strconv" "strconv"
@ -19,7 +20,7 @@ type annotationEvent struct {
Text string Text string
} }
func (e *cloudWatchExecutor) executeAnnotationQuery(pluginCtx backend.PluginContext, model DataQueryJson, query backend.DataQuery) (*backend.QueryDataResponse, error) { func (e *cloudWatchExecutor) executeAnnotationQuery(ctx context.Context, pluginCtx backend.PluginContext, model DataQueryJson, query backend.DataQuery) (*backend.QueryDataResponse, error) {
result := backend.NewQueryDataResponse() result := backend.NewQueryDataResponse()
statistic := "" statistic := ""
@ -48,7 +49,7 @@ func (e *cloudWatchExecutor) executeAnnotationQuery(pluginCtx backend.PluginCont
actionPrefix := model.ActionPrefix actionPrefix := model.ActionPrefix
alarmNamePrefix := model.AlarmNamePrefix alarmNamePrefix := model.AlarmNamePrefix
cli, err := e.getCWClient(pluginCtx, model.Region) cli, err := e.getCWClient(ctx, pluginCtx, model.Region)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -118,9 +118,9 @@ type cloudWatchExecutor struct {
resourceHandler backend.CallResourceHandler resourceHandler backend.CallResourceHandler
} }
func (e *cloudWatchExecutor) getRequestContext(pluginCtx backend.PluginContext, region string) (models.RequestContext, error) { func (e *cloudWatchExecutor) getRequestContext(ctx context.Context, pluginCtx backend.PluginContext, region string) (models.RequestContext, error) {
r := region r := region
instance, err := e.getInstance(pluginCtx) instance, err := e.getInstance(ctx, pluginCtx)
if region == defaultRegion { if region == defaultRegion {
if err != nil { if err != nil {
return models.RequestContext{}, err return models.RequestContext{}, err
@ -128,7 +128,7 @@ func (e *cloudWatchExecutor) getRequestContext(pluginCtx backend.PluginContext,
r = instance.Settings.Region r = instance.Settings.Region
} }
sess, err := e.newSession(pluginCtx, r) sess, err := e.newSession(ctx, pluginCtx, r)
if err != nil { if err != nil {
return models.RequestContext{}, err return models.RequestContext{}, err
} }
@ -171,7 +171,7 @@ func (e *cloudWatchExecutor) QueryData(ctx context.Context, req *backend.QueryDa
var result *backend.QueryDataResponse var result *backend.QueryDataResponse
switch model.Type { switch model.Type {
case annotationQuery: case annotationQuery:
result, err = e.executeAnnotationQuery(req.PluginContext, model, q) result, err = e.executeAnnotationQuery(ctx, req.PluginContext, model, q)
case logAction: case logAction:
result, err = e.executeLogActions(ctx, logger, req) result, err = e.executeLogActions(ctx, logger, req)
case timeSeriesQuery: case timeSeriesQuery:
@ -188,13 +188,13 @@ func (e *cloudWatchExecutor) CheckHealth(ctx context.Context, req *backend.Check
metricsTest := "Successfully queried the CloudWatch metrics API." metricsTest := "Successfully queried the CloudWatch metrics API."
logsTest := "Successfully queried the CloudWatch logs API." logsTest := "Successfully queried the CloudWatch logs API."
err := e.checkHealthMetrics(req.PluginContext) err := e.checkHealthMetrics(ctx, req.PluginContext)
if err != nil { if err != nil {
status = backend.HealthStatusError status = backend.HealthStatusError
metricsTest = fmt.Sprintf("CloudWatch metrics query failed: %s", err.Error()) metricsTest = fmt.Sprintf("CloudWatch metrics query failed: %s", err.Error())
} }
err = e.checkHealthLogs(req.PluginContext) err = e.checkHealthLogs(ctx, req.PluginContext)
if err != nil { if err != nil {
status = backend.HealthStatusError status = backend.HealthStatusError
logsTest = fmt.Sprintf("CloudWatch logs query failed: %s", err.Error()) logsTest = fmt.Sprintf("CloudWatch logs query failed: %s", err.Error())
@ -206,7 +206,7 @@ func (e *cloudWatchExecutor) CheckHealth(ctx context.Context, req *backend.Check
}, nil }, nil
} }
func (e *cloudWatchExecutor) checkHealthMetrics(pluginCtx backend.PluginContext) error { func (e *cloudWatchExecutor) checkHealthMetrics(ctx context.Context, pluginCtx backend.PluginContext) error {
namespace := "AWS/Billing" namespace := "AWS/Billing"
metric := "EstimatedCharges" metric := "EstimatedCharges"
params := &cloudwatch.ListMetricsInput{ params := &cloudwatch.ListMetricsInput{
@ -214,7 +214,7 @@ func (e *cloudWatchExecutor) checkHealthMetrics(pluginCtx backend.PluginContext)
MetricName: &metric, MetricName: &metric,
} }
session, err := e.newSession(pluginCtx, defaultRegion) session, err := e.newSession(ctx, pluginCtx, defaultRegion)
if err != nil { if err != nil {
return err return err
} }
@ -223,8 +223,8 @@ func (e *cloudWatchExecutor) checkHealthMetrics(pluginCtx backend.PluginContext)
return err return err
} }
func (e *cloudWatchExecutor) checkHealthLogs(pluginCtx backend.PluginContext) error { func (e *cloudWatchExecutor) checkHealthLogs(ctx context.Context, pluginCtx backend.PluginContext) error {
session, err := e.newSession(pluginCtx, defaultRegion) session, err := e.newSession(ctx, pluginCtx, defaultRegion)
if err != nil { if err != nil {
return err return err
} }
@ -233,8 +233,8 @@ func (e *cloudWatchExecutor) checkHealthLogs(pluginCtx backend.PluginContext) er
return err return err
} }
func (e *cloudWatchExecutor) newSession(pluginCtx backend.PluginContext, region string) (*session.Session, error) { func (e *cloudWatchExecutor) newSession(ctx context.Context, pluginCtx backend.PluginContext, region string) (*session.Session, error) {
instance, err := e.getInstance(pluginCtx) instance, err := e.getInstance(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -272,8 +272,8 @@ func (e *cloudWatchExecutor) newSession(pluginCtx backend.PluginContext, region
return sess, nil return sess, nil
} }
func (e *cloudWatchExecutor) getInstance(pluginCtx backend.PluginContext) (*DataSource, error) { func (e *cloudWatchExecutor) getInstance(ctx context.Context, pluginCtx backend.PluginContext) (*DataSource, error) {
i, err := e.im.Get(pluginCtx) i, err := e.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -282,16 +282,16 @@ func (e *cloudWatchExecutor) getInstance(pluginCtx backend.PluginContext) (*Data
return &instance, nil return &instance, nil
} }
func (e *cloudWatchExecutor) getCWClient(pluginCtx backend.PluginContext, region string) (cloudwatchiface.CloudWatchAPI, error) { func (e *cloudWatchExecutor) getCWClient(ctx context.Context, pluginCtx backend.PluginContext, region string) (cloudwatchiface.CloudWatchAPI, error) {
sess, err := e.newSession(pluginCtx, region) sess, err := e.newSession(ctx, pluginCtx, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return NewCWClient(sess), nil return NewCWClient(sess), nil
} }
func (e *cloudWatchExecutor) getCWLogsClient(pluginCtx backend.PluginContext, region string) (cloudwatchlogsiface.CloudWatchLogsAPI, error) { func (e *cloudWatchExecutor) getCWLogsClient(ctx context.Context, pluginCtx backend.PluginContext, region string) (cloudwatchlogsiface.CloudWatchLogsAPI, error) {
sess, err := e.newSession(pluginCtx, region) sess, err := e.newSession(ctx, pluginCtx, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -301,8 +301,8 @@ func (e *cloudWatchExecutor) getCWLogsClient(pluginCtx backend.PluginContext, re
return logsClient, nil return logsClient, nil
} }
func (e *cloudWatchExecutor) getEC2Client(pluginCtx backend.PluginContext, region string) (models.EC2APIProvider, error) { func (e *cloudWatchExecutor) getEC2Client(ctx context.Context, pluginCtx backend.PluginContext, region string) (models.EC2APIProvider, error) {
sess, err := e.newSession(pluginCtx, region) sess, err := e.newSession(ctx, pluginCtx, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -310,9 +310,9 @@ func (e *cloudWatchExecutor) getEC2Client(pluginCtx backend.PluginContext, regio
return newEC2Client(sess), nil return newEC2Client(sess), nil
} }
func (e *cloudWatchExecutor) getRGTAClient(pluginCtx backend.PluginContext, region string) (resourcegroupstaggingapiiface.ResourceGroupsTaggingAPIAPI, func (e *cloudWatchExecutor) getRGTAClient(ctx context.Context, pluginCtx backend.PluginContext, region string) (resourcegroupstaggingapiiface.ResourceGroupsTaggingAPIAPI,
error) { error) {
sess, err := e.newSession(pluginCtx, region) sess, err := e.newSession(ctx, pluginCtx, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -96,7 +96,7 @@ func (e *cloudWatchExecutor) executeLogActions(ctx context.Context, logger log.L
} }
func (e *cloudWatchExecutor) executeLogAction(ctx context.Context, logger log.Logger, logsQuery models.LogsQuery, query backend.DataQuery, pluginCtx backend.PluginContext) (*data.Frame, error) { func (e *cloudWatchExecutor) executeLogAction(ctx context.Context, logger log.Logger, logsQuery models.LogsQuery, query backend.DataQuery, pluginCtx backend.PluginContext) (*data.Frame, error) {
instance, err := e.getInstance(pluginCtx) instance, err := e.getInstance(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -106,7 +106,7 @@ func (e *cloudWatchExecutor) executeLogAction(ctx context.Context, logger log.Lo
region = logsQuery.Region region = logsQuery.Region
} }
logsClient, err := e.getCWLogsClient(pluginCtx, region) logsClient, err := e.getCWLogsClient(ctx, pluginCtx, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -36,14 +36,14 @@ var executeSyncLogQuery = func(ctx context.Context, e *cloudWatchExecutor, req *
region := logsQuery.Region region := logsQuery.Region
if logsQuery.Region == "" || region == defaultRegion { if logsQuery.Region == "" || region == defaultRegion {
instance, err := e.getInstance(req.PluginContext) instance, err := e.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
logsQuery.Region = instance.Settings.Region logsQuery.Region = instance.Settings.Region
} }
logsClient, err := e.getCWLogsClient(req.PluginContext, region) logsClient, err := e.getCWLogsClient(ctx, req.PluginContext, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -1,6 +1,7 @@
package cloudwatch package cloudwatch
import ( import (
"context"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
@ -39,8 +40,8 @@ func parseMultiSelectValue(input string) []string {
// Whenever this list is updated, the frontend list should also be updated. // Whenever this list is updated, the frontend list should also be updated.
// Please update the region list in public/app/plugins/datasource/cloudwatch/partials/config.html // Please update the region list in public/app/plugins/datasource/cloudwatch/partials/config.html
func (e *cloudWatchExecutor) handleGetRegions(pluginCtx backend.PluginContext, parameters url.Values) ([]suggestData, error) { func (e *cloudWatchExecutor) handleGetRegions(ctx context.Context, pluginCtx backend.PluginContext, parameters url.Values) ([]suggestData, error) {
instance, err := e.getInstance(pluginCtx) instance, err := e.getInstance(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -52,7 +53,7 @@ func (e *cloudWatchExecutor) handleGetRegions(pluginCtx backend.PluginContext, p
} }
} }
client, err := e.getEC2Client(pluginCtx, defaultRegion) client, err := e.getEC2Client(ctx, pluginCtx, defaultRegion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -85,12 +86,12 @@ func mergeEC2RegionsAndConstantRegions(regions map[string]struct{}, ec2Regions [
} }
} }
func (e *cloudWatchExecutor) handleGetEbsVolumeIds(pluginCtx backend.PluginContext, parameters url.Values) ([]suggestData, error) { func (e *cloudWatchExecutor) handleGetEbsVolumeIds(ctx context.Context, pluginCtx backend.PluginContext, parameters url.Values) ([]suggestData, error) {
region := parameters.Get("region") region := parameters.Get("region")
instanceId := parameters.Get("instanceId") instanceId := parameters.Get("instanceId")
instanceIds := aws.StringSlice(parseMultiSelectValue(instanceId)) instanceIds := aws.StringSlice(parseMultiSelectValue(instanceId))
instances, err := e.ec2DescribeInstances(pluginCtx, region, nil, instanceIds) instances, err := e.ec2DescribeInstances(ctx, pluginCtx, region, nil, instanceIds)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -107,7 +108,7 @@ func (e *cloudWatchExecutor) handleGetEbsVolumeIds(pluginCtx backend.PluginConte
return result, nil return result, nil
} }
func (e *cloudWatchExecutor) handleGetEc2InstanceAttribute(pluginCtx backend.PluginContext, parameters url.Values) ([]suggestData, error) { func (e *cloudWatchExecutor) handleGetEc2InstanceAttribute(ctx context.Context, pluginCtx backend.PluginContext, parameters url.Values) ([]suggestData, error) {
region := parameters.Get("region") region := parameters.Get("region")
attributeName := parameters.Get("attributeName") attributeName := parameters.Get("attributeName")
filterJson := parameters.Get("filters") filterJson := parameters.Get("filters")
@ -134,7 +135,7 @@ func (e *cloudWatchExecutor) handleGetEc2InstanceAttribute(pluginCtx backend.Plu
} }
} }
instances, err := e.ec2DescribeInstances(pluginCtx, region, filters, nil) instances, err := e.ec2DescribeInstances(ctx, pluginCtx, region, filters, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -192,7 +193,7 @@ func (e *cloudWatchExecutor) handleGetEc2InstanceAttribute(pluginCtx backend.Plu
return result, nil return result, nil
} }
func (e *cloudWatchExecutor) handleGetResourceArns(pluginCtx backend.PluginContext, parameters url.Values) ([]suggestData, error) { func (e *cloudWatchExecutor) handleGetResourceArns(ctx context.Context, pluginCtx backend.PluginContext, parameters url.Values) ([]suggestData, error) {
region := parameters.Get("region") region := parameters.Get("region")
resourceType := parameters.Get("resourceType") resourceType := parameters.Get("resourceType")
tagsJson := parameters.Get("tags") tagsJson := parameters.Get("tags")
@ -222,7 +223,7 @@ func (e *cloudWatchExecutor) handleGetResourceArns(pluginCtx backend.PluginConte
var resourceTypes []*string var resourceTypes []*string
resourceTypes = append(resourceTypes, &resourceType) resourceTypes = append(resourceTypes, &resourceType)
resources, err := e.resourceGroupsGetResources(pluginCtx, region, filters, resourceTypes) resources, err := e.resourceGroupsGetResources(ctx, pluginCtx, region, filters, resourceTypes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -236,13 +237,13 @@ func (e *cloudWatchExecutor) handleGetResourceArns(pluginCtx backend.PluginConte
return result, nil return result, nil
} }
func (e *cloudWatchExecutor) ec2DescribeInstances(pluginCtx backend.PluginContext, region string, filters []*ec2.Filter, instanceIds []*string) (*ec2.DescribeInstancesOutput, error) { func (e *cloudWatchExecutor) ec2DescribeInstances(ctx context.Context, pluginCtx backend.PluginContext, region string, filters []*ec2.Filter, instanceIds []*string) (*ec2.DescribeInstancesOutput, error) {
params := &ec2.DescribeInstancesInput{ params := &ec2.DescribeInstancesInput{
Filters: filters, Filters: filters,
InstanceIds: instanceIds, InstanceIds: instanceIds,
} }
client, err := e.getEC2Client(pluginCtx, region) client, err := e.getEC2Client(ctx, pluginCtx, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -258,14 +259,14 @@ func (e *cloudWatchExecutor) ec2DescribeInstances(pluginCtx backend.PluginContex
return &resp, nil return &resp, nil
} }
func (e *cloudWatchExecutor) resourceGroupsGetResources(pluginCtx backend.PluginContext, region string, filters []*resourcegroupstaggingapi.TagFilter, func (e *cloudWatchExecutor) resourceGroupsGetResources(ctx context.Context, pluginCtx backend.PluginContext, region string, filters []*resourcegroupstaggingapi.TagFilter,
resourceTypes []*string) (*resourcegroupstaggingapi.GetResourcesOutput, error) { resourceTypes []*string) (*resourcegroupstaggingapi.GetResourcesOutput, error) {
params := &resourcegroupstaggingapi.GetResourcesInput{ params := &resourcegroupstaggingapi.GetResourcesInput{
ResourceTypeFilters: resourceTypes, ResourceTypeFilters: resourceTypes,
TagFilters: filters, TagFilters: filters,
} }
client, err := e.getRGTAClient(pluginCtx, region) client, err := e.getRGTAClient(ctx, pluginCtx, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -1,6 +1,7 @@
package cloudwatch package cloudwatch
import ( import (
"context"
"encoding/json" "encoding/json"
"net/url" "net/url"
"sort" "sort"
@ -47,6 +48,7 @@ func TestQuery_Regions(t *testing.T) {
executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures()) executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures())
resp, err := executor.handleGetRegions( resp, err := executor.handleGetRegions(
context.Background(),
backend.PluginContext{ backend.PluginContext{
DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{},
}, url.Values{ }, url.Values{
@ -105,10 +107,12 @@ func Test_handleGetRegions_regionCache(t *testing.T) {
cli.On("DescribeRegions", mock.Anything, mock.Anything).Return(&ec2.DescribeRegionsOutput{}, nil) cli.On("DescribeRegions", mock.Anything, mock.Anything).Return(&ec2.DescribeRegionsOutput{}, nil)
executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures()) executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures())
_, err := executor.handleGetRegions( _, err := executor.handleGetRegions(
context.Background(),
backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, nil) backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, nil)
require.NoError(t, err) require.NoError(t, err)
_, err = executor.handleGetRegions( _, err = executor.handleGetRegions(
context.Background(),
backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, nil) backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}}, nil)
require.NoError(t, err) require.NoError(t, err)
@ -160,6 +164,7 @@ func TestQuery_InstanceAttributes(t *testing.T) {
executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures()) executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures())
resp, err := executor.handleGetEc2InstanceAttribute( resp, err := executor.handleGetEc2InstanceAttribute(
context.Background(),
backend.PluginContext{ backend.PluginContext{
DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{},
}, url.Values{ }, url.Values{
@ -237,6 +242,7 @@ func TestQuery_EBSVolumeIDs(t *testing.T) {
executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures()) executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures())
resp, err := executor.handleGetEbsVolumeIds( resp, err := executor.handleGetEbsVolumeIds(
context.Background(),
backend.PluginContext{ backend.PluginContext{
DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{},
}, url.Values{ }, url.Values{
@ -303,6 +309,7 @@ func TestQuery_ResourceARNs(t *testing.T) {
executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures()) executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures())
resp, err := executor.handleGetResourceArns( resp, err := executor.handleGetResourceArns(
context.Background(),
backend.PluginContext{ backend.PluginContext{
DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}, DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{},
}, url.Values{ }, url.Values{

@ -1,6 +1,7 @@
package models package models
import ( import (
"context"
"net/url" "net/url"
"github.com/aws/aws-sdk-go/service/cloudwatch" "github.com/aws/aws-sdk-go/service/cloudwatch"
@ -12,9 +13,9 @@ import (
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/models/resources" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models/resources"
) )
type RequestContextFactoryFunc func(pluginCtx backend.PluginContext, region string) (reqCtx RequestContext, err error) type RequestContextFactoryFunc func(ctx context.Context, pluginCtx backend.PluginContext, region string) (reqCtx RequestContext, err error)
type RouteHandlerFunc func(pluginCtx backend.PluginContext, reqContextFactory RequestContextFactoryFunc, parameters url.Values) ([]byte, *HttpError) type RouteHandlerFunc func(ctx context.Context, pluginCtx backend.PluginContext, reqContextFactory RequestContextFactoryFunc, parameters url.Values) ([]byte, *HttpError)
type RequestContext struct { type RequestContext struct {
MetricsClientProvider MetricsClientProvider MetricsClientProvider MetricsClientProvider

@ -1,6 +1,7 @@
package cloudwatch package cloudwatch
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
@ -28,7 +29,7 @@ func (e *cloudWatchExecutor) newResourceMux() *http.ServeMux {
return mux return mux
} }
type handleFn func(pluginCtx backend.PluginContext, parameters url.Values) ([]suggestData, error) type handleFn func(ctx context.Context, pluginCtx backend.PluginContext, parameters url.Values) ([]suggestData, error)
func handleResourceReq(handleFunc handleFn) func(rw http.ResponseWriter, req *http.Request) { func handleResourceReq(handleFunc handleFn) func(rw http.ResponseWriter, req *http.Request) {
return func(rw http.ResponseWriter, req *http.Request) { return func(rw http.ResponseWriter, req *http.Request) {
@ -39,7 +40,7 @@ func handleResourceReq(handleFunc handleFn) func(rw http.ResponseWriter, req *ht
writeResponse(rw, http.StatusBadRequest, fmt.Sprintf("unexpected error %v", err)) writeResponse(rw, http.StatusBadRequest, fmt.Sprintf("unexpected error %v", err))
return return
} }
data, err := handleFunc(pluginContext, req.URL.Query()) data, err := handleFunc(ctx, pluginContext, req.URL.Query())
if err != nil { if err != nil {
writeResponse(rw, http.StatusBadRequest, fmt.Sprintf("unexpected error %v", err)) writeResponse(rw, http.StatusBadRequest, fmt.Sprintf("unexpected error %v", err))
return return

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
@ -12,13 +13,13 @@ import (
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/services" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/services"
) )
func AccountsHandler(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { func AccountsHandler(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) {
region := parameters.Get("region") region := parameters.Get("region")
if region == "" { if region == "" {
return nil, models.NewHttpError("error in AccountsHandler", http.StatusBadRequest, fmt.Errorf("region is required")) return nil, models.NewHttpError("error in AccountsHandler", http.StatusBadRequest, fmt.Errorf("region is required"))
} }
service, err := newAccountsService(pluginCtx, reqCtxFactory, region) service, err := newAccountsService(ctx, pluginCtx, reqCtxFactory, region)
if err != nil { if err != nil {
return nil, models.NewHttpError("error in AccountsHandler", http.StatusInternalServerError, err) return nil, models.NewHttpError("error in AccountsHandler", http.StatusInternalServerError, err)
} }
@ -45,8 +46,8 @@ func AccountsHandler(pluginCtx backend.PluginContext, reqCtxFactory models.Reque
// newAccountService is an account service factory. // newAccountService is an account service factory.
// //
// Stubbable by tests. // Stubbable by tests.
var newAccountsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.AccountsProvider, error) { var newAccountsService = func(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.AccountsProvider, error) {
oamClient, err := reqCtxFactory(pluginCtx, region) oamClient, err := reqCtxFactory(ctx, pluginCtx, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"fmt" "fmt"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -30,7 +31,7 @@ func Test_accounts_route(t *testing.T) {
IsMonitoringAccount: true, IsMonitoringAccount: true,
}, },
}}, nil) }}, nil)
newAccountsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.AccountsProvider, error) { newAccountsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.AccountsProvider, error) {
return &mockAccountsService, nil return &mockAccountsService, nil
} }
@ -63,7 +64,7 @@ func Test_accounts_route(t *testing.T) {
mockAccountsService := mocks.AccountsServiceMock{} mockAccountsService := mocks.AccountsServiceMock{}
mockAccountsService.On("GetAccountsForCurrentUserOrRole").Return([]resources.ResourceResponse[resources.Account](nil), mockAccountsService.On("GetAccountsForCurrentUserOrRole").Return([]resources.ResourceResponse[resources.Account](nil),
fmt.Errorf("%w: %s", services.ErrAccessDeniedException, "some AWS message")) fmt.Errorf("%w: %s", services.ErrAccessDeniedException, "some AWS message"))
newAccountsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.AccountsProvider, error) { newAccountsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.AccountsProvider, error) {
return &mockAccountsService, nil return &mockAccountsService, nil
} }
@ -81,7 +82,7 @@ func Test_accounts_route(t *testing.T) {
t.Run("returns 500 when accounts service returns unknown error", func(t *testing.T) { t.Run("returns 500 when accounts service returns unknown error", func(t *testing.T) {
mockAccountsService := mocks.AccountsServiceMock{} mockAccountsService := mocks.AccountsServiceMock{}
mockAccountsService.On("GetAccountsForCurrentUserOrRole").Return([]resources.ResourceResponse[resources.Account](nil), fmt.Errorf("some error")) mockAccountsService.On("GetAccountsForCurrentUserOrRole").Return([]resources.ResourceResponse[resources.Account](nil), fmt.Errorf("some error"))
newAccountsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.AccountsProvider, error) { newAccountsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.AccountsProvider, error) {
return &mockAccountsService, nil return &mockAccountsService, nil
} }

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"encoding/json" "encoding/json"
"net/http" "net/http"
"net/url" "net/url"
@ -11,13 +12,13 @@ import (
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/services" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/services"
) )
func DimensionKeysHandler(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { func DimensionKeysHandler(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) {
dimensionKeysRequest, err := resources.GetDimensionKeysRequest(parameters) dimensionKeysRequest, err := resources.GetDimensionKeysRequest(parameters)
if err != nil { if err != nil {
return nil, models.NewHttpError("error in DimensionKeyHandler", http.StatusBadRequest, err) return nil, models.NewHttpError("error in DimensionKeyHandler", http.StatusBadRequest, err)
} }
service, err := newListMetricsService(pluginCtx, reqCtxFactory, dimensionKeysRequest.Region) service, err := newListMetricsService(ctx, pluginCtx, reqCtxFactory, dimensionKeysRequest.Region)
if err != nil { if err != nil {
return nil, models.NewHttpError("error in DimensionKeyHandler", http.StatusInternalServerError, err) return nil, models.NewHttpError("error in DimensionKeyHandler", http.StatusInternalServerError, err)
} }
@ -44,8 +45,8 @@ func DimensionKeysHandler(pluginCtx backend.PluginContext, reqCtxFactory models.
// newListMetricsService is an list metrics service factory. // newListMetricsService is an list metrics service factory.
// //
// Stubbable by tests. // Stubbable by tests.
var newListMetricsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) { var newListMetricsService = func(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) {
metricClient, err := reqCtxFactory(pluginCtx, region) metricClient, err := reqCtxFactory(ctx, pluginCtx, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
@ -32,7 +33,7 @@ func Test_DimensionKeys_Route(t *testing.T) {
assert.Contains(t, r.DimensionFilter, &resources.Dimension{Name: "NodeID", Value: "Shared"}) && assert.Contains(t, r.DimensionFilter, &resources.Dimension{Name: "NodeID", Value: "Shared"}) &&
assert.Contains(t, r.DimensionFilter, &resources.Dimension{Name: "stage", Value: "QueryCommit"}) assert.Contains(t, r.DimensionFilter, &resources.Dimension{Name: "stage", Value: "QueryCommit"})
})).Return([]resources.ResourceResponse[string]{}, nil).Once() })).Return([]resources.ResourceResponse[string]{}, nil).Once()
newListMetricsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) { newListMetricsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) {
return &mockListMetricsService, nil return &mockListMetricsService, nil
} }
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -67,7 +68,7 @@ func Test_DimensionKeys_Route(t *testing.T) {
t.Run("return 500 if GetDimensionKeysByDimensionFilter returns an error", func(t *testing.T) { t.Run("return 500 if GetDimensionKeysByDimensionFilter returns an error", func(t *testing.T) {
mockListMetricsService := mocks.ListMetricsServiceMock{} mockListMetricsService := mocks.ListMetricsServiceMock{}
mockListMetricsService.On("GetDimensionKeysByDimensionFilter", mock.Anything).Return([]resources.ResourceResponse[string]{}, fmt.Errorf("some error")) mockListMetricsService.On("GetDimensionKeysByDimensionFilter", mock.Anything).Return([]resources.ResourceResponse[string]{}, fmt.Errorf("some error"))
newListMetricsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) { newListMetricsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) {
return &mockListMetricsService, nil return &mockListMetricsService, nil
} }
rr := httptest.NewRecorder() rr := httptest.NewRecorder()

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"encoding/json" "encoding/json"
"net/http" "net/http"
"net/url" "net/url"
@ -10,13 +11,13 @@ import (
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/models/resources" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models/resources"
) )
func DimensionValuesHandler(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { func DimensionValuesHandler(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) {
dimensionValuesRequest, err := resources.GetDimensionValuesRequest(parameters) dimensionValuesRequest, err := resources.GetDimensionValuesRequest(parameters)
if err != nil { if err != nil {
return nil, models.NewHttpError("error in DimensionValuesHandler", http.StatusBadRequest, err) return nil, models.NewHttpError("error in DimensionValuesHandler", http.StatusBadRequest, err)
} }
service, err := newListMetricsService(pluginCtx, reqCtxFactory, dimensionValuesRequest.Region) service, err := newListMetricsService(ctx, pluginCtx, reqCtxFactory, dimensionValuesRequest.Region)
if err != nil { if err != nil {
return nil, models.NewHttpError("error in DimensionValuesHandler", http.StatusInternalServerError, err) return nil, models.NewHttpError("error in DimensionValuesHandler", http.StatusInternalServerError, err)
} }

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"fmt" "fmt"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -27,7 +28,7 @@ func Test_DimensionValues_Route(t *testing.T) {
assert.Contains(t, r.DimensionFilter, &resources.Dimension{Name: "NodeID", Value: "Shared"}) && assert.Contains(t, r.DimensionFilter, &resources.Dimension{Name: "NodeID", Value: "Shared"}) &&
assert.Contains(t, r.DimensionFilter, &resources.Dimension{Name: "stage", Value: "QueryCommit"}) assert.Contains(t, r.DimensionFilter, &resources.Dimension{Name: "stage", Value: "QueryCommit"})
})).Return([]resources.ResourceResponse[string]{}, nil).Once() })).Return([]resources.ResourceResponse[string]{}, nil).Once()
newListMetricsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) { newListMetricsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) {
return &mockListMetricsService, nil return &mockListMetricsService, nil
} }
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -39,7 +40,7 @@ func Test_DimensionValues_Route(t *testing.T) {
t.Run("returns 500 if GetDimensionValuesByDimensionFilter returns an error", func(t *testing.T) { t.Run("returns 500 if GetDimensionValuesByDimensionFilter returns an error", func(t *testing.T) {
mockListMetricsService := mocks.ListMetricsServiceMock{} mockListMetricsService := mocks.ListMetricsServiceMock{}
mockListMetricsService.On("GetDimensionValuesByDimensionFilter", mock.Anything).Return([]resources.ResourceResponse[string]{}, fmt.Errorf("some error")) mockListMetricsService.On("GetDimensionValuesByDimensionFilter", mock.Anything).Return([]resources.ResourceResponse[string]{}, fmt.Errorf("some error"))
newListMetricsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) { newListMetricsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) {
return &mockListMetricsService, nil return &mockListMetricsService, nil
} }
rr := httptest.NewRecorder() rr := httptest.NewRecorder()

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"encoding/json" "encoding/json"
"net/http" "net/http"
"net/url" "net/url"
@ -10,13 +11,13 @@ import (
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/models/resources" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models/resources"
) )
func LogGroupFieldsHandler(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { func LogGroupFieldsHandler(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) {
request, err := resources.ParseLogGroupFieldsRequest(parameters) request, err := resources.ParseLogGroupFieldsRequest(parameters)
if err != nil { if err != nil {
return nil, models.NewHttpError("error in LogGroupFieldsHandler", http.StatusBadRequest, err) return nil, models.NewHttpError("error in LogGroupFieldsHandler", http.StatusBadRequest, err)
} }
service, err := newLogGroupsService(pluginCtx, reqCtxFactory, request.Region) service, err := newLogGroupsService(ctx, pluginCtx, reqCtxFactory, request.Region)
if err != nil { if err != nil {
return nil, models.NewHttpError("newLogGroupsService error", http.StatusInternalServerError, err) return nil, models.NewHttpError("newLogGroupsService error", http.StatusInternalServerError, err)
} }

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"fmt" "fmt"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -16,7 +17,7 @@ import (
func TestLogGroupFieldsRoute(t *testing.T) { func TestLogGroupFieldsRoute(t *testing.T) {
mockFeatures := mocks.MockFeatures{} mockFeatures := mocks.MockFeatures{}
reqCtxFunc := func(pluginCtx backend.PluginContext, region string) (reqCtx models.RequestContext, err error) { reqCtxFunc := func(_ context.Context, pluginCtx backend.PluginContext, region string) (reqCtx models.RequestContext, err error) {
return models.RequestContext{Features: &mockFeatures}, err return models.RequestContext{Features: &mockFeatures}, err
} }
t.Run("returns 400 if an invalid LogGroupFieldsRequest is used", func(t *testing.T) { t.Run("returns 400 if an invalid LogGroupFieldsRequest is used", func(t *testing.T) {
@ -31,7 +32,7 @@ func TestLogGroupFieldsRoute(t *testing.T) {
t.Run("returns 500 if GetLogGroupFields method fails", func(t *testing.T) { t.Run("returns 500 if GetLogGroupFields method fails", func(t *testing.T) {
mockLogsService := mocks.LogsService{} mockLogsService := mocks.LogsService{}
mockLogsService.On("GetLogGroupFields", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroupField]{}, fmt.Errorf("error from api")) mockLogsService.On("GetLogGroupFields", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroupField]{}, fmt.Errorf("error from api"))
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }
@ -62,7 +63,7 @@ func TestLogGroupFieldsRoute(t *testing.T) {
}, },
}, },
}, nil) }, nil)
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"encoding/json" "encoding/json"
"net/http" "net/http"
"net/url" "net/url"
@ -12,13 +13,13 @@ import (
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/services" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/services"
) )
func LogGroupsHandler(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { func LogGroupsHandler(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) {
request, err := resources.ParseLogGroupsRequest(parameters) request, err := resources.ParseLogGroupsRequest(parameters)
if err != nil { if err != nil {
return nil, models.NewHttpError("cannot set both log group name prefix and pattern", http.StatusBadRequest, err) return nil, models.NewHttpError("cannot set both log group name prefix and pattern", http.StatusBadRequest, err)
} }
service, err := newLogGroupsService(pluginCtx, reqCtxFactory, request.Region) service, err := newLogGroupsService(ctx, pluginCtx, reqCtxFactory, request.Region)
if err != nil { if err != nil {
return nil, models.NewHttpError("newLogGroupsService error", http.StatusInternalServerError, err) return nil, models.NewHttpError("newLogGroupsService error", http.StatusInternalServerError, err)
} }
@ -39,8 +40,8 @@ func LogGroupsHandler(pluginCtx backend.PluginContext, reqCtxFactory models.Requ
// newLogGroupsService is a describe log groups service factory. // newLogGroupsService is a describe log groups service factory.
// //
// Stubbable by tests. // Stubbable by tests.
var newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { var newLogGroupsService = func(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
reqCtx, err := reqCtxFactory(pluginCtx, region) reqCtx, err := reqCtxFactory(ctx, pluginCtx, region)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"fmt" "fmt"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -24,7 +25,7 @@ func TestLogGroupsRoute(t *testing.T) {
mockFeatures := mocks.MockFeatures{} mockFeatures := mocks.MockFeatures{}
mockFeatures.On("IsEnabled", featuremgmt.FlagCloudWatchCrossAccountQuerying).Return(false) mockFeatures.On("IsEnabled", featuremgmt.FlagCloudWatchCrossAccountQuerying).Return(false)
reqCtxFunc := func(pluginCtx backend.PluginContext, region string) (reqCtx models.RequestContext, err error) { reqCtxFunc := func(_ context.Context, pluginCtx backend.PluginContext, region string) (reqCtx models.RequestContext, err error) {
return models.RequestContext{Features: &mockFeatures}, err return models.RequestContext{Features: &mockFeatures}, err
} }
@ -37,7 +38,7 @@ func TestLogGroupsRoute(t *testing.T) {
}, },
AccountId: utils.Pointer("111"), AccountId: utils.Pointer("111"),
}}, nil) }}, nil)
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }
@ -68,7 +69,7 @@ func TestLogGroupsRoute(t *testing.T) {
AccountId: utils.Pointer("222"), AccountId: utils.Pointer("222"),
}, },
}, nil) }, nil)
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }
@ -99,7 +100,7 @@ func TestLogGroupsRoute(t *testing.T) {
t.Run("returns error when both logGroupPrefix and logGroup Pattern are provided", func(t *testing.T) { t.Run("returns error when both logGroupPrefix and logGroup Pattern are provided", func(t *testing.T) {
mockLogsService := mocks.LogsService{} mockLogsService := mocks.LogsService{}
mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil) mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil)
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }
@ -115,7 +116,7 @@ func TestLogGroupsRoute(t *testing.T) {
t.Run("passes default log group limit and nil for logGroupNamePrefix, accountId, and logGroupPattern", func(t *testing.T) { t.Run("passes default log group limit and nil for logGroupNamePrefix, accountId, and logGroupPattern", func(t *testing.T) {
mockLogsService := mocks.LogsService{} mockLogsService := mocks.LogsService{}
mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil) mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil)
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }
@ -135,7 +136,7 @@ func TestLogGroupsRoute(t *testing.T) {
t.Run("passes default log group limit and nil for logGroupNamePrefix when both are absent", func(t *testing.T) { t.Run("passes default log group limit and nil for logGroupNamePrefix when both are absent", func(t *testing.T) {
mockLogsService := mocks.LogsService{} mockLogsService := mocks.LogsService{}
mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil) mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil)
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }
@ -153,7 +154,7 @@ func TestLogGroupsRoute(t *testing.T) {
t.Run("passes log group limit from query parameter", func(t *testing.T) { t.Run("passes log group limit from query parameter", func(t *testing.T) {
mockLogsService := mocks.LogsService{} mockLogsService := mocks.LogsService{}
mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil) mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil)
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }
@ -170,7 +171,7 @@ func TestLogGroupsRoute(t *testing.T) {
t.Run("passes logGroupPrefix from query parameter", func(t *testing.T) { t.Run("passes logGroupPrefix from query parameter", func(t *testing.T) {
mockLogsService := mocks.LogsService{} mockLogsService := mocks.LogsService{}
mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil) mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil)
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }
@ -188,7 +189,7 @@ func TestLogGroupsRoute(t *testing.T) {
t.Run("passes logGroupPattern from query parameter", func(t *testing.T) { t.Run("passes logGroupPattern from query parameter", func(t *testing.T) {
mockLogsService := mocks.LogsService{} mockLogsService := mocks.LogsService{}
mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil) mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil)
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }
@ -206,7 +207,7 @@ func TestLogGroupsRoute(t *testing.T) {
t.Run("passes logGroupPattern from query parameter", func(t *testing.T) { t.Run("passes logGroupPattern from query parameter", func(t *testing.T) {
mockLogsService := mocks.LogsService{} mockLogsService := mocks.LogsService{}
mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil) mockLogsService.On("GetLogGroups", mock.Anything).Return([]resources.ResourceResponse[resources.LogGroup]{}, nil)
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }
@ -225,7 +226,7 @@ func TestLogGroupsRoute(t *testing.T) {
mockLogsService := mocks.LogsService{} mockLogsService := mocks.LogsService{}
mockLogsService.On("GetLogGroups", mock.Anything). mockLogsService.On("GetLogGroups", mock.Anything).
Return([]resources.ResourceResponse[resources.LogGroup]{}, fmt.Errorf("some error")) Return([]resources.ResourceResponse[resources.LogGroup]{}, fmt.Errorf("some error"))
newLogGroupsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) { newLogGroupsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.LogGroupsProvider, error) {
return &mockLogsService, nil return &mockLogsService, nil
} }

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"encoding/json" "encoding/json"
"net/http" "net/http"
"net/url" "net/url"
@ -11,13 +12,13 @@ import (
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/services" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/services"
) )
func MetricsHandler(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { func MetricsHandler(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) {
metricsRequest, err := resources.GetMetricsRequest(parameters) metricsRequest, err := resources.GetMetricsRequest(parameters)
if err != nil { if err != nil {
return nil, models.NewHttpError("error in MetricsHandler", http.StatusBadRequest, err) return nil, models.NewHttpError("error in MetricsHandler", http.StatusBadRequest, err)
} }
service, err := newListMetricsService(pluginCtx, reqCtxFactory, metricsRequest.Region) service, err := newListMetricsService(ctx, pluginCtx, reqCtxFactory, metricsRequest.Region)
if err != nil { if err != nil {
return nil, models.NewHttpError("error in MetricsHandler", http.StatusInternalServerError, err) return nil, models.NewHttpError("error in MetricsHandler", http.StatusInternalServerError, err)
} }

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"fmt" "fmt"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -19,7 +20,7 @@ func Test_Metrics_Route(t *testing.T) {
t.Run("calls GetMetricsByNamespace when a CustomNamespaceRequestType is passed", func(t *testing.T) { t.Run("calls GetMetricsByNamespace when a CustomNamespaceRequestType is passed", func(t *testing.T) {
mockListMetricsService := mocks.ListMetricsServiceMock{} mockListMetricsService := mocks.ListMetricsServiceMock{}
mockListMetricsService.On("GetMetricsByNamespace", mock.Anything).Return([]resources.ResourceResponse[resources.Metric]{}, nil) mockListMetricsService.On("GetMetricsByNamespace", mock.Anything).Return([]resources.ResourceResponse[resources.Metric]{}, nil)
newListMetricsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) { newListMetricsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) {
return &mockListMetricsService, nil return &mockListMetricsService, nil
} }
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
@ -69,7 +70,7 @@ func Test_Metrics_Route(t *testing.T) {
t.Run("returns 500 if GetMetricsByNamespace returns an error", func(t *testing.T) { t.Run("returns 500 if GetMetricsByNamespace returns an error", func(t *testing.T) {
mockListMetricsService := mocks.ListMetricsServiceMock{} mockListMetricsService := mocks.ListMetricsServiceMock{}
mockListMetricsService.On("GetMetricsByNamespace", mock.Anything).Return([]resources.ResourceResponse[resources.Metric]{}, fmt.Errorf("some error")) mockListMetricsService.On("GetMetricsByNamespace", mock.Anything).Return([]resources.ResourceResponse[resources.Metric]{}, fmt.Errorf("some error"))
newListMetricsService = func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) { newListMetricsService = func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, region string) (models.ListMetricsProvider, error) {
return &mockListMetricsService, nil return &mockListMetricsService, nil
} }
rr := httptest.NewRecorder() rr := httptest.NewRecorder()

@ -18,7 +18,7 @@ func ResourceRequestMiddleware(handleFunc models.RouteHandlerFunc, logger log.Lo
ctx := req.Context() ctx := req.Context()
pluginContext := httpadapter.PluginConfigFromContext(ctx) pluginContext := httpadapter.PluginConfigFromContext(ctx)
json, httpError := handleFunc(pluginContext, reqCtxFactory, req.URL.Query()) json, httpError := handleFunc(ctx, pluginContext, reqCtxFactory, req.URL.Query())
if httpError != nil { if httpError != nil {
logger.Error("error handling resource request", "error", httpError.Message) logger.Error("error handling resource request", "error", httpError.Message)
respondWithError(rw, httpError) respondWithError(rw, httpError)

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"fmt" "fmt"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -17,7 +18,7 @@ func Test_Middleware(t *testing.T) {
t.Run("rejects POST method", func(t *testing.T) { t.Run("rejects POST method", func(t *testing.T) {
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
req := httptest.NewRequest("POST", "/dimension-keys?region=us-east-1", nil) req := httptest.NewRequest("POST", "/dimension-keys?region=us-east-1", nil)
handler := http.HandlerFunc(ResourceRequestMiddleware(func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { handler := http.HandlerFunc(ResourceRequestMiddleware(func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) {
return []byte{}, nil return []byte{}, nil
}, logger, nil)) }, logger, nil))
handler.ServeHTTP(rr, req) handler.ServeHTTP(rr, req)
@ -28,7 +29,7 @@ func Test_Middleware(t *testing.T) {
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/some-path", nil) req := httptest.NewRequest("GET", "/some-path", nil)
var testPluginContext backend.PluginContext var testPluginContext backend.PluginContext
handler := http.HandlerFunc(ResourceRequestMiddleware(func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { handler := http.HandlerFunc(ResourceRequestMiddleware(func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) {
testPluginContext = pluginCtx testPluginContext = pluginCtx
return []byte{}, nil return []byte{}, nil
}, logger, nil)) }, logger, nil))
@ -39,7 +40,7 @@ func Test_Middleware(t *testing.T) {
t.Run("should propagate handler error to response", func(t *testing.T) { t.Run("should propagate handler error to response", func(t *testing.T) {
rr := httptest.NewRecorder() rr := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/some-path", nil) req := httptest.NewRequest("GET", "/some-path", nil)
handler := http.HandlerFunc(ResourceRequestMiddleware(func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { handler := http.HandlerFunc(ResourceRequestMiddleware(func(_ context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) {
return []byte{}, models.NewHttpError("error", http.StatusBadRequest, fmt.Errorf("error from handler")) return []byte{}, models.NewHttpError("error", http.StatusBadRequest, fmt.Errorf("error from handler"))
}, logger, nil)) }, logger, nil))
handler.ServeHTTP(rr, req) handler.ServeHTTP(rr, req)

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"encoding/json" "encoding/json"
"net/http" "net/http"
"net/url" "net/url"
@ -13,8 +14,8 @@ import (
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/services" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/services"
) )
func NamespacesHandler(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, _ url.Values) ([]byte, *models.HttpError) { func NamespacesHandler(ctx context.Context, pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, _ url.Values) ([]byte, *models.HttpError) {
reqCtx, err := reqCtxFactory(pluginCtx, "default") reqCtx, err := reqCtxFactory(ctx, pluginCtx, "default")
if err != nil { if err != nil {
return nil, models.NewHttpError("error in NamespacesHandler", http.StatusInternalServerError, err) return nil, models.NewHttpError("error in NamespacesHandler", http.StatusInternalServerError, err)
} }

@ -1,6 +1,7 @@
package routes package routes
import ( import (
"context"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"testing" "testing"
@ -15,7 +16,7 @@ import (
func Test_Namespaces_Route(t *testing.T) { func Test_Namespaces_Route(t *testing.T) {
customNamespaces := "" customNamespaces := ""
factoryFunc := func(pluginCtx backend.PluginContext, region string) (reqCtx models.RequestContext, err error) { factoryFunc := func(_ context.Context, pluginCtx backend.PluginContext, region string) (reqCtx models.RequestContext, err error) {
return models.RequestContext{ return models.RequestContext{
Settings: models.CloudWatchSettings{ Settings: models.CloudWatchSettings{
Namespace: customNamespaces, Namespace: customNamespaces,

@ -31,7 +31,7 @@ func (e *cloudWatchExecutor) executeTimeSeriesQuery(ctx context.Context, logger
return nil, fmt.Errorf("invalid time range: start time must be before end time") return nil, fmt.Errorf("invalid time range: start time must be before end time")
} }
instance, err := e.getInstance(req.PluginContext) instance, err := e.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -73,7 +73,7 @@ func (e *cloudWatchExecutor) executeTimeSeriesQuery(ctx context.Context, logger
} }
}() }()
client, err := e.getCWClient(req.PluginContext, region) client, err := e.getCWClient(ctx, req.PluginContext, region)
if err != nil { if err != nil {
return err return err
} }

@ -39,7 +39,7 @@ func ProvideService(httpClientProvider httpclient.Provider) *Service {
} }
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return &backend.QueryDataResponse{}, err return &backend.QueryDataResponse{}, err
} }
@ -168,8 +168,8 @@ func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.Inst
} }
} }
func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (*es.DatasourceInfo, error) { func (s *Service) getDSInfo(ctx context.Context, pluginCtx backend.PluginContext) (*es.DatasourceInfo, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -189,7 +189,7 @@ func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceReq
return fmt.Errorf("invalid resource URL: %s", req.Path) return fmt.Errorf("invalid resource URL: %s", req.Path)
} }
ds, err := s.getDSInfo(req.PluginContext) ds, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return err return err
} }

@ -76,8 +76,8 @@ func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.Inst
} }
} }
func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (*datasourceInfo, error) { func (s *Service) getDSInfo(ctx context.Context, pluginCtx backend.PluginContext) (*datasourceInfo, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -93,7 +93,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
logger := logger.FromContext(ctx) logger := logger.FromContext(ctx)
// get datasource info from context // get datasource info from context
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -291,10 +291,10 @@ func TestConvertResponses(t *testing.T) {
type fakeInstanceManager struct{} type fakeInstanceManager struct{}
func (f fakeInstanceManager) Get(pluginContext backend.PluginContext) (instancemgmt.Instance, error) { func (f fakeInstanceManager) Get(_ context.Context, _ backend.PluginContext) (instancemgmt.Instance, error) {
return datasourceInfo{}, nil return datasourceInfo{}, nil
} }
func (f fakeInstanceManager) Do(pluginContext backend.PluginContext, fn instancemgmt.InstanceCallbackFunc) error { func (f fakeInstanceManager) Do(_ context.Context, _ backend.PluginContext, _ instancemgmt.InstanceCallbackFunc) error {
return nil return nil
} }

@ -20,7 +20,7 @@ const (
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult,
error) { error) {
logger := logger.FromContext(ctx) logger := logger.FromContext(ctx)
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return getHealthCheckMessage(logger, "error getting datasource info", err) return getHealthCheckMessage(logger, "error getting datasource info", err)
} }

@ -93,7 +93,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
logger := logger.FromContext(ctx) logger := logger.FromContext(ctx)
logger.Debug("Received a query request", "numQueries", len(req.Queries)) logger.Debug("Received a query request", "numQueries", len(req.Queries))
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -195,8 +195,8 @@ func (s *Service) createRequest(ctx context.Context, logger log.Logger, dsInfo *
return req, nil return req, nil
} }
func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (*models.DatasourceInfo, error) { func (s *Service) getDSInfo(ctx context.Context, pluginCtx backend.PluginContext) (*models.DatasourceInfo, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -2,6 +2,7 @@ package influxdb
import ( import (
"bytes" "bytes"
"context"
"errors" "errors"
"fmt" "fmt"
"io" "io"
@ -47,7 +48,7 @@ type fakeInstance struct {
fakeRoundTripper RoundTripper fakeRoundTripper RoundTripper
} }
func (f *fakeInstance) Get(pluginContext backend.PluginContext) (instancemgmt.Instance, error) { func (f *fakeInstance) Get(_ context.Context, _ backend.PluginContext) (instancemgmt.Instance, error) {
fp := &fakeHttpClientProvider{ fp := &fakeHttpClientProvider{
opts: sdkhttpclient.Options{ opts: sdkhttpclient.Options{
Timeouts: &sdkhttpclient.DefaultTimeoutOptions, Timeouts: &sdkhttpclient.DefaultTimeoutOptions,
@ -78,7 +79,7 @@ func (f *fakeInstance) Get(pluginContext backend.PluginContext) (instancemgmt.In
}, nil }, nil
} }
func (f *fakeInstance) Do(pluginContext backend.PluginContext, fn instancemgmt.InstanceCallbackFunc) error { func (f *fakeInstance) Do(_ context.Context, _ backend.PluginContext, _ instancemgmt.InstanceCallbackFunc) error {
return nil return nil
} }

@ -95,7 +95,7 @@ func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.Inst
} }
func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return err return err
} }
@ -142,7 +142,7 @@ func callResource(ctx context.Context, req *backend.CallResourceRequest, sender
} }
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
result := backend.NewQueryDataResponse() result := backend.NewQueryDataResponse()
return result, err return result, err
@ -213,8 +213,8 @@ func runQuery(ctx context.Context, api *LokiAPI, query *lokiQuery, responseOpts
return frames, nil return frames, nil
} }
func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (*datasourceInfo, error) { func (s *Service) getDSInfo(ctx context.Context, pluginCtx backend.PluginContext) (*datasourceInfo, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -15,8 +15,8 @@ import (
"github.com/grafana/grafana-plugin-sdk-go/data" "github.com/grafana/grafana-plugin-sdk-go/data"
) )
func (s *Service) SubscribeStream(_ context.Context, req *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) { func (s *Service) SubscribeStream(ctx context.Context, req *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) {
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return &backend.SubscribeStreamResponse{ return &backend.SubscribeStreamResponse{
Status: backend.SubscribeStreamStatusNotFound, Status: backend.SubscribeStreamStatusNotFound,
@ -60,7 +60,7 @@ func (s *Service) SubscribeStream(_ context.Context, req *backend.SubscribeStrea
// Single instance for each channel (results are shared with all listeners) // Single instance for each channel (results are shared with all listeners)
func (s *Service) RunStream(ctx context.Context, req *backend.RunStreamRequest, sender *backend.StreamSender) error { func (s *Service) RunStream(ctx context.Context, req *backend.RunStreamRequest, sender *backend.StreamSender) error {
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return err return err
} }

@ -35,8 +35,8 @@ func ProvideService(cfg *setting.Cfg) *Service {
} }
} }
func (s *Service) getDataSourceHandler(pluginCtx backend.PluginContext) (*sqleng.DataSourceHandler, error) { func (s *Service) getDataSourceHandler(ctx context.Context, pluginCtx backend.PluginContext) (*sqleng.DataSourceHandler, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -45,7 +45,7 @@ func (s *Service) getDataSourceHandler(pluginCtx backend.PluginContext) (*sqleng
} }
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
dsHandler, err := s.getDataSourceHandler(req.PluginContext) dsHandler, err := s.getDataSourceHandler(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -212,7 +212,7 @@ func (t *mssqlQueryResultTransformer) TransformQueryError(logger log.Logger, err
// CheckHealth pings the connected SQL database // CheckHealth pings the connected SQL database
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
dsHandler, err := s.getDataSourceHandler(req.PluginContext) dsHandler, err := s.getDataSourceHandler(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -142,8 +142,8 @@ func newInstanceSettings(cfg *setting.Cfg, httpClientProvider httpclient.Provide
} }
} }
func (s *Service) getDataSourceHandler(pluginCtx backend.PluginContext) (*sqleng.DataSourceHandler, error) { func (s *Service) getDataSourceHandler(ctx context.Context, pluginCtx backend.PluginContext) (*sqleng.DataSourceHandler, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -153,7 +153,7 @@ func (s *Service) getDataSourceHandler(pluginCtx backend.PluginContext) (*sqleng
// CheckHealth pings the connected SQL database // CheckHealth pings the connected SQL database
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
dsHandler, err := s.getDataSourceHandler(req.PluginContext) dsHandler, err := s.getDataSourceHandler(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -171,7 +171,7 @@ func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthReque
} }
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
dsHandler, err := s.getDataSourceHandler(req.PluginContext) dsHandler, err := s.getDataSourceHandler(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -83,7 +83,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
logger.Debug("OpenTsdb request", "params", tsdbQuery) logger.Debug("OpenTsdb request", "params", tsdbQuery)
} }
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -252,8 +252,8 @@ func (s *Service) buildMetric(query backend.DataQuery) map[string]interface{} {
return metric return metric
} }
func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (*datasourceInfo, error) { func (s *Service) getDSInfo(ctx context.Context, pluginCtx backend.PluginContext) (*datasourceInfo, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -31,8 +31,8 @@ type Service struct {
im instancemgmt.InstanceManager im instancemgmt.InstanceManager
} }
func (s *Service) getInstance(pluginCtx backend.PluginContext) (*ParcaDatasource, error) { func (s *Service) getInstance(ctx context.Context, pluginCtx backend.PluginContext) (*ParcaDatasource, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -53,7 +53,7 @@ func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.Inst
} }
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -61,7 +61,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
} }
func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return err return err
} }
@ -69,7 +69,7 @@ func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceReq
} }
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -33,8 +33,8 @@ type Service struct {
im instancemgmt.InstanceManager im instancemgmt.InstanceManager
} }
func (s *Service) getInstance(pluginCtx backend.PluginContext) (*PhlareDatasource, error) { func (s *Service) getInstance(ctx context.Context, pluginCtx backend.PluginContext) (*PhlareDatasource, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -55,7 +55,7 @@ func newInstanceSettings(httpClientProvider httpclient.Provider, ac accesscontro
} }
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -63,7 +63,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
} }
func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return err return err
} }
@ -71,7 +71,7 @@ func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceReq
} }
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -79,7 +79,7 @@ func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthReque
} }
func (s *Service) SubscribeStream(ctx context.Context, req *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) { func (s *Service) SubscribeStream(ctx context.Context, req *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) {
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -87,7 +87,7 @@ func (s *Service) SubscribeStream(ctx context.Context, req *backend.SubscribeStr
} }
func (s *Service) RunStream(ctx context.Context, req *backend.RunStreamRequest, sender *backend.StreamSender) error { func (s *Service) RunStream(ctx context.Context, req *backend.RunStreamRequest, sender *backend.StreamSender) error {
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return err return err
} }
@ -96,7 +96,7 @@ func (s *Service) RunStream(ctx context.Context, req *backend.RunStreamRequest,
// PublishStream is called when a client sends a message to the stream. // PublishStream is called when a client sends a message to the stream.
func (s *Service) PublishStream(ctx context.Context, req *backend.PublishStreamRequest) (*backend.PublishStreamResponse, error) { func (s *Service) PublishStream(ctx context.Context, req *backend.PublishStreamRequest) (*backend.PublishStreamResponse, error) {
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -34,8 +34,8 @@ type Service struct {
im instancemgmt.InstanceManager im instancemgmt.InstanceManager
} }
func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (*sqleng.DataSourceHandler, error) { func (s *Service) getDSInfo(ctx context.Context, pluginCtx backend.PluginContext) (*sqleng.DataSourceHandler, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -44,7 +44,7 @@ func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (*sqleng.DataSource
} }
func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -208,7 +208,7 @@ func (t *postgresQueryResultTransformer) TransformQueryError(_ log.Logger, err e
// CheckHealth pings the connected SQL database // CheckHealth pings the connected SQL database
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
dsHandler, err := s.getDSInfo(req.PluginContext) dsHandler, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -24,7 +24,7 @@ var logger log.Logger = log.New("tsdb.prometheus")
func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult,
error) { error) {
logger := logger.FromContext(ctx) logger := logger.FromContext(ctx)
ds, err := s.getInstance(req.PluginContext) ds, err := s.getInstance(ctx, req.PluginContext)
// check that the datasource exists // check that the datasource exists
if err != nil { if err != nil {

@ -81,7 +81,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
return &backend.QueryDataResponse{}, fmt.Errorf("query contains no queries") return &backend.QueryDataResponse{}, fmt.Errorf("query contains no queries")
} }
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -90,7 +90,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
} }
func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
i, err := s.getInstance(req.PluginContext) i, err := s.getInstance(ctx, req.PluginContext)
if err != nil { if err != nil {
return err return err
} }
@ -117,8 +117,8 @@ func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceReq
return sender.Send(resp) return sender.Send(resp)
} }
func (s *Service) getInstance(pluginCtx backend.PluginContext) (*instance, error) { func (s *Service) getInstance(ctx context.Context, pluginCtx backend.PluginContext) (*instance, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -67,7 +67,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
return result, err return result, err
} }
dsInfo, err := s.getDSInfo(req.PluginContext) dsInfo, err := s.getDSInfo(ctx, req.PluginContext)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -135,8 +135,8 @@ func (s *Service) createRequest(ctx context.Context, dsInfo *datasourceInfo, tra
return req, nil return req, nil
} }
func (s *Service) getDSInfo(pluginCtx backend.PluginContext) (*datasourceInfo, error) { func (s *Service) getDSInfo(ctx context.Context, pluginCtx backend.PluginContext) (*datasourceInfo, error) {
i, err := s.im.Get(pluginCtx) i, err := s.im.Get(ctx, pluginCtx)
if err != nil { if err != nil {
return nil, err return nil, err
} }

Loading…
Cancel
Save