fixes invalid no data alerts in influx datasource (#48295)

This commit is contained in:
Sriram 2022-04-27 08:20:31 +01:00 committed by GitHub
parent 5294a2af48
commit 7798b08b1e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 88 additions and 3 deletions

View File

@ -91,7 +91,7 @@ func transformRows(rows []Row, query Query) data.Frames {
var floatArray []*float64
var stringArray []string
var boolArray []bool
valType := typeof(row.Values[0][colIndex])
valType := typeof(row.Values, colIndex)
name := formatFrameName(row, column, query)
for _, valuePair := range row.Values {
@ -108,6 +108,8 @@ func transformRows(rows []Row, query Query) data.Frames {
} else if valType == "bool" {
value := valuePair[colIndex].(bool)
boolArray = append(boolArray, value)
} else if valType == "null" {
floatArray = append(floatArray, nil)
}
}
}
@ -125,6 +127,10 @@ func transformRows(rows []Row, query Query) data.Frames {
valueField := data.NewField("value", row.Tags, boolArray)
valueField.SetConfig(&data.FieldConfig{DisplayNameFromDS: name})
frames = append(frames, newDataFrame(name, query.RawQuery, timeField, valueField))
} else if valType == "null" {
valueField := data.NewField("value", row.Tags, floatArray)
valueField.SetConfig(&data.FieldConfig{DisplayNameFromDS: name})
frames = append(frames, newDataFrame(name, query.RawQuery, timeField, valueField))
}
}
}
@ -213,8 +219,13 @@ func parseTimestamp(value interface{}) (time.Time, error) {
return t, nil
}
func typeof(v interface{}) string {
return fmt.Sprintf("%T", v)
func typeof(values [][]interface{}, colIndex int) string {
for _, value := range values {
if value != nil && value[colIndex] != nil {
return fmt.Sprintf("%T", value[colIndex])
}
}
return "null"
}
func parseNumber(value interface{}) *float64 {

View File

@ -9,6 +9,7 @@ import (
"time"
"github.com/google/go-cmp/cmp"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@ -729,3 +730,76 @@ func TestInfluxdbResponseParser(t *testing.T) {
require.Error(t, err)
})
}
func TestResponseParser_Parse(t *testing.T) {
tests := []struct {
name string
input string
f func(t *testing.T, got *backend.QueryDataResponse)
}{
{
name: "Influxdb response parser with valid value when null values returned",
input: `{ "results": [ { "series": [ {
"name": "cpu",
"columns": ["time","mean"],
"values": [
[100,null],
[101,null],
[102,52]
]
}]}]}`,
f: func(t *testing.T, got *backend.QueryDataResponse) {
newField := data.NewField("value", nil, []*float64{nil, nil, pointer.Float64(52)})
newField.Config = &data.FieldConfig{DisplayNameFromDS: "cpu.mean"}
testFrame := data.NewFrame("cpu.mean",
data.NewField("time", nil,
[]time.Time{
time.Date(1970, 1, 1, 0, 1, 40, 0, time.UTC),
time.Date(1970, 1, 1, 0, 1, 41, 0, time.UTC),
time.Date(1970, 1, 1, 0, 1, 42, 0, time.UTC),
}),
newField,
)
testFrame.Meta = &data.FrameMeta{ExecutedQueryString: "Test raw query"}
assert.Equal(t, testFrame, got.Responses["A"].Frames[0])
},
},
{
name: "Influxdb response parser with valid value when all values are null",
input: `{ "results": [ { "series": [ {
"name": "cpu",
"columns": ["time","mean"],
"values": [
[100,null],
[101,null],
[102,null]
]
}]}]}`,
f: func(t *testing.T, got *backend.QueryDataResponse) {
newField := data.NewField("value", nil, []*float64{nil, nil, nil})
newField.Config = &data.FieldConfig{DisplayNameFromDS: "cpu.mean"}
testFrame := data.NewFrame("cpu.mean",
data.NewField("time", nil,
[]time.Time{
time.Date(1970, 1, 1, 0, 1, 40, 0, time.UTC),
time.Date(1970, 1, 1, 0, 1, 41, 0, time.UTC),
time.Date(1970, 1, 1, 0, 1, 42, 0, time.UTC),
}),
newField,
)
testFrame.Meta = &data.FrameMeta{ExecutedQueryString: "Test raw query"}
assert.Equal(t, testFrame, got.Responses["A"].Frames[0])
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
parser := &ResponseParser{}
got := parser.Parse(prepare(tt.input), addQueryToQueries(Query{}))
require.NotNil(t, got)
if tt.f != nil {
tt.f(t, got)
}
})
}
}