From e0dbd8f3f2a7e9a186e9c6bbe49e55bb7037b3f4 Mon Sep 17 00:00:00 2001 From: "grafana-delivery-bot[bot]" <132647405+grafana-delivery-bot[bot]@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:33:49 -0400 Subject: [PATCH] [v11.1.x] CloudWatch: Fix raw queries with dimensions set (#90387) CloudWatch: Fix raw queries with dimensions set (#90348) (cherry picked from commit 9a8be1785a65774b6d951806622ca161a8fc021a) Co-authored-by: Isabella Siu --- pkg/tsdb/cloudwatch/response_parser.go | 6 ++++ pkg/tsdb/cloudwatch/response_parser_test.go | 40 ++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/pkg/tsdb/cloudwatch/response_parser.go b/pkg/tsdb/cloudwatch/response_parser.go index bb3310db73e..0dd89476300 100644 --- a/pkg/tsdb/cloudwatch/response_parser.go +++ b/pkg/tsdb/cloudwatch/response_parser.go @@ -110,6 +110,12 @@ func parseLabels(cloudwatchLabel string, query *models.CloudWatchQuery) (string, // set Series to the name of the time series as a fallback labels := data.Labels{"Series": name} + + // do not parse labels for raw queries + if query.MetricEditorMode == models.MetricEditorModeRaw { + return name, labels + } + for _, dim := range dims { values := query.Dimensions[dim] if isSingleValue(values) { diff --git a/pkg/tsdb/cloudwatch/response_parser_test.go b/pkg/tsdb/cloudwatch/response_parser_test.go index b9ee587ef48..39e09c8d724 100644 --- a/pkg/tsdb/cloudwatch/response_parser_test.go +++ b/pkg/tsdb/cloudwatch/response_parser_test.go @@ -405,7 +405,7 @@ func Test_buildDataFrames_parse_label_to_name_and_labels(t *testing.T) { Statistic: "Average", Period: 60, MetricQueryType: models.MetricQueryTypeSearch, - MetricEditorMode: models.MetricEditorModeRaw, + MetricEditorMode: models.MetricEditorModeBuilder, } frames, err := buildDataFrames(contextWithFeaturesEnabled(features.FlagCloudWatchNewLabelParsing), startTime, endTime, *response, query) require.NoError(t, err) @@ -612,6 +612,44 @@ func Test_buildDataFrames_parse_label_to_name_and_labels(t *testing.T) { assert.Equal(t, "cloudwatch-default-label", frames[0].Fields[1].Labels["Series"]) }) + t.Run("ignore dimensions for raw mode query", func(t *testing.T) { + timestamp := time.Unix(0, 0) + response := &models.QueryRowResponse{ + Metrics: []*cloudwatch.MetricDataResult{ + { + Id: aws.String("lb3"), + Label: aws.String("some label"), + Timestamps: []*time.Time{ + aws.Time(timestamp), + }, + Values: []*float64{aws.Float64(23)}, + StatusCode: aws.String("Complete"), + }, + }, + } + + query := &models.CloudWatchQuery{ + RefId: "refId1", + Region: "us-east-1", + Namespace: "AWS/ApplicationELB", + MetricName: "TargetResponseTime", + Dimensions: map[string][]string{ + "LoadBalancer": {"*"}, + }, + Expression: "SEARCH('MetricName=\"ResourceCount\" AND (\"AWS/Usage\") AND Resource=TargetsPer NOT QueueName=TargetsPerNetworkLoadBalancer', 'Average')", + Statistic: "Average", + Period: 60, + MetricQueryType: models.MetricQueryTypeSearch, + MetricEditorMode: models.MetricEditorModeRaw, + } + frames, err := buildDataFrames(contextWithFeaturesEnabled(features.FlagCloudWatchNewLabelParsing), startTime, endTime, *response, query) + require.NoError(t, err) + + assert.Equal(t, "some label", frames[0].Name) + assert.Len(t, frames[0].Fields[1].Labels, 1) + assert.Equal(t, "some label", frames[0].Fields[1].Labels["Series"]) + }) + t.Run("Parse cloudwatch response", func(t *testing.T) { timestamp := time.Unix(0, 0) response := &models.QueryRowResponse{