mirror of
https://github.com/grafana/grafana.git
synced 2025-09-27 16:53:55 +08:00
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
This commit is contained in:
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -193,6 +193,9 @@ func (timeSeriesFilter *cloudMonitoringTimeSeriesFilter) parseResponse(queryRes
|
|||||||
valueField,
|
valueField,
|
||||||
},
|
},
|
||||||
RefID: timeSeriesFilter.RefID,
|
RefID: timeSeriesFilter.RefID,
|
||||||
|
Meta: &data.FrameMeta{
|
||||||
|
ExecutedQueryString: executedQueryString,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if maxKey < i {
|
if maxKey < i {
|
||||||
@ -220,13 +223,20 @@ func (timeSeriesFilter *cloudMonitoringTimeSeriesFilter) parseResponse(queryRes
|
|||||||
timeField,
|
timeField,
|
||||||
valueField,
|
valueField,
|
||||||
},
|
},
|
||||||
|
Meta: &data.FrameMeta{
|
||||||
|
ExecutedQueryString: executedQueryString,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for i := 0; i < len(buckets); i++ {
|
for i := 0; i < len(buckets); i++ {
|
||||||
|
buckets[i].Meta.Custom = customFrameMeta
|
||||||
frames = append(frames, buckets[i])
|
frames = append(frames, buckets[i])
|
||||||
}
|
}
|
||||||
|
if len(buckets) == 0 {
|
||||||
|
frames = append(frames, frame)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if len(response.TimeSeries) > 0 {
|
if len(response.TimeSeries) > 0 {
|
||||||
dl := timeSeriesFilter.buildDeepLink()
|
dl := timeSeriesFilter.buildDeepLink()
|
||||||
|
@ -11,6 +11,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
"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/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
@ -386,6 +388,77 @@ func TestTimeSeriesFilter(t *testing.T) {
|
|||||||
require.True(t, ok)
|
require.True(t, ok)
|
||||||
assert.Equal(t, "114250375703598695", labels["resource.label.instance_id"])
|
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) {
|
func loadTestFile(path string) (cloudMonitoringResponse, error) {
|
||||||
|
Reference in New Issue
Block a user