From 0fb490c00d4adafa8c82c1b0a6a19f4638b1edd5 Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Mon, 21 Feb 2022 19:20:34 +0900 Subject: [PATCH] Cloud Monitoring: set missing meta data for distribution type metrics (#45500) * set missing meta data for distribution type metrics * add test * add test * simplify custom set * add test for executedQueryString * add test data * fix tests * check group by --- ...-response-distribution-without-points.json | 17 +++++ .../cloudmonitoring/time_series_filter.go | 10 +++ .../time_series_filter_test.go | 73 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 pkg/tsdb/cloudmonitoring/test-data/9-series-response-distribution-without-points.json diff --git a/pkg/tsdb/cloudmonitoring/test-data/9-series-response-distribution-without-points.json b/pkg/tsdb/cloudmonitoring/test-data/9-series-response-distribution-without-points.json new file mode 100644 index 00000000000..453d3913f01 --- /dev/null +++ b/pkg/tsdb/cloudmonitoring/test-data/9-series-response-distribution-without-points.json @@ -0,0 +1,17 @@ +{ + "timeSeries": [ + { + "metric": { + "type": "loadbalancing.googleapis.com\/https\/backend_latencies" + }, + "resource": { + "type": "https_lb_rule", + "labels": { + "project_id": "grafana-prod" + } + }, + "metricKind": "DELTA", + "valueType": "DISTRIBUTION" + } + ] +} diff --git a/pkg/tsdb/cloudmonitoring/time_series_filter.go b/pkg/tsdb/cloudmonitoring/time_series_filter.go index 818565f858b..2f924899e08 100644 --- a/pkg/tsdb/cloudmonitoring/time_series_filter.go +++ b/pkg/tsdb/cloudmonitoring/time_series_filter.go @@ -193,6 +193,9 @@ func (timeSeriesFilter *cloudMonitoringTimeSeriesFilter) parseResponse(queryRes valueField, }, RefID: timeSeriesFilter.RefID, + Meta: &data.FrameMeta{ + ExecutedQueryString: executedQueryString, + }, } if maxKey < i { @@ -220,13 +223,20 @@ func (timeSeriesFilter *cloudMonitoringTimeSeriesFilter) parseResponse(queryRes timeField, valueField, }, + Meta: &data.FrameMeta{ + ExecutedQueryString: executedQueryString, + }, } } } } for i := 0; i < len(buckets); i++ { + buckets[i].Meta.Custom = customFrameMeta frames = append(frames, buckets[i]) } + if len(buckets) == 0 { + frames = append(frames, frame) + } } if len(response.TimeSeries) > 0 { dl := timeSeriesFilter.buildDeepLink() diff --git a/pkg/tsdb/cloudmonitoring/time_series_filter_test.go b/pkg/tsdb/cloudmonitoring/time_series_filter_test.go index 909652a3731..72812087e51 100644 --- a/pkg/tsdb/cloudmonitoring/time_series_filter_test.go +++ b/pkg/tsdb/cloudmonitoring/time_series_filter_test.go @@ -11,6 +11,8 @@ import ( "time" "github.com/grafana/grafana-plugin-sdk-go/backend" + sdkdata "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -386,6 +388,77 @@ func TestTimeSeriesFilter(t *testing.T) { require.True(t, ok) assert.Equal(t, "114250375703598695", labels["resource.label.instance_id"]) }) + + t.Run("parseResponse successfully parses metadata for distribution valueType", func(t *testing.T) { + t.Run("exponential bounds", func(t *testing.T) { + data, err := loadTestFile("./test-data/3-series-response-distribution-exponential.json") + require.NoError(t, err) + assert.Equal(t, 1, len(data.TimeSeries)) + + res := &backend.DataResponse{} + require.NoError(t, (&cloudMonitoringTimeSeriesFilter{GroupBys: []string{"test_group_by"}}).parseResponse(res, data, "test_query")) + + require.NotNil(t, res.Frames[0].Meta) + assert.Equal(t, sdkdata.FrameMeta{ + ExecutedQueryString: "test_query", + Custom: map[string]interface{}{ + "groupBys": []string{"test_group_by"}, + "alignmentPeriod": "", + "labels": map[string]string{ + "resource.label.project_id": "grafana-prod", + "resource.type": "https_lb_rule", + }, + "perSeriesAligner": "", + }, + }, *res.Frames[0].Meta) + }) + + t.Run("explicit bounds", func(t *testing.T) { + data, err := loadTestFile("./test-data/4-series-response-distribution-explicit.json") + require.NoError(t, err) + assert.Equal(t, 1, len(data.TimeSeries)) + + res := &backend.DataResponse{} + require.NoError(t, (&cloudMonitoringTimeSeriesFilter{GroupBys: []string{"test_group_by"}}).parseResponse(res, data, "test_query")) + + require.NotNil(t, res.Frames[0].Meta) + assert.Equal(t, sdkdata.FrameMeta{ + ExecutedQueryString: "test_query", + Custom: map[string]interface{}{ + "groupBys": []string{"test_group_by"}, + "alignmentPeriod": "", + "labels": map[string]string{ + "resource.label.project_id": "grafana-demo", + "resource.type": "global", + }, + "perSeriesAligner": "", + }, + }, *res.Frames[0].Meta) + }) + + t.Run("without series points", func(t *testing.T) { + data, err := loadTestFile("./test-data/3-series-response-distribution-exponential.json") + require.NoError(t, err) + assert.Equal(t, 1, len(data.TimeSeries)) + + res := &backend.DataResponse{} + require.NoError(t, (&cloudMonitoringTimeSeriesFilter{GroupBys: []string{"test_group_by"}}).parseResponse(res, data, "test_query")) + + require.NotNil(t, res.Frames[0].Meta) + assert.Equal(t, sdkdata.FrameMeta{ + ExecutedQueryString: "test_query", + Custom: map[string]interface{}{ + "groupBys": []string{"test_group_by"}, + "alignmentPeriod": "", + "labels": map[string]string{ + "resource.label.project_id": "grafana-prod", + "resource.type": "https_lb_rule", + }, + "perSeriesAligner": "", + }, + }, *res.Frames[0].Meta) + }) + }) } func loadTestFile(path string) (cloudMonitoringResponse, error) {