From 6c9cf87080e52966846a48d04209d90c166ca42e Mon Sep 17 00:00:00 2001 From: bergquist Date: Fri, 2 Dec 2016 23:44:14 +0100 Subject: [PATCH] feat(alerting): calculate avg of valid points --- pkg/services/alerting/conditions/reducer.go | 7 +++++-- pkg/services/alerting/conditions/reducer_test.go | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) 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))