Просмотр исходного кода

Fix percent_diff calculation when points are nulls

Maxim Neverov 6 лет назад
Родитель
Сommit
3c2f6094b2

+ 11 - 8
pkg/services/alerting/conditions/reducer.go

@@ -131,14 +131,17 @@ func (s *SimpleReducer) Reduce(series *tsdb.TimeSeries) null.Float {
 				break
 			}
 		}
-		// get the oldest point
-		points = points[0:i]
-		for i := 0; i < len(points); i++ {
-			if points[i][0].Valid {
-				allNull = false
-				val := (first - points[i][0].Float64) / points[i][0].Float64 * 100
-				value = math.Abs(val)
-				break
+
+		if i >= 1 {
+			// get the oldest point
+			points = points[0:i]
+			for i := 0; i < len(points); i++ {
+				if points[i][0].Valid {
+					allNull = false
+					val := (first - points[i][0].Float64) / points[i][0].Float64 * 100
+					value = math.Abs(val)
+					break
+				}
 			}
 		}
 	case "count_non_null":

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

@@ -157,6 +157,18 @@ func TestSimpleReducer(t *testing.T) {
 			result := testReducer("percent_diff", 30, 40, 40)
 			So(result, ShouldEqual, float64(33.33333333333333))
 		})
+
+		Convey("percent_diff with only nulls", func() {
+			reducer := NewSimpleReducer("percent_diff")
+			series := &tsdb.TimeSeries{
+				Name: "test time serie",
+			}
+
+			series.Points = append(series.Points, tsdb.NewTimePoint(null.FloatFromPtr(nil), 1))
+			series.Points = append(series.Points, tsdb.NewTimePoint(null.FloatFromPtr(nil), 2))
+
+			So(reducer.Reduce(series).Valid, ShouldEqual, false)
+		})
 	})
 }