From 12320dda3cc6e3e019016c14973d782aad067d3e Mon Sep 17 00:00:00 2001 From: Dimitris Sotirakis Date: Thu, 26 Aug 2021 10:20:38 +0300 Subject: [PATCH] Elasticsearch: Fix metric names for alert queries (#38546) * Export fieldName to var * Add empty string as frame name --- pkg/tsdb/elasticsearch/response_parser.go | 14 ++-- .../elasticsearch/response_parser_test.go | 64 +++++++++---------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/pkg/tsdb/elasticsearch/response_parser.go b/pkg/tsdb/elasticsearch/response_parser.go index 7fe796e946b..e726cc1ce4e 100644 --- a/pkg/tsdb/elasticsearch/response_parser.go +++ b/pkg/tsdb/elasticsearch/response_parser.go @@ -201,7 +201,7 @@ func (rp *responseParser) processMetrics(esAgg *simplejson.Json, target *Query, tags[k] = v } tags["metric"] = countType - frames = append(frames, data.NewFrame(metric.Field, + frames = append(frames, data.NewFrame("", data.NewField("time", nil, timeVector), data.NewField("value", tags, values))) case percentilesType: @@ -235,7 +235,7 @@ func (rp *responseParser) processMetrics(esAgg *simplejson.Json, target *Query, timeVector = append(timeVector, time.Unix(int64(*key)/1000, 0).UTC()) values = append(values, value) } - frames = append(frames, data.NewFrame(metric.Field, + frames = append(frames, data.NewFrame("", data.NewField("time", nil, timeVector), data.NewField("value", tags, values))) } @@ -277,7 +277,7 @@ func (rp *responseParser) processMetrics(esAgg *simplejson.Json, target *Query, } } - frames = append(frames, data.NewFrame(metricField.(string), + frames = append(frames, data.NewFrame("", data.NewField("time", nil, timeVector), data.NewField("value", tags, values), )) @@ -324,7 +324,7 @@ func (rp *responseParser) processMetrics(esAgg *simplejson.Json, target *Query, values = append(values, value) } labels := tags - frames = append(frames, data.NewFrame(metric.Field, + frames = append(frames, data.NewFrame("", data.NewField("time", nil, timeVector), data.NewField("value", labels, values))) } @@ -352,7 +352,7 @@ func (rp *responseParser) processMetrics(esAgg *simplejson.Json, target *Query, timeVector = append(timeVector, time.Unix(int64(*key)/1000, 0).UTC()) values = append(values, value) } - frames = append(frames, data.NewFrame(metric.Field, + frames = append(frames, data.NewFrame("", data.NewField("time", nil, timeVector), data.NewField("value", tags, values))) } @@ -566,9 +566,9 @@ func (rp *responseParser) nameFields(queryResult backend.DataResponse, target *Q } metricTypeCount := len(set) for i := range frames { - frames[i].Name = rp.getFieldName(*frames[i].Fields[1], target, metricTypeCount) + fieldName := rp.getFieldName(*frames[i].Fields[1], target, metricTypeCount) for _, field := range frames[i].Fields { - field.SetConfig(&data.FieldConfig{DisplayNameFromDS: rp.getFieldName(*frames[i].Fields[1], target, metricTypeCount)}) + field.SetConfig(&data.FieldConfig{DisplayNameFromDS: fieldName}) } } } diff --git a/pkg/tsdb/elasticsearch/response_parser_test.go b/pkg/tsdb/elasticsearch/response_parser_test.go index da9bf30fa01..3dfd25da30d 100644 --- a/pkg/tsdb/elasticsearch/response_parser_test.go +++ b/pkg/tsdb/elasticsearch/response_parser_test.go @@ -54,13 +54,13 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 1) frame := dataframes[0] - require.Equal(t, frame.Name, "Count") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "Count") }) t.Run("Simple query count & avg aggregation", func(t *testing.T) { @@ -106,22 +106,22 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 2) frame := dataframes[0] - require.Equal(t, frame.Name, "Count") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "Count") frame = dataframes[1] - require.Equal(t, frame.Name, "Average value") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "Average value") }) t.Run("Single group by query one metric", func(t *testing.T) { @@ -173,20 +173,20 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 2) frame := dataframes[0] - require.Equal(t, frame.Name, "server1") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server1") frame = dataframes[1] - require.Equal(t, frame.Name, "server2") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server2") }) t.Run("Single group by query two metrics", func(t *testing.T) { @@ -245,36 +245,36 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 4) frame := dataframes[0] - require.Equal(t, frame.Name, "server1 Count") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server1 Count") frame = dataframes[1] - require.Equal(t, frame.Name, "server1 Average @value") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server1 Average @value") frame = dataframes[2] - require.Equal(t, frame.Name, "server2 Count") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server2 Count") frame = dataframes[3] - require.Equal(t, frame.Name, "server2 Average @value") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server2 Average @value") }) t.Run("With percentiles", func(t *testing.T) { @@ -320,20 +320,20 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 2) frame := dataframes[0] - require.Equal(t, frame.Name, "p75") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "p75") frame = dataframes[1] - require.Equal(t, frame.Name, "p90") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "p90") }) t.Run("With extended stats", func(t *testing.T) { @@ -404,52 +404,52 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 6) frame := dataframes[0] - require.Equal(t, frame.Name, "server1 Max") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 1) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 1) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server1 Max") frame = dataframes[1] - require.Equal(t, frame.Name, "server1 Std Dev Lower") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 1) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 1) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server1 Std Dev Lower") frame = dataframes[2] - require.Equal(t, frame.Name, "server1 Std Dev Upper") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 1) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 1) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server1 Std Dev Upper") frame = dataframes[3] - require.Equal(t, frame.Name, "server2 Max") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 1) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 1) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server2 Max") frame = dataframes[4] - require.Equal(t, frame.Name, "server2 Std Dev Lower") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 1) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 1) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server2 Std Dev Lower") frame = dataframes[5] - require.Equal(t, frame.Name, "server2 Std Dev Upper") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 1) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 1) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server2 Std Dev Upper") }) t.Run("Single group by with alias pattern", func(t *testing.T) { @@ -510,28 +510,28 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 3) frame := dataframes[0] - require.Equal(t, frame.Name, "server1 Count and {{not_exist}} server1") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server1 Count and {{not_exist}} server1") frame = dataframes[1] - require.Equal(t, frame.Name, "server2 Count and {{not_exist}} server2") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "server2 Count and {{not_exist}} server2") frame = dataframes[2] - require.Equal(t, frame.Name, "0 Count and {{not_exist}} 0") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "0 Count and {{not_exist}} 0") }) t.Run("Histogram response", func(t *testing.T) { @@ -618,20 +618,20 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 2) frame := dataframes[0] - require.Equal(t, frame.Name, "@metric:cpu") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "@metric:cpu") frame = dataframes[1] - require.Equal(t, frame.Name, "@metric:logins.count") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "@metric:logins.count") }) t.Run("With dropfirst and last aggregation", func(t *testing.T) { @@ -689,20 +689,20 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 2) frame := dataframes[0] - require.Equal(t, frame.Name, "Average") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "Average") frame = dataframes[1] - require.Equal(t, frame.Name, "Count") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "Count") }) t.Run("No group by time", func(t *testing.T) { @@ -748,7 +748,6 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 1) frame := dataframes[0] - require.Equal(t, frame.Name, "") require.Len(t, frame.Fields, 3) require.Equal(t, frame.Fields[0].Name, "host") require.Equal(t, frame.Fields[0].Len(), 2) @@ -756,6 +755,7 @@ func TestResponseParser(t *testing.T) { require.Equal(t, frame.Fields[1].Len(), 2) require.Equal(t, frame.Fields[2].Name, "Count") require.Equal(t, frame.Fields[2].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "") }) t.Run("Multiple metrics of same type", func(t *testing.T) { @@ -797,7 +797,6 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 1) frame := dataframes[0] - require.Equal(t, frame.Name, "") require.Len(t, frame.Fields, 3) require.Equal(t, frame.Fields[0].Name, "host") require.Equal(t, frame.Fields[0].Len(), 1) @@ -805,6 +804,7 @@ func TestResponseParser(t *testing.T) { require.Equal(t, frame.Fields[1].Len(), 1) require.Equal(t, frame.Fields[2].Name, "Average test2") require.Equal(t, frame.Fields[2].Len(), 1) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "") }) t.Run("With bucket_script", func(t *testing.T) { @@ -864,28 +864,28 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 3) frame := dataframes[0] - require.Equal(t, frame.Name, "Sum @value") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "Sum @value") frame = dataframes[1] - require.Equal(t, frame.Name, "Max @value") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "Max @value") frame = dataframes[2] - require.Equal(t, frame.Name, "Sum @value * Max @value") require.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Name, "time") require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Name, "value") require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "Sum @value * Max @value") }) t.Run("Terms with two bucket_script", func(t *testing.T) { @@ -954,7 +954,6 @@ func TestResponseParser(t *testing.T) { require.Len(t, dataframes, 1) frame := dataframes[0] - require.Equal(t, frame.Name, "") require.Len(t, frame.Fields, 5) require.Equal(t, frame.Fields[0].Name, "@timestamp") require.Equal(t, frame.Fields[0].Len(), 2) @@ -966,6 +965,7 @@ func TestResponseParser(t *testing.T) { require.Equal(t, frame.Fields[3].Len(), 2) require.Equal(t, frame.Fields[4].Name, "params.var1 * params.var2 * 2") require.Equal(t, frame.Fields[4].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "") }) }) @@ -1028,10 +1028,10 @@ func TestResponseParser(t *testing.T) { assert.Len(t, dataframes, 2) frame := dataframes[0] - assert.Equal(t, frame.Name, "Top Metrics @value") assert.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "Top Metrics @value") v, _ := frame.FloatAt(0, 0) assert.Equal(t, 1609459200000., v) v, _ = frame.FloatAt(1, 0) @@ -1043,12 +1043,12 @@ func TestResponseParser(t *testing.T) { assert.Equal(t, 1., v) frame = dataframes[1] - assert.Equal(t, frame.Name, "Top Metrics @anotherValue") l, _ := frame.MarshalJSON() fmt.Println(string(l)) assert.Len(t, frame.Fields, 2) require.Equal(t, frame.Fields[0].Len(), 2) require.Equal(t, frame.Fields[1].Len(), 2) + assert.Equal(t, frame.Fields[1].Config.DisplayNameFromDS, "Top Metrics @anotherValue") v, _ = frame.FloatAt(0, 0) assert.Equal(t, 1609459200000., v) v, _ = frame.FloatAt(1, 0)