diff --git a/pkg/tsdb/cloudwatch/cloudwatch.go b/pkg/tsdb/cloudwatch/cloudwatch.go index c5308b7bfba..b93ba732f16 100644 --- a/pkg/tsdb/cloudwatch/cloudwatch.go +++ b/pkg/tsdb/cloudwatch/cloudwatch.go @@ -26,11 +26,12 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt" "github.com/grafana/grafana-plugin-sdk-go/backend/resource/httpadapter" "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/grafana/grafana/pkg/infra/httpclient" + "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/clients" - "github.com/grafana/grafana/pkg/tsdb/cloudwatch/cwlog" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" ) @@ -71,10 +72,11 @@ const ( timeSeriesQuery = "timeSeriesQuery" ) +var logger = log.New("tsdb.cloudwatch") var aliasFormat = regexp.MustCompile(`\{\{\s*(.+?)\s*\}\}`) func ProvideService(cfg *setting.Cfg, httpClientProvider httpclient.Provider, features featuremgmt.FeatureToggles) *CloudWatchService { - cwlog.Debug("initing") + logger.Debug("Initializing") executor := newExecutor(datasource.NewInstanceManager(NewInstanceSettings(httpClientProvider)), cfg, awsds.NewSessionCache(), features) @@ -308,6 +310,7 @@ func (e *cloudWatchExecutor) alertQuery(ctx context.Context, logsClient cloudwat } func (e *cloudWatchExecutor) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { + logger := logger.FromContext(ctx) /* Unlike many other data sources, with Cloudwatch Logs query requests don't receive the results as the response to the query, but rather an ID is first returned. Following this, a client is expected to send requests along @@ -333,11 +336,11 @@ func (e *cloudWatchExecutor) QueryData(ctx context.Context, req *backend.QueryDa case annotationQuery: result, err = e.executeAnnotationQuery(req.PluginContext, model, q) case logAction: - result, err = e.executeLogActions(ctx, req) + result, err = e.executeLogActions(ctx, logger, req) case timeSeriesQuery: fallthrough default: - result, err = e.executeTimeSeriesQuery(ctx, req) + result, err = e.executeTimeSeriesQuery(ctx, logger, req) } return result, err diff --git a/pkg/tsdb/cloudwatch/cwlog/cwlog.go b/pkg/tsdb/cloudwatch/cwlog/cwlog.go deleted file mode 100644 index 2cba4fb1f6e..00000000000 --- a/pkg/tsdb/cloudwatch/cwlog/cwlog.go +++ /dev/null @@ -1,19 +0,0 @@ -package cwlog - -import "github.com/grafana/grafana/pkg/infra/log" - -var ( - cwlog = log.New("tsdb.cloudwatch") -) - -func Warn(msg string, args ...interface{}) { - cwlog.Warn(msg, args) -} - -func Debug(msg string, args ...interface{}) { - cwlog.Debug(msg, args) -} - -func Error(msg string, args ...interface{}) { - cwlog.Error(msg, args) -} diff --git a/pkg/tsdb/cloudwatch/log_actions.go b/pkg/tsdb/cloudwatch/log_actions.go index c0b654f299e..f2f52d9cd64 100644 --- a/pkg/tsdb/cloudwatch/log_actions.go +++ b/pkg/tsdb/cloudwatch/log_actions.go @@ -14,8 +14,9 @@ import ( "github.com/aws/aws-sdk-go/service/cloudwatchlogs/cloudwatchlogsiface" "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/data" - "github.com/grafana/grafana/pkg/tsdb/cloudwatch/cwlog" "golang.org/x/sync/errgroup" + + "github.com/grafana/grafana/pkg/infra/log" ) const ( @@ -54,7 +55,7 @@ func (e *AWSError) Error() string { return fmt.Sprintf("%s: %s", e.Code, e.Message) } -func (e *cloudWatchExecutor) executeLogActions(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { +func (e *cloudWatchExecutor) executeLogActions(ctx context.Context, logger log.Logger, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { resp := backend.NewQueryDataResponse() resultChan := make(chan backend.Responses, len(req.Queries)) @@ -69,7 +70,7 @@ func (e *cloudWatchExecutor) executeLogActions(ctx context.Context, req *backend query := query eg.Go(func() error { - dataframe, err := e.executeLogAction(ectx, model, query, req.PluginContext) + dataframe, err := e.executeLogAction(ectx, logger, model, query, req.PluginContext) if err != nil { var AWSError *AWSError if errors.As(err, &AWSError) { @@ -109,7 +110,7 @@ func (e *cloudWatchExecutor) executeLogActions(ctx context.Context, req *backend return resp, nil } -func (e *cloudWatchExecutor) executeLogAction(ctx context.Context, model LogQueryJson, query backend.DataQuery, pluginCtx backend.PluginContext) (*data.Frame, error) { +func (e *cloudWatchExecutor) executeLogAction(ctx context.Context, logger log.Logger, model LogQueryJson, query backend.DataQuery, pluginCtx backend.PluginContext) (*data.Frame, error) { instance, err := e.getInstance(pluginCtx) if err != nil { return nil, err @@ -130,7 +131,7 @@ func (e *cloudWatchExecutor) executeLogAction(ctx context.Context, model LogQuer case "GetLogGroupFields": data, err = e.handleGetLogGroupFields(ctx, logsClient, model, query.RefID) case "StartQuery": - data, err = e.handleStartQuery(ctx, logsClient, model, query.TimeRange, query.RefID) + data, err = e.handleStartQuery(ctx, logger, logsClient, model, query.TimeRange, query.RefID) case "StopQuery": data, err = e.handleStopQuery(ctx, logsClient, model) case "GetQueryResults": @@ -235,13 +236,13 @@ func (e *cloudWatchExecutor) executeStartQuery(ctx context.Context, logsClient c return logsClient.StartQueryWithContext(ctx, startQueryInput) } -func (e *cloudWatchExecutor) handleStartQuery(ctx context.Context, logsClient cloudwatchlogsiface.CloudWatchLogsAPI, +func (e *cloudWatchExecutor) handleStartQuery(ctx context.Context, logger log.Logger, logsClient cloudwatchlogsiface.CloudWatchLogsAPI, model LogQueryJson, timeRange backend.TimeRange, refID string) (*data.Frame, error) { startQueryResponse, err := e.executeStartQuery(ctx, logsClient, model, timeRange) if err != nil { var awsErr awserr.Error if errors.As(err, &awsErr) && awsErr.Code() == "LimitExceededException" { - cwlog.Debug("executeStartQuery limit exceeded", "err", awsErr) + logger.Debug("executeStartQuery limit exceeded", "err", awsErr) return nil, &AWSError{Code: limitExceededException, Message: err.Error()} } return nil, err diff --git a/pkg/tsdb/cloudwatch/metric_data_input_builder.go b/pkg/tsdb/cloudwatch/metric_data_input_builder.go index 5244cbdd0d3..962e628b5f4 100644 --- a/pkg/tsdb/cloudwatch/metric_data_input_builder.go +++ b/pkg/tsdb/cloudwatch/metric_data_input_builder.go @@ -6,11 +6,12 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/cloudwatch" + "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" ) -func (e *cloudWatchExecutor) buildMetricDataInput(startTime time.Time, endTime time.Time, +func (e *cloudWatchExecutor) buildMetricDataInput(logger log.Logger, startTime time.Time, endTime time.Time, queries []*models.CloudWatchQuery) (*cloudwatch.GetMetricDataInput, error) { metricDataInput := &cloudwatch.GetMetricDataInput{ StartTime: aws.Time(startTime), @@ -27,7 +28,7 @@ func (e *cloudWatchExecutor) buildMetricDataInput(startTime time.Time, endTime t } for _, query := range queries { - metricDataQuery, err := e.buildMetricDataQuery(query) + metricDataQuery, err := e.buildMetricDataQuery(logger, query) if err != nil { return nil, &models.QueryError{Err: err, RefID: query.RefId} } diff --git a/pkg/tsdb/cloudwatch/metric_data_input_builder_test.go b/pkg/tsdb/cloudwatch/metric_data_input_builder_test.go index 64413627971..24b441eeba2 100644 --- a/pkg/tsdb/cloudwatch/metric_data_input_builder_test.go +++ b/pkg/tsdb/cloudwatch/metric_data_input_builder_test.go @@ -36,7 +36,7 @@ func TestMetricDataInputBuilder(t *testing.T) { from := now.Add(time.Hour * -2) to := now.Add(time.Hour * -1) - mdi, err := executor.buildMetricDataInput(from, to, []*models.CloudWatchQuery{query}) + mdi, err := executor.buildMetricDataInput(logger, from, to, []*models.CloudWatchQuery{query}) assert.NoError(t, err) require.NotNil(t, mdi) diff --git a/pkg/tsdb/cloudwatch/metric_data_query_builder.go b/pkg/tsdb/cloudwatch/metric_data_query_builder.go index 39bd8d21c3a..5baf0bb872b 100644 --- a/pkg/tsdb/cloudwatch/metric_data_query_builder.go +++ b/pkg/tsdb/cloudwatch/metric_data_query_builder.go @@ -8,11 +8,13 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/cloudwatch" + + "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" ) -func (e *cloudWatchExecutor) buildMetricDataQuery(query *models.CloudWatchQuery) (*cloudwatch.MetricDataQuery, error) { +func (e *cloudWatchExecutor) buildMetricDataQuery(logger log.Logger, query *models.CloudWatchQuery) (*cloudwatch.MetricDataQuery, error) { mdq := &cloudwatch.MetricDataQuery{ Id: aws.String(query.Id), ReturnData: aws.Bool(query.ReturnData), @@ -22,7 +24,7 @@ func (e *cloudWatchExecutor) buildMetricDataQuery(query *models.CloudWatchQuery) mdq.Label = &query.Label } - switch query.GetGMDAPIMode() { + switch query.GetGMDAPIMode(logger) { case models.GMDApiModeMathExpression: mdq.Period = aws.Int64(int64(query.Period)) mdq.Expression = aws.String(query.Expression) diff --git a/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go b/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go index 2815f5a7d10..b13c389504c 100644 --- a/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go +++ b/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go @@ -3,10 +3,11 @@ package cloudwatch import ( "testing" - "github.com/grafana/grafana/pkg/services/featuremgmt" - "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" ) func TestMetricDataQueryBuilder(t *testing.T) { @@ -16,7 +17,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { query := getBaseQuery() query.MetricEditorMode = models.MetricEditorModeBuilder query.MetricQueryType = models.MetricQueryTypeSearch - mdq, err := executor.buildMetricDataQuery(query) + mdq, err := executor.buildMetricDataQuery(logger, query) require.NoError(t, err) require.Empty(t, mdq.Expression) assert.Equal(t, query.MetricName, *mdq.MetricStat.Metric.MetricName) @@ -29,7 +30,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { query.MetricEditorMode = models.MetricEditorModeBuilder query.MetricQueryType = models.MetricQueryTypeSearch query.MatchExact = false - mdq, err := executor.buildMetricDataQuery(query) + mdq, err := executor.buildMetricDataQuery(logger, query) require.NoError(t, err) require.Nil(t, mdq.MetricStat) assert.Equal(t, `REMOVE_EMPTY(SEARCH('Namespace="AWS/EC2" MetricName="CPUUtilization" "LoadBalancer"="lb1"', '', 300))`, *mdq.Expression) @@ -41,7 +42,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { query.MetricEditorMode = models.MetricEditorModeRaw query.MetricQueryType = models.MetricQueryTypeQuery query.SqlExpression = `SELECT SUM(CPUUTilization) FROM "AWS/EC2"` - mdq, err := executor.buildMetricDataQuery(query) + mdq, err := executor.buildMetricDataQuery(logger, query) require.NoError(t, err) require.Nil(t, mdq.MetricStat) assert.Equal(t, query.SqlExpression, *mdq.Expression) @@ -53,7 +54,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { query.MetricEditorMode = models.MetricEditorModeRaw query.MetricQueryType = models.MetricQueryTypeSearch query.Expression = `SUM(x+y)` - mdq, err := executor.buildMetricDataQuery(query) + mdq, err := executor.buildMetricDataQuery(logger, query) require.NoError(t, err) require.Nil(t, mdq.MetricStat) assert.Equal(t, query.Expression, *mdq.Expression) @@ -66,7 +67,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { query.MetricQueryType = models.MetricQueryTypeSearch query.MatchExact = false query.Expression = `SUM([a,b])` - mdq, err := executor.buildMetricDataQuery(query) + mdq, err := executor.buildMetricDataQuery(logger, query) require.NoError(t, err) require.Nil(t, mdq.MetricStat) assert.Equal(t, int64(300), *mdq.Period) @@ -78,7 +79,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { query := getBaseQuery() query.Label = "some label" - mdq, err := executor.buildMetricDataQuery(query) + mdq, err := executor.buildMetricDataQuery(logger, query) assert.NoError(t, err) require.NotNil(t, mdq.Label) @@ -105,7 +106,7 @@ func TestMetricDataQueryBuilder(t *testing.T) { query := getBaseQuery() query.Label = tc.label - mdq, err := executor.buildMetricDataQuery(query) + mdq, err := executor.buildMetricDataQuery(logger, query) assert.NoError(t, err) assert.Nil(t, mdq.Label) diff --git a/pkg/tsdb/cloudwatch/metric_find_query.go b/pkg/tsdb/cloudwatch/metric_find_query.go index 707a2b51fbd..cb7c658c483 100644 --- a/pkg/tsdb/cloudwatch/metric_find_query.go +++ b/pkg/tsdb/cloudwatch/metric_find_query.go @@ -17,8 +17,8 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" "github.com/aws/aws-sdk-go/service/resourcegroupstaggingapi" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana/pkg/tsdb/cloudwatch/constants" - "github.com/grafana/grafana/pkg/tsdb/cloudwatch/cwlog" ) type suggestData struct { @@ -66,7 +66,7 @@ func (e *cloudWatchExecutor) handleGetRegions(pluginCtx backend.PluginContext, p r, err := client.DescribeRegions(&ec2.DescribeRegionsInput{}) if err != nil { // ignore error for backward compatibility - cwlog.Error("Failed to get regions", "error", err) + logger.Error("Failed to get regions", "error", err) } else { for _, region := range r.Regions { exists := false diff --git a/pkg/tsdb/cloudwatch/models/cloudwatch_query.go b/pkg/tsdb/cloudwatch/models/cloudwatch_query.go index 2243919c5b0..906100693fd 100644 --- a/pkg/tsdb/cloudwatch/models/cloudwatch_query.go +++ b/pkg/tsdb/cloudwatch/models/cloudwatch_query.go @@ -14,7 +14,8 @@ import ( "github.com/google/uuid" "github.com/grafana/grafana-plugin-sdk-go/backend" - "github.com/grafana/grafana/pkg/tsdb/cloudwatch/cwlog" + + "github.com/grafana/grafana/pkg/infra/log" ) type ( @@ -61,7 +62,7 @@ type CloudWatchQuery struct { MetricEditorMode MetricEditorMode } -func (q *CloudWatchQuery) GetGMDAPIMode() GMDApiMode { +func (q *CloudWatchQuery) GetGMDAPIMode(logger log.Logger) GMDApiMode { if q.MetricQueryType == MetricQueryTypeSearch && q.MetricEditorMode == MetricEditorModeBuilder { if q.IsInferredSearchExpression() { return GMDApiModeInferredSearchExpression @@ -73,7 +74,7 @@ func (q *CloudWatchQuery) GetGMDAPIMode() GMDApiMode { return GMDApiModeSQLExpression } - cwlog.Warn("could not resolve CloudWatch metric query type. Falling back to metric stat.", "query", q) + logger.Warn("could not resolve CloudWatch metric query type. Falling back to metric stat.", "query", q) return GMDApiModeMetricStat } diff --git a/pkg/tsdb/cloudwatch/models/cloudwatch_query_test.go b/pkg/tsdb/cloudwatch/models/cloudwatch_query_test.go index 307a1533556..d2467b2ed46 100644 --- a/pkg/tsdb/cloudwatch/models/cloudwatch_query_test.go +++ b/pkg/tsdb/cloudwatch/models/cloudwatch_query_test.go @@ -10,6 +10,8 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/grafana/grafana/pkg/infra/log/logtest" ) func TestCloudWatchQuery(t *testing.T) { @@ -642,7 +644,7 @@ func Test_ParseMetricDataQueries_query_type_and_metric_editor_mode_and_GMD_query require.NotNil(t, res[0]) assert.Equal(t, tc.expectedMetricQueryType, res[0].MetricQueryType) assert.Equal(t, tc.expectedMetricEditorMode, res[0].MetricEditorMode) - assert.Equal(t, tc.expectedGMDApiMode, res[0].GetGMDAPIMode()) + assert.Equal(t, tc.expectedGMDApiMode, res[0].GetGMDAPIMode(&logtest.Fake{})) }) } } diff --git a/pkg/tsdb/cloudwatch/resource_handler.go b/pkg/tsdb/cloudwatch/resource_handler.go index b0cb50d9ac3..d9c88baebd8 100644 --- a/pkg/tsdb/cloudwatch/resource_handler.go +++ b/pkg/tsdb/cloudwatch/resource_handler.go @@ -8,7 +8,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend/resource/httpadapter" - "github.com/grafana/grafana/pkg/tsdb/cloudwatch/cwlog" + "github.com/grafana/grafana/pkg/tsdb/cloudwatch/routes" ) @@ -20,10 +20,10 @@ func (e *cloudWatchExecutor) newResourceMux() *http.ServeMux { mux.HandleFunc("/resource-arns", handleResourceReq(e.handleGetResourceArns)) mux.HandleFunc("/log-groups", handleResourceReq(e.handleGetLogGroups)) mux.HandleFunc("/all-log-groups", handleResourceReq(e.handleGetAllLogGroups)) - mux.HandleFunc("/metrics", routes.ResourceRequestMiddleware(routes.MetricsHandler, e.getRequestContext)) - mux.HandleFunc("/dimension-values", routes.ResourceRequestMiddleware(routes.DimensionValuesHandler, e.getRequestContext)) - mux.HandleFunc("/dimension-keys", routes.ResourceRequestMiddleware(routes.DimensionKeysHandler, e.getRequestContext)) - mux.HandleFunc("/namespaces", routes.ResourceRequestMiddleware(routes.NamespacesHandler, e.getRequestContext)) + mux.HandleFunc("/metrics", routes.ResourceRequestMiddleware(routes.MetricsHandler, logger, e.getRequestContext)) + mux.HandleFunc("/dimension-values", routes.ResourceRequestMiddleware(routes.DimensionValuesHandler, logger, e.getRequestContext)) + mux.HandleFunc("/dimension-keys", routes.ResourceRequestMiddleware(routes.DimensionKeysHandler, logger, e.getRequestContext)) + mux.HandleFunc("/namespaces", routes.ResourceRequestMiddleware(routes.NamespacesHandler, logger, e.getRequestContext)) return mux } @@ -48,7 +48,7 @@ func handleResourceReq(handleFunc handleFn) func(rw http.ResponseWriter, req *ht rw.WriteHeader(http.StatusOK) _, err = rw.Write(body) if err != nil { - cwlog.Error("Unable to write HTTP response", "error", err) + logger.Error("Unable to write HTTP response", "error", err) } } } @@ -57,6 +57,6 @@ func writeResponse(rw http.ResponseWriter, code int, msg string) { rw.WriteHeader(code) _, err := rw.Write([]byte(msg)) if err != nil { - cwlog.Error("Unable to write HTTP response", "error", err) + logger.Error("Unable to write HTTP response", "error", err) } } diff --git a/pkg/tsdb/cloudwatch/routes/dimension_keys_test.go b/pkg/tsdb/cloudwatch/routes/dimension_keys_test.go index 4bebf57934b..d86ccc9f98e 100644 --- a/pkg/tsdb/cloudwatch/routes/dimension_keys_test.go +++ b/pkg/tsdb/cloudwatch/routes/dimension_keys_test.go @@ -8,13 +8,17 @@ import ( "testing" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/grafana/grafana/pkg/infra/log/logtest" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/mocks" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/services" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) +var logger = &logtest.Fake{} + func Test_DimensionKeys_Route(t *testing.T) { t.Run("calls FilterDimensionKeysRequest when a StandardDimensionKeysRequest is passed", func(t *testing.T) { mockListMetricsService := mocks.ListMetricsServiceMock{} @@ -24,7 +28,7 @@ func Test_DimensionKeys_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", `/dimension-keys?region=us-east-2&namespace=AWS/EC2&metricName=CPUUtilization&dimensionFilters={"NodeID":["Shared"],"stage":["QueryCommit"]}`, nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionKeysHandler, nil)) + handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionKeysHandler, logger, nil)) handler.ServeHTTP(rr, req) mockListMetricsService.AssertNumberOfCalls(t, "GetDimensionKeysByDimensionFilter", 1) }) @@ -37,7 +41,7 @@ func Test_DimensionKeys_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", `/dimension-keys?region=us-east-2&namespace=custom&metricName=CPUUtilization`, nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionKeysHandler, nil)) + handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionKeysHandler, logger, nil)) handler.ServeHTTP(rr, req) mockListMetricsService.AssertNumberOfCalls(t, "GetDimensionKeysByNamespace", 1) }) @@ -56,7 +60,7 @@ func Test_DimensionKeys_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", "/dimension-keys?region=us-east-2&namespace=AWS/EC2&metricName=CPUUtilization", nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionKeysHandler, nil)) + handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionKeysHandler, logger, nil)) handler.ServeHTTP(rr, req) res := []models.Metric{} err := json.Unmarshal(rr.Body.Bytes(), &res) @@ -73,7 +77,7 @@ func Test_DimensionKeys_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", `/dimension-keys?region=us-east-2&namespace=AWS/EC2&metricName=CPUUtilization&dimensionFilters={"NodeID":["Shared"],"stage":["QueryCommit"]}`, nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionKeysHandler, nil)) + handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionKeysHandler, logger, nil)) handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusInternalServerError, rr.Code) assert.Equal(t, `{"Message":"error in DimensionKeyHandler: some error","Error":"some error","StatusCode":500}`, rr.Body.String()) diff --git a/pkg/tsdb/cloudwatch/routes/dimension_values_test.go b/pkg/tsdb/cloudwatch/routes/dimension_values_test.go index 88edf1d79c5..444b6972d7b 100644 --- a/pkg/tsdb/cloudwatch/routes/dimension_values_test.go +++ b/pkg/tsdb/cloudwatch/routes/dimension_values_test.go @@ -7,9 +7,10 @@ import ( "testing" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/stretchr/testify/assert" + "github.com/grafana/grafana/pkg/tsdb/cloudwatch/mocks" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" - "github.com/stretchr/testify/assert" ) func Test_DimensionValues_Route(t *testing.T) { @@ -21,7 +22,7 @@ func Test_DimensionValues_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", `/dimension-values?region=us-east-2&dimensionKey=instanceId&namespace=AWS/EC2&metricName=CPUUtilization&dimensionFilters={"NodeID":["Shared"],"stage":["QueryCommit"]}`, nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionValuesHandler, nil)) + handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionValuesHandler, logger, nil)) handler.ServeHTTP(rr, req) }) @@ -33,7 +34,7 @@ func Test_DimensionValues_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", `/dimension-values?region=us-east-2&dimensionKey=instanceId&namespace=AWS/EC2&metricName=CPUUtilization&dimensionFilters={"NodeID":["Shared"],"stage":["QueryCommit"]}`, nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionValuesHandler, nil)) + handler := http.HandlerFunc(ResourceRequestMiddleware(DimensionValuesHandler, logger, nil)) handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusInternalServerError, rr.Code) assert.Equal(t, `{"Message":"error in DimensionValuesHandler: some error","Error":"some error","StatusCode":500}`, rr.Body.String()) diff --git a/pkg/tsdb/cloudwatch/routes/metrics_test.go b/pkg/tsdb/cloudwatch/routes/metrics_test.go index fb153e23ca7..4cc991d6f43 100644 --- a/pkg/tsdb/cloudwatch/routes/metrics_test.go +++ b/pkg/tsdb/cloudwatch/routes/metrics_test.go @@ -8,11 +8,12 @@ import ( "testing" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/grafana/grafana/pkg/tsdb/cloudwatch/mocks" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/services" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func Test_Metrics_Route(t *testing.T) { @@ -24,7 +25,7 @@ func Test_Metrics_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", "/metrics?region=us-east-2&namespace=customNamespace", nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(MetricsHandler, nil)) + handler := http.HandlerFunc(ResourceRequestMiddleware(MetricsHandler, logger, nil)) handler.ServeHTTP(rr, req) mockListMetricsService.AssertNumberOfCalls(t, "GetMetricsByNamespace", 1) }) @@ -41,7 +42,7 @@ func Test_Metrics_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", "/metrics?region=us-east-2", nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(MetricsHandler, nil)) + handler := http.HandlerFunc(ResourceRequestMiddleware(MetricsHandler, logger, nil)) handler.ServeHTTP(rr, req) res := []models.Metric{} err := json.Unmarshal(rr.Body.Bytes(), &res) @@ -63,7 +64,7 @@ func Test_Metrics_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", "/metrics?region=us-east-2&namespace=AWS/DMS", nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(MetricsHandler, nil)) + handler := http.HandlerFunc(ResourceRequestMiddleware(MetricsHandler, logger, nil)) handler.ServeHTTP(rr, req) res := []models.Metric{} err := json.Unmarshal(rr.Body.Bytes(), &res) @@ -80,7 +81,7 @@ func Test_Metrics_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", "/metrics?region=us-east-2&namespace=customNamespace", nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(MetricsHandler, nil)) + handler := http.HandlerFunc(ResourceRequestMiddleware(MetricsHandler, logger, nil)) handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusInternalServerError, rr.Code) assert.Equal(t, `{"Message":"error in MetricsHandler: some error","Error":"some error","StatusCode":500}`, rr.Body.String()) diff --git a/pkg/tsdb/cloudwatch/routes/middleware.go b/pkg/tsdb/cloudwatch/routes/middleware.go index 0a6450df6f4..51323cf5729 100644 --- a/pkg/tsdb/cloudwatch/routes/middleware.go +++ b/pkg/tsdb/cloudwatch/routes/middleware.go @@ -4,11 +4,12 @@ import ( "net/http" "github.com/grafana/grafana-plugin-sdk-go/backend/resource/httpadapter" - "github.com/grafana/grafana/pkg/tsdb/cloudwatch/cwlog" + + "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" ) -func ResourceRequestMiddleware(handleFunc models.RouteHandlerFunc, reqCtxFactory models.RequestContextFactoryFunc) func(rw http.ResponseWriter, req *http.Request) { +func ResourceRequestMiddleware(handleFunc models.RouteHandlerFunc, logger log.Logger, reqCtxFactory models.RequestContextFactoryFunc) func(rw http.ResponseWriter, req *http.Request) { return func(rw http.ResponseWriter, req *http.Request) { if req.Method != "GET" { respondWithError(rw, models.NewHttpError("Invalid method", http.StatusMethodNotAllowed, nil)) @@ -19,7 +20,7 @@ func ResourceRequestMiddleware(handleFunc models.RouteHandlerFunc, reqCtxFactory pluginContext := httpadapter.PluginConfigFromContext(ctx) json, httpError := handleFunc(pluginContext, reqCtxFactory, req.URL.Query()) if httpError != nil { - cwlog.Error("error handling resource request", "error", httpError.Message) + logger.Error("error handling resource request", "error", httpError.Message) respondWithError(rw, httpError) return } @@ -27,7 +28,7 @@ func ResourceRequestMiddleware(handleFunc models.RouteHandlerFunc, reqCtxFactory rw.Header().Set("Content-Type", "application/json") _, err := rw.Write(json) if err != nil { - cwlog.Error("error handling resource request", "error", err) + logger.Error("error handling resource request", "error", err) respondWithError(rw, models.NewHttpError("error writing response in resource request middleware", http.StatusInternalServerError, err)) } } diff --git a/pkg/tsdb/cloudwatch/routes/middleware_test.go b/pkg/tsdb/cloudwatch/routes/middleware_test.go index bac698eed61..cfd93c54245 100644 --- a/pkg/tsdb/cloudwatch/routes/middleware_test.go +++ b/pkg/tsdb/cloudwatch/routes/middleware_test.go @@ -8,8 +8,9 @@ import ( "testing" "github.com/grafana/grafana-plugin-sdk-go/backend" - "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" "github.com/stretchr/testify/assert" + + "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" ) func Test_Middleware(t *testing.T) { @@ -18,7 +19,7 @@ func Test_Middleware(t *testing.T) { 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) { return []byte{}, nil - }, nil)) + }, logger, nil)) handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusMethodNotAllowed, rr.Code) }) @@ -30,7 +31,7 @@ func Test_Middleware(t *testing.T) { handler := http.HandlerFunc(ResourceRequestMiddleware(func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { testPluginContext = pluginCtx return []byte{}, nil - }, nil)) + }, logger, nil)) handler.ServeHTTP(rr, req) assert.NotNil(t, testPluginContext) }) @@ -40,7 +41,7 @@ func Test_Middleware(t *testing.T) { req := httptest.NewRequest("GET", "/some-path", nil) handler := http.HandlerFunc(ResourceRequestMiddleware(func(pluginCtx backend.PluginContext, reqCtxFactory models.RequestContextFactoryFunc, parameters url.Values) ([]byte, *models.HttpError) { return []byte{}, models.NewHttpError("error", http.StatusBadRequest, fmt.Errorf("error from handler")) - }, nil)) + }, logger, nil)) handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusBadRequest, rr.Code) assert.Equal(t, `{"Message":"error: error from handler","Error":"error from handler","StatusCode":400}`, rr.Body.String()) diff --git a/pkg/tsdb/cloudwatch/routes/namespaces_test.go b/pkg/tsdb/cloudwatch/routes/namespaces_test.go index dffce86f65c..5f95525ebf9 100644 --- a/pkg/tsdb/cloudwatch/routes/namespaces_test.go +++ b/pkg/tsdb/cloudwatch/routes/namespaces_test.go @@ -6,9 +6,10 @@ import ( "testing" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/stretchr/testify/assert" + "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/services" - "github.com/stretchr/testify/assert" ) func Test_Namespaces_Route(t *testing.T) { @@ -33,7 +34,7 @@ func Test_Namespaces_Route(t *testing.T) { } rr := httptest.NewRecorder() req := httptest.NewRequest("GET", "/namespaces", nil) - handler := http.HandlerFunc(ResourceRequestMiddleware(NamespacesHandler, factoryFunc)) + handler := http.HandlerFunc(ResourceRequestMiddleware(NamespacesHandler, logger, factoryFunc)) handler.ServeHTTP(rr, req) assert.True(t, haveBeenCalled) }) @@ -49,7 +50,7 @@ func Test_Namespaces_Route(t *testing.T) { rr := httptest.NewRecorder() req := httptest.NewRequest("GET", "/namespaces", nil) customNamespaces = "customNamespace1,customNamespace2" - handler := http.HandlerFunc(ResourceRequestMiddleware(NamespacesHandler, factoryFunc)) + handler := http.HandlerFunc(ResourceRequestMiddleware(NamespacesHandler, logger, factoryFunc)) handler.ServeHTTP(rr, req) assert.JSONEq(t, `["AWS/EC2", "AWS/ELB", "customNamespace1", "customNamespace2"]`, rr.Body.String()) }) @@ -65,7 +66,7 @@ func Test_Namespaces_Route(t *testing.T) { rr := httptest.NewRecorder() req := httptest.NewRequest("GET", "/namespaces", nil) customNamespaces = "DCustomNamespace1,ACustomNamespace2" - handler := http.HandlerFunc(ResourceRequestMiddleware(NamespacesHandler, factoryFunc)) + handler := http.HandlerFunc(ResourceRequestMiddleware(NamespacesHandler, logger, factoryFunc)) handler.ServeHTTP(rr, req) assert.JSONEq(t, `["ACustomNamespace2", "AWS/ELB", "AWS/XYZ", "DCustomNamespace1"]`, rr.Body.String()) }) diff --git a/pkg/tsdb/cloudwatch/time_series_query.go b/pkg/tsdb/cloudwatch/time_series_query.go index 053e5d77cdc..b3d2fc4d8b3 100644 --- a/pkg/tsdb/cloudwatch/time_series_query.go +++ b/pkg/tsdb/cloudwatch/time_series_query.go @@ -5,11 +5,11 @@ import ( "fmt" "github.com/grafana/grafana-plugin-sdk-go/backend" + "golang.org/x/sync/errgroup" + "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/services/featuremgmt" - "github.com/grafana/grafana/pkg/tsdb/cloudwatch/cwlog" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" - "golang.org/x/sync/errgroup" ) type responseWrapper struct { @@ -17,8 +17,8 @@ type responseWrapper struct { RefId string } -func (e *cloudWatchExecutor) executeTimeSeriesQuery(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { - cwlog.Debug("Executing time series query") +func (e *cloudWatchExecutor) executeTimeSeriesQuery(ctx context.Context, logger log.Logger, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { + logger.Debug("Executing time series query") resp := backend.NewQueryDataResponse() if len(req.Queries) == 0 { @@ -56,7 +56,7 @@ func (e *cloudWatchExecutor) executeTimeSeriesQuery(ctx context.Context, req *ba eg.Go(func() error { defer func() { if err := recover(); err != nil { - cwlog.Error("Execute Get Metric Data Query Panic", "error", err, "stack", log.Stack(1)) + logger.Error("Execute Get Metric Data Query Panic", "error", err, "stack", log.Stack(1)) if theErr, ok := err.(error); ok { resultChan <- &responseWrapper{ DataResponse: &backend.DataResponse{ @@ -72,7 +72,7 @@ func (e *cloudWatchExecutor) executeTimeSeriesQuery(ctx context.Context, req *ba return err } - metricDataInput, err := e.buildMetricDataInput(startTime, endTime, requestQueries) + metricDataInput, err := e.buildMetricDataInput(logger, startTime, endTime, requestQueries) if err != nil { return err } diff --git a/pkg/tsdb/cloudwatch/time_series_query_test.go b/pkg/tsdb/cloudwatch/time_series_query_test.go index 1ceff736b2e..1e1b7dd0b37 100644 --- a/pkg/tsdb/cloudwatch/time_series_query_test.go +++ b/pkg/tsdb/cloudwatch/time_series_query_test.go @@ -126,7 +126,7 @@ func TestTimeSeriesQuery(t *testing.T) { }) t.Run("End time before start time should result in error", func(t *testing.T) { - _, err := executor.executeTimeSeriesQuery(context.Background(), &backend.QueryDataRequest{Queries: []backend.DataQuery{{TimeRange: backend.TimeRange{ + _, err := executor.executeTimeSeriesQuery(context.Background(), logger, &backend.QueryDataRequest{Queries: []backend.DataQuery{{TimeRange: backend.TimeRange{ From: now.Add(time.Hour * -1), To: now.Add(time.Hour * -2), }}}}) @@ -134,7 +134,7 @@ func TestTimeSeriesQuery(t *testing.T) { }) t.Run("End time equals start time should result in error", func(t *testing.T) { - _, err := executor.executeTimeSeriesQuery(context.Background(), &backend.QueryDataRequest{Queries: []backend.DataQuery{{TimeRange: backend.TimeRange{ + _, err := executor.executeTimeSeriesQuery(context.Background(), logger, &backend.QueryDataRequest{Queries: []backend.DataQuery{{TimeRange: backend.TimeRange{ From: now.Add(time.Hour * -1), To: now.Add(time.Hour * -1), }}}})