InfluxDB: Flux: Improve handling of complex response-structures (#33823)

This commit is contained in:
Gábor Farkas
2021-05-11 12:36:04 +02:00
committed by GitHub
parent d2a1b8fd95
commit 2633f245ba
18 changed files with 471 additions and 288 deletions
+58 -24
View File
@@ -83,7 +83,7 @@ func TestExecuteSimple(t *testing.T) {
require.Len(t, dr.Frames, 1)
require.Contains(t, dr.Frames[0].Name, "test")
require.Len(t, dr.Frames[0].Fields[1].Labels, 2)
require.Equal(t, "Time", dr.Frames[0].Fields[0].Name)
require.Equal(t, "_time", dr.Frames[0].Fields[0].Name)
st, err := dr.Frames[0].StringTable(-1, -1)
require.NoError(t, err)
@@ -101,7 +101,7 @@ func TestExecuteMultiple(t *testing.T) {
require.Len(t, dr.Frames, 3)
require.Contains(t, dr.Frames[0].Name, "test")
require.Len(t, dr.Frames[0].Fields[1].Labels, 2)
require.Equal(t, "Time", dr.Frames[0].Fields[0].Name)
require.Equal(t, "_time", dr.Frames[0].Fields[0].Name)
st, err := dr.Frames[0].StringTable(-1, -1)
require.NoError(t, err)
@@ -118,8 +118,8 @@ func TestExecuteGrouping(t *testing.T) {
dr := verifyGoldenResponse(t, "grouping")
require.Len(t, dr.Frames, 3)
require.Contains(t, dr.Frames[0].Name, "system")
require.Len(t, dr.Frames[0].Fields[1].Labels, 1)
require.Equal(t, "Time", dr.Frames[0].Fields[0].Name)
require.Len(t, dr.Frames[0].Fields[0].Labels, 1)
require.Equal(t, "_time", dr.Frames[0].Fields[1].Name)
st, err := dr.Frames[0].StringTable(-1, -1)
require.NoError(t, err)
@@ -138,9 +138,9 @@ func TestAggregateGrouping(t *testing.T) {
// `Name:
// Dimensions: 2 Fields by 3 Rows
// +-------------------------------+--------------------------+
// | Name: Time | Name: |
// | Name: _time | Name: _value |
// | Labels: | Labels: host=hostname.ru |
// | Type: []time.Time | Type: []*float64 |
// | Type: []*time.Time | Type: []*float64 |
// +-------------------------------+--------------------------+
// | 2020-06-05 12:06:00 +0000 UTC | 8.291 |
// | 2020-06-05 12:07:00 +0000 UTC | 0.534 |
@@ -148,13 +148,13 @@ func TestAggregateGrouping(t *testing.T) {
// +-------------------------------+--------------------------+
// `
t1 := time.Date(2020, 6, 5, 12, 6, 0, 0, time.UTC)
t2 := time.Date(2020, 6, 5, 12, 7, 0, 0, time.UTC)
t3 := time.Date(2020, 6, 5, 12, 8, 0, 0, time.UTC)
expectedFrame := data.NewFrame("",
data.NewField("Time", nil, []time.Time{
time.Date(2020, 6, 5, 12, 6, 0, 0, time.UTC),
time.Date(2020, 6, 5, 12, 7, 0, 0, time.UTC),
time.Date(2020, 6, 5, 12, 8, 0, 0, time.UTC),
}),
data.NewField("", map[string]string{"host": "hostname.ru"}, []*float64{
data.NewField("_time", nil, []*time.Time{&t1, &t2, &t3}),
data.NewField("_value", map[string]string{"host": "hostname.ru"}, []*float64{
pointer.Float64(8.291),
pointer.Float64(0.534),
pointer.Float64(0.667),
@@ -174,20 +174,22 @@ func TestNonStandardTimeColumn(t *testing.T) {
require.NoError(t, err)
fmt.Println(str)
// Dimensions: 2 Fields by 1 Rows
// +-----------------------------------------+------------------+
// | Name: _start_water | Name: |
// | Labels: | Labels: st=1 |
// | Type: []time.Time | Type: []*float64 |
// +-----------------------------------------+------------------+
// | 2020-06-28 17:50:13.012584046 +0000 UTC | 156.304 |
// +-----------------------------------------+------------------+
// Dimensions: 3 Fields by 1 Rows
// +-----------------------------------------+-----------------------------------------+------------------+
// | Name: _start_water | Name: _stop_water | Name: _value |
// | Labels: st=1 | Labels: st=1 | Labels: st=1 |
// | Type: []*time.Time | Type: []*time.Time | Type: []*float64 |
// +-----------------------------------------+-----------------------------------------+------------------+
// | 2020-06-28 17:50:13.012584046 +0000 UTC | 2020-06-29 17:50:13.012584046 +0000 UTC | 156.304 |
// +-----------------------------------------+-----------------------------------------+------------------+
t1 := time.Date(2020, 6, 28, 17, 50, 13, 12584046, time.UTC)
t2 := time.Date(2020, 6, 29, 17, 50, 13, 12584046, time.UTC)
expectedFrame := data.NewFrame("",
data.NewField("_start_water", nil, []time.Time{
time.Date(2020, 6, 28, 17, 50, 13, 12584046, time.UTC),
}),
data.NewField("", map[string]string{"st": "1"}, []*float64{
data.NewField("_start_water", map[string]string{"st": "1"}, []*time.Time{&t1}),
data.NewField("_stop_water", map[string]string{"st": "1"}, []*time.Time{&t2}),
data.NewField("_value", map[string]string{"st": "1"}, []*float64{
pointer.Float64(156.304),
}),
)
@@ -265,3 +267,35 @@ func TestMaxDataPointsExceededWithAggregate(t *testing.T) {
require.EqualError(t, dr.Error, "A query returned too many datapoints and the results have been truncated at 21 points to prevent memory issues. At the current graph size, Grafana can only draw 2.")
assertDataResponseDimensions(t, dr, 2, 21)
}
func TestMultivalue(t *testing.T) {
// we await a non-labeled _time column
// and two value-columns named _value and _value2
dr := verifyGoldenResponse(t, "multivalue")
require.Len(t, dr.Frames, 4)
frame := dr.Frames[0]
require.Len(t, frame.Fields, 3)
require.Equal(t, frame.Fields[0].Name, "_time")
require.Equal(t, frame.Fields[0].Len(), 2)
require.Len(t, frame.Fields[0].Labels, 0)
require.Equal(t, frame.Fields[1].Name, "_value")
require.Len(t, frame.Fields[1].Labels, 5)
require.Equal(t, frame.Fields[2].Name, "_value2")
require.Len(t, frame.Fields[2].Labels, 5)
}
func TestMultiTime(t *testing.T) {
// we await three columns, _time, _time2, _value
// all have all labels
dr := verifyGoldenResponse(t, "multitime")
require.Len(t, dr.Frames, 4)
frame := dr.Frames[0]
require.Len(t, frame.Fields, 3)
require.Equal(t, frame.Fields[0].Name, "_time")
require.Equal(t, frame.Fields[0].Len(), 1)
require.Len(t, frame.Fields[0].Labels, 5)
require.Equal(t, frame.Fields[1].Name, "_time2")
require.Len(t, frame.Fields[1].Labels, 5)
require.Equal(t, frame.Fields[2].Name, "_value")
require.Len(t, frame.Fields[2].Labels, 5)
}