From b7cc6fdf946bf43fab11d090e1b237521817b63e Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Wed, 21 Sep 2022 05:18:03 -0400 Subject: [PATCH] Alerting: Fix mathexp.NoData cannot be reduced (#55347) (#55549) This commit fixes a bug where queries from datasources such as InfluxDB that returned no data would not create a DatasourceNoData alert, but instead an error "can only reduce type series, got type noData". (cherry picked from commit 7d20766ae9f7bffaf848cc495079db63abb7ee07) Co-authored-by: George Robinson --- pkg/expr/commands.go | 2 ++ pkg/expr/commands_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/pkg/expr/commands.go b/pkg/expr/commands.go index 0015c9fc0043..16ea10a43667 100644 --- a/pkg/expr/commands.go +++ b/pkg/expr/commands.go @@ -171,6 +171,8 @@ func (gr *ReduceCommand) Execute(_ context.Context, vars mathexp.Vars) (mathexp. Text: fmt.Sprintf("Reduce operation is not needed. Input query or expression %s is already reduced data.", gr.VarToReduce), }) newRes.Values = append(newRes.Values, copyV) + case mathexp.NoData: + newRes.Values = append(newRes.Values, v.New()) default: return newRes, fmt.Errorf("can only reduce type series, got type %v", val.Type()) } diff --git a/pkg/expr/commands_test.go b/pkg/expr/commands_test.go index c8a5c4b2bad2..06408f5bd361 100644 --- a/pkg/expr/commands_test.go +++ b/pkg/expr/commands_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ptr "github.com/xorcare/pointer" @@ -136,6 +137,32 @@ func TestReduceExecute(t *testing.T) { } }) }) + + t.Run("should return new NoData", func(t *testing.T) { + var noData mathexp.Values = []mathexp.Value{ + mathexp.NoData{Frame: data.NewFrame("no data")}, + } + + vars := map[string]mathexp.Results{ + varToReduce: { + Values: noData, + }, + } + + results, err := cmd.Execute(context.Background(), vars) + require.NoError(t, err) + + require.Len(t, results.Values, 1) + + v := results.Values[0] + assert.Equal(t, v, mathexp.NoData{}.New()) + + // should not be able to change the original frame + v.AsDataFrame().Name = "there is still no data" + assert.NotEqual(t, v, mathexp.NoData{}.New()) + assert.NotEqual(t, v, noData[0]) + assert.Equal(t, "no data", noData[0].AsDataFrame().Name) + }) } func randomReduceFunc() string {