diff --git a/pkg/services/alerting/conditions/reducer.go b/pkg/services/alerting/conditions/reducer.go index b2d17f4f8ab..b7816a61d1d 100644 --- a/pkg/services/alerting/conditions/reducer.go +++ b/pkg/services/alerting/conditions/reducer.go @@ -27,13 +27,17 @@ func (s *SimpleReducer) Reduce(series *tsdb.TimeSeries) null.Float { switch s.Type { case "avg": + validPointsCount := 0 for _, point := range series.Points { if point[0].Valid { value += point[0].Float64 + validPointsCount += 1 allNull = false } } - value = value / float64(len(series.Points)) + if validPointsCount > 0 { + value = value / float64(validPointsCount) + } case "sum": for _, point := range series.Points { if point[0].Valid { @@ -90,7 +94,6 @@ func (s *SimpleReducer) Reduce(series *tsdb.TimeSeries) null.Float { value = (values[(length/2)-1] + values[length/2]) / 2 } } - } if allNull { diff --git a/pkg/services/alerting/conditions/reducer_test.go b/pkg/services/alerting/conditions/reducer_test.go index 477595c5af1..badf868e8fc 100644 --- a/pkg/services/alerting/conditions/reducer_test.go +++ b/pkg/services/alerting/conditions/reducer_test.go @@ -16,6 +16,20 @@ func TestSimpleReducer(t *testing.T) { So(result, ShouldEqual, float64(2)) }) + Convey("avg of none null data", func() { + reducer := NewSimpleReducer("avg") + series := &tsdb.TimeSeries{ + Name: "test time serie", + } + + series.Points = append(series.Points, tsdb.NewTimePoint(null.FloatFrom(3), 1)) + series.Points = append(series.Points, tsdb.NewTimePoint(null.FloatFromPtr(nil), 2)) + series.Points = append(series.Points, tsdb.NewTimePoint(null.FloatFromPtr(nil), 3)) + series.Points = append(series.Points, tsdb.NewTimePoint(null.FloatFrom(3), 4)) + + So(reducer.Reduce(series).Float64, ShouldEqual, float64(3)) + }) + Convey("sum", func() { result := testReducer("sum", 1, 2, 3) So(result, ShouldEqual, float64(6))