From 028d42a074803c54fd42d3baa76ebc5625b556f2 Mon Sep 17 00:00:00 2001 From: "grafana-delivery-bot[bot]" <132647405+grafana-delivery-bot[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 14:37:40 -0400 Subject: [PATCH] [v11.2.x] CloudWatch: Fix segfault when migrating legacy queries (#93544) CloudWatch: Fix segfault when migrating legacy queries (#93543) (cherry picked from commit 2ad558d0466514263deb137859b43715b36de6a8) Co-authored-by: Isabella Siu --- .../cloudwatch/models/cloudwatch_query.go | 6 +++- .../models/cloudwatch_query_test.go | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/pkg/tsdb/cloudwatch/models/cloudwatch_query.go b/pkg/tsdb/cloudwatch/models/cloudwatch_query.go index 6bc2999e3bf..2aff6763bd6 100644 --- a/pkg/tsdb/cloudwatch/models/cloudwatch_query.go +++ b/pkg/tsdb/cloudwatch/models/cloudwatch_query.go @@ -385,7 +385,11 @@ func (q *CloudWatchQuery) validateAndSetDefaults(refId string, metricsDataQuery func getStatistic(query metricsDataQuery) string { // If there's not a statistic property in the json, we know it's the legacy format and then it has to be migrated if query.Statistic == nil { - return query.Statistics[0] + if len(query.Statistics) > 0 { + return query.Statistics[0] + } + // if there isn't a statistic property in the legacy format fall back to Average + return "Average" } return *query.Statistic } diff --git a/pkg/tsdb/cloudwatch/models/cloudwatch_query_test.go b/pkg/tsdb/cloudwatch/models/cloudwatch_query_test.go index f1d2ebc21c9..0f4d7d3ed1b 100644 --- a/pkg/tsdb/cloudwatch/models/cloudwatch_query_test.go +++ b/pkg/tsdb/cloudwatch/models/cloudwatch_query_test.go @@ -296,6 +296,37 @@ func TestRequestParser(t *testing.T) { assert.Equal(t, "Average", migratedQuery.Statistic) }) + t.Run("legacy statistics field is migrated: if no stat, uses Average", func(t *testing.T) { + oldQuery := []backend.DataQuery{ + { + MaxDataPoints: 0, + QueryType: "timeSeriesQuery", + Interval: 0, + RefID: "A", + JSON: json.RawMessage(`{ + "region":"us-east-1", + "namespace":"ec2", + "metricName":"CPUUtilization", + "dimensions":{ + "InstanceId": ["test"] + }, + "statistics":[], + "period":"600", + "hide":false + }`), + }, + } + + migratedQueries, err := ParseMetricDataQueries(oldQuery, time.Now(), time.Now(), "us-east-2", logger, false) + assert.NoError(t, err) + require.Len(t, migratedQueries, 1) + require.NotNil(t, migratedQueries[0]) + + migratedQuery := migratedQueries[0] + assert.Equal(t, "A", migratedQuery.RefId) + assert.Equal(t, "Average", migratedQuery.Statistic) + }) + t.Run("New dimensions structure", func(t *testing.T) { query := []backend.DataQuery{ {