From b5747d397d090d4b26b37d9f0ca2aa3960516e56 Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Fri, 24 Feb 2023 19:30:38 +0100 Subject: [PATCH] [v9.4.x] CloudMonitoring: Fix crash when inspecting data for MQL queries (#63756) CloudMonitoring: Fix crash when inspecting data for MQL queries (#63747) CloudMonitoring: Fix missing Field name This happened for MQL queries that used an [aggregate function][1], e.g. `sum`. [1]: https://cloud.google.com/monitoring/mql/reference#aggr-function-group (cherry picked from commit 3672e44c1cfb3010303487abf9a23dd09ba147ba) Co-authored-by: Adam Simpson --- pkg/tsdb/cloudmonitoring/cloudmonitoring.go | 6 ++- .../10-series-response-mql-no-labels.json | 39 +++++++++++++++++++ .../time_series_filter_test.go | 19 +++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 pkg/tsdb/cloudmonitoring/test-data/10-series-response-mql-no-labels.json diff --git a/pkg/tsdb/cloudmonitoring/cloudmonitoring.go b/pkg/tsdb/cloudmonitoring/cloudmonitoring.go index 99c117b8f8d..7541ff36b02 100644 --- a/pkg/tsdb/cloudmonitoring/cloudmonitoring.go +++ b/pkg/tsdb/cloudmonitoring/cloudmonitoring.go @@ -480,7 +480,11 @@ func calculateAlignmentPeriod(alignmentPeriod string, intervalMs int64, duration func formatLegendKeys(metricType string, defaultMetricName string, labels map[string]string, additionalLabels map[string]string, query cloudMonitoringQueryExecutor) string { if query.getAliasBy() == "" { - return defaultMetricName + if defaultMetricName != "" { + return defaultMetricName + } + + return metricType } result := legendKeyFormat.ReplaceAllFunc([]byte(query.getAliasBy()), func(in []byte) []byte { diff --git a/pkg/tsdb/cloudmonitoring/test-data/10-series-response-mql-no-labels.json b/pkg/tsdb/cloudmonitoring/test-data/10-series-response-mql-no-labels.json new file mode 100644 index 00000000000..ccc6c303d09 --- /dev/null +++ b/pkg/tsdb/cloudmonitoring/test-data/10-series-response-mql-no-labels.json @@ -0,0 +1,39 @@ +{ + "timeSeriesDescriptor": { + "pointDescriptors": [ + { + "key": "value_utilization_sum", + "valueType": "DOUBLE", + "metricKind": "GAUGE" + } + ] + }, + "timeSeriesData": [ + { + "pointData": [ + { + "values": [ + { + "int64Value": "0" + } + ], + "timeInterval": { + "startTime": "2020-05-18T09:47:00Z", + "endTime": "2020-05-18T09:48:00Z" + } + }, + { + "values": [ + { + "int64Value": "0" + } + ], + "timeInterval": { + "startTime": "2020-05-18T09:46:00Z", + "endTime": "2020-05-18T09:47:00Z" + } + } + ] + } + ] +} diff --git a/pkg/tsdb/cloudmonitoring/time_series_filter_test.go b/pkg/tsdb/cloudmonitoring/time_series_filter_test.go index 003edb0ffad..5428cd045ce 100644 --- a/pkg/tsdb/cloudmonitoring/time_series_filter_test.go +++ b/pkg/tsdb/cloudmonitoring/time_series_filter_test.go @@ -396,6 +396,25 @@ func TestTimeSeriesFilter(t *testing.T) { }) }) + t.Run("field name is filled in for agg statement", func(t *testing.T) { + data, err := loadTestFile("./test-data/10-series-response-mql-no-labels.json") + require.NoError(t, err) + assert.Equal(t, 0, len(data.TimeSeries)) + assert.Equal(t, 1, len(data.TimeSeriesData)) + + res := &backend.DataResponse{} + query := &cloudMonitoringTimeSeriesQuery{ + parameters: &timeSeriesQuery{ + Query: "fetch gce_instance::compute.googleapis.com/instance/cpu/utilization | sum", + ProjectName: "test", + GraphPeriod: "60s", + }, + } + err = query.parseResponse(res, data, "") + require.NoError(t, err) + assert.Equal(t, "value_utilization_sum", res.Frames[0].Fields[1].Name) + }) + t.Run("Parse labels", func(t *testing.T) { data, err := loadTestFile("./test-data/5-series-response-meta-data.json") require.NoError(t, err)