diff --git a/app/vmselect/promql/rollup.go b/app/vmselect/promql/rollup.go index 2a170d57d..1a866d2b6 100644 --- a/app/vmselect/promql/rollup.go +++ b/app/vmselect/promql/rollup.go @@ -403,6 +403,8 @@ func linearRegression(rfa *rollupFuncArg) (float64, float64) { } k := (n*tvSum - tSum*vSum) / (n*ttSum - tSum*tSum) v := (vSum - k*tSum) / n + // Adjust v to the last timestamp on the given time range. + v += k * (float64(timestamps[len(timestamps)-1]-tFirst) * 1e-3) return v, k } diff --git a/app/vmselect/promql/rollup_test.go b/app/vmselect/promql/rollup_test.go index f1b9d55c0..8997e361c 100644 --- a/app/vmselect/promql/rollup_test.go +++ b/app/vmselect/promql/rollup_test.go @@ -143,10 +143,10 @@ func TestRollupPredictLinear(t *testing.T) { testRollupFunc(t, "predict_linear", args, &me, vExpected) } - f(0e-3, 63.739757761102624) - f(50e-3, 50.39682764539959) - f(100e-3, 37.053897529696556) - f(200e-3, 10.368037298290488) + f(0e-3, 30.382432471845043) + f(50e-3, 17.03950235614201) + f(100e-3, 3.696572240438975) + f(200e-3, -22.989287990967092) } func TestRollupHoltWinters(t *testing.T) {