mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-25 05:34:05 -08:00
feat: linreg => slope 0 for const values (#9728)
* feat: linreg => slope 0 for const values Signed-off-by: mtfoley <mtfoley.mae@gmail.com>
This commit is contained in:
parent
5bec690282
commit
7ee52bfb86
|
@ -716,8 +716,16 @@ func linearRegression(samples []Point, interceptTime int64) (slope, intercept fl
|
||||||
sumY, cY float64
|
sumY, cY float64
|
||||||
sumXY, cXY float64
|
sumXY, cXY float64
|
||||||
sumX2, cX2 float64
|
sumX2, cX2 float64
|
||||||
|
initY float64
|
||||||
|
constY bool
|
||||||
)
|
)
|
||||||
for _, sample := range samples {
|
initY = samples[0].V
|
||||||
|
constY = true
|
||||||
|
for i, sample := range samples {
|
||||||
|
// Set constY to false if any new y values are encountered.
|
||||||
|
if constY && i > 0 && sample.V != initY {
|
||||||
|
constY = false
|
||||||
|
}
|
||||||
n += 1.0
|
n += 1.0
|
||||||
x := float64(sample.T-interceptTime) / 1e3
|
x := float64(sample.T-interceptTime) / 1e3
|
||||||
sumX, cX = kahanSumInc(x, sumX, cX)
|
sumX, cX = kahanSumInc(x, sumX, cX)
|
||||||
|
@ -725,7 +733,12 @@ func linearRegression(samples []Point, interceptTime int64) (slope, intercept fl
|
||||||
sumXY, cXY = kahanSumInc(x*sample.V, sumXY, cXY)
|
sumXY, cXY = kahanSumInc(x*sample.V, sumXY, cXY)
|
||||||
sumX2, cX2 = kahanSumInc(x*x, sumX2, cX2)
|
sumX2, cX2 = kahanSumInc(x*x, sumX2, cX2)
|
||||||
}
|
}
|
||||||
|
if constY {
|
||||||
|
if math.IsInf(initY, 0) {
|
||||||
|
return math.NaN(), math.NaN()
|
||||||
|
}
|
||||||
|
return 0, initY
|
||||||
|
}
|
||||||
sumX = sumX + cX
|
sumX = sumX + cX
|
||||||
sumY = sumY + cY
|
sumY = sumY + cY
|
||||||
sumXY = sumXY + cXY
|
sumXY = sumXY + cXY
|
||||||
|
|
|
@ -44,8 +44,14 @@ func TestDeriv(t *testing.T) {
|
||||||
a := storage.Appender(context.Background())
|
a := storage.Appender(context.Background())
|
||||||
|
|
||||||
metric := labels.FromStrings("__name__", "foo")
|
metric := labels.FromStrings("__name__", "foo")
|
||||||
a.Append(0, metric, 1493712816939, 1.0)
|
start := 1493712816939
|
||||||
a.Append(0, metric, 1493712846939, 1.0)
|
interval := 30 * 1000
|
||||||
|
// Introduce some timestamp jitter to test 0 slope case.
|
||||||
|
// https://github.com/prometheus/prometheus/issues/7180
|
||||||
|
for i := 0; i < 15; i++ {
|
||||||
|
jitter := 12 * i % 2
|
||||||
|
a.Append(0, metric, int64(start+interval*i+jitter), 1)
|
||||||
|
}
|
||||||
|
|
||||||
require.NoError(t, a.Commit())
|
require.NoError(t, a.Commit())
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue