diff --git a/app/vmselect/promql/rollup.go b/app/vmselect/promql/rollup.go index 16087c052..27d390df8 100644 --- a/app/vmselect/promql/rollup.go +++ b/app/vmselect/promql/rollup.go @@ -1683,28 +1683,21 @@ func rollupDistinct(rfa *rollupFuncArg) float64 { } func rollupIntegrate(rfa *rollupFuncArg) float64 { - prevTimestamp := rfa.prevTimestamp - // There is no need in handling NaNs here, since they must be cleaned up // before calling rollup funcs. values := rfa.values timestamps := rfa.timestamps - if len(values) == 0 { - if math.IsNaN(rfa.prevValue) { + prevValue := rfa.prevValue + prevTimestamp := rfa.currTimestamp - rfa.window + if math.IsNaN(prevValue) { + if len(values) == 0 { return nan } - return 0 - } - prevValue := rfa.prevValue - if math.IsNaN(prevValue) { prevValue = values[0] prevTimestamp = timestamps[0] values = values[1:] timestamps = timestamps[1:] } - if len(values) == 0 { - return 0 - } var sum float64 for i, v := range values { @@ -1714,6 +1707,8 @@ func rollupIntegrate(rfa *rollupFuncArg) float64 { prevTimestamp = timestamp prevValue = v } + dt := float64(rfa.currTimestamp - prevTimestamp) / 1e3 + sum += prevValue * dt return sum } diff --git a/app/vmselect/promql/rollup_test.go b/app/vmselect/promql/rollup_test.go index aef7c335f..c75626f45 100644 --- a/app/vmselect/promql/rollup_test.go +++ b/app/vmselect/promql/rollup_test.go @@ -431,7 +431,7 @@ func TestRollupNewRollupFuncSuccess(t *testing.T) { f("stdvar_over_time", 945.7430555555555) f("first_over_time", 123) f("last_over_time", 34) - f("integrate", 5.237) + f("integrate", 0.817) f("distinct_over_time", 8) f("ideriv", 0) f("decreases_over_time", 5) @@ -970,7 +970,7 @@ func TestRollupFuncsNoWindow(t *testing.T) { } rc.Timestamps = getTimestamps(rc.Start, rc.End, rc.Step) values := rc.Do(nil, testValues, testTimestamps) - valuesExpected := []float64{nan, 2.064, 1.677, 1.156, 0.34} + valuesExpected := []float64{nan, 2.148, 1.593, 1.156, 1.36} timestampsExpected := []int64{0, 40, 80, 120, 160} testRowsEqual(t, values, rc.Timestamps, valuesExpected, timestampsExpected) })