Merge pull request #13559 from prometheus/beorn7/promql

promql: Fix wrongly scoped range vectors
This commit is contained in:
Björn Rabenstein 2024-02-12 14:34:33 +01:00 committed by GitHub
commit 1efca80956
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 14 additions and 9 deletions

View file

@ -708,7 +708,8 @@ func TestScratchBuilder(t *testing.T) {
func TestLabels_Hash(t *testing.T) { func TestLabels_Hash(t *testing.T) {
lbls := FromStrings("foo", "bar", "baz", "qux") lbls := FromStrings("foo", "bar", "baz", "qux")
require.Equal(t, lbls.Hash(), lbls.Hash()) hash1, hash2 := lbls.Hash(), lbls.Hash()
require.Equal(t, hash1, hash2)
require.NotEqual(t, lbls.Hash(), FromStrings("foo", "bar").Hash(), "different labels match.") require.NotEqual(t, lbls.Hash(), FromStrings("foo", "bar").Hash(), "different labels match.")
} }

View file

@ -1494,10 +1494,14 @@ func (ev *evaluator) eval(expr parser.Expr) (parser.Value, annotations.Annotatio
otherInArgs[j][0].F = otherArgs[j][0].Floats[step].F otherInArgs[j][0].F = otherArgs[j][0].Floats[step].F
} }
} }
maxt := ts - offset // Evaluate the matrix selector for this series
mint := maxt - selRange // for this step, but only if this is the 1st
// Evaluate the matrix selector for this series for this step. // iteration or no @ modifier has been used.
floats, histograms = ev.matrixIterSlice(it, mint, maxt, floats, histograms) if ts == ev.startTimestamp || selVS.Timestamp == nil {
maxt := ts - offset
mint := maxt - selRange
floats, histograms = ev.matrixIterSlice(it, mint, maxt, floats, histograms)
}
if len(floats)+len(histograms) == 0 { if len(floats)+len(histograms) == 0 {
continue continue
} }

View file

@ -221,19 +221,19 @@ eval instant at 50m deriv(testcounter_reset_middle[100m])
# intercept at t=0: 6.818181818181818 # intercept at t=0: 6.818181818181818
# intercept at t=3000: 38.63636363636364 # intercept at t=3000: 38.63636363636364
# intercept at t=3000+3600: 76.81818181818181 # intercept at t=3000+3600: 76.81818181818181
eval instant at 50m predict_linear(testcounter_reset_middle[100m], 3600) eval instant at 50m predict_linear(testcounter_reset_middle[50m], 3600)
{} 76.81818181818181 {} 76.81818181818181
# intercept at t = 3000+3600 = 6600 # intercept at t = 3000+3600 = 6600
eval instant at 50m predict_linear(testcounter_reset_middle[100m] @ 3000, 3600) eval instant at 50m predict_linear(testcounter_reset_middle[50m] @ 3000, 3600)
{} 76.81818181818181 {} 76.81818181818181
# intercept at t = 600+3600 = 4200 # intercept at t = 600+3600 = 4200
eval instant at 10m predict_linear(testcounter_reset_middle[100m] @ 3000, 3600) eval instant at 10m predict_linear(testcounter_reset_middle[50m] @ 3000, 3600)
{} 51.36363636363637 {} 51.36363636363637
# intercept at t = 4200+3600 = 7800 # intercept at t = 4200+3600 = 7800
eval instant at 70m predict_linear(testcounter_reset_middle[100m] @ 3000, 3600) eval instant at 70m predict_linear(testcounter_reset_middle[50m] @ 3000, 3600)
{} 89.54545454545455 {} 89.54545454545455
# With http_requests, there is a sample value exactly at the end of # With http_requests, there is a sample value exactly at the end of