app/vmselect/promql: adjust value returned by linearRegression to the end of time range like Prometheus does

Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/71
This commit is contained in:
Aliaksandr Valialkin 2019-06-24 22:27:17 +03:00
parent 90e72c2a42
commit 4bb738ddd9
2 changed files with 6 additions and 4 deletions

View File

@ -403,6 +403,8 @@ func linearRegression(rfa *rollupFuncArg) (float64, float64) {
} }
k := (n*tvSum - tSum*vSum) / (n*ttSum - tSum*tSum) k := (n*tvSum - tSum*vSum) / (n*ttSum - tSum*tSum)
v := (vSum - k*tSum) / n 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 return v, k
} }

View File

@ -143,10 +143,10 @@ func TestRollupPredictLinear(t *testing.T) {
testRollupFunc(t, "predict_linear", args, &me, vExpected) testRollupFunc(t, "predict_linear", args, &me, vExpected)
} }
f(0e-3, 63.739757761102624) f(0e-3, 30.382432471845043)
f(50e-3, 50.39682764539959) f(50e-3, 17.03950235614201)
f(100e-3, 37.053897529696556) f(100e-3, 3.696572240438975)
f(200e-3, 10.368037298290488) f(200e-3, -22.989287990967092)
} }
func TestRollupHoltWinters(t *testing.T) { func TestRollupHoltWinters(t *testing.T) {