Kaynağa Gözat

feat(alerting): calculate avg of valid points

bergquist 9 yıl önce
ebeveyn
işleme
6c9cf87080

+ 5 - 2
pkg/services/alerting/conditions/reducer.go

@@ -27,13 +27,17 @@ func (s *SimpleReducer) Reduce(series *tsdb.TimeSeries) null.Float {
 
 
 	switch s.Type {
 	switch s.Type {
 	case "avg":
 	case "avg":
+		validPointsCount := 0
 		for _, point := range series.Points {
 		for _, point := range series.Points {
 			if point[0].Valid {
 			if point[0].Valid {
 				value += point[0].Float64
 				value += point[0].Float64
+				validPointsCount += 1
 				allNull = false
 				allNull = false
 			}
 			}
 		}
 		}
-		value = value / float64(len(series.Points))
+		if validPointsCount > 0 {
+			value = value / float64(validPointsCount)
+		}
 	case "sum":
 	case "sum":
 		for _, point := range series.Points {
 		for _, point := range series.Points {
 			if point[0].Valid {
 			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
 				value = (values[(length/2)-1] + values[length/2]) / 2
 			}
 			}
 		}
 		}
-
 	}
 	}
 
 
 	if allNull {
 	if allNull {

+ 14 - 0
pkg/services/alerting/conditions/reducer_test.go

@@ -16,6 +16,20 @@ func TestSimpleReducer(t *testing.T) {
 			So(result, ShouldEqual, float64(2))
 			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() {
 		Convey("sum", func() {
 			result := testReducer("sum", 1, 2, 3)
 			result := testReducer("sum", 1, 2, 3)
 			So(result, ShouldEqual, float64(6))
 			So(result, ShouldEqual, float64(6))