Skip to content

Commit

Permalink
Alerting: Fix mathexp.NoData cannot be reduced (#55347) (#55549)
Browse files Browse the repository at this point in the history
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 7d20766)

Co-authored-by: George Robinson <george.robinson@grafana.com>
  • Loading branch information
grafanabot and grobinson-grafana committed Sep 21, 2022
1 parent 06b71c2 commit b7cc6fd
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 0 deletions.
2 changes: 2 additions & 0 deletions pkg/expr/commands.go
Expand Up @@ -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())
}
Expand Down
27 changes: 27 additions & 0 deletions pkg/expr/commands_test.go
Expand Up @@ -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"

Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit b7cc6fd

Please sign in to comment.