prometheus/promql/promqltest/testdata/extended_vectors.test
Julien Pivotto 55193c3058 promql: fix smoothed interpolation across counter resets
Fix incorrect interpolation when counter resets occur in smoothed range
selector evaluation. Previously, the asymmetric handling of counter
resets (y1=0 on left edge, y2+=y1 on right edge) produced wrong values.

Now uniformly set y1=0 when a counter reset is detected, correctly
modeling the counter as starting from 0 post-reset.

This fixes rate calculations across counter resets. For example,
rate(metric[10s] smoothed) where metric goes from 100 to 10 (a reset)
now correctly computes 0.666... by treating the counter as resetting
to 0 rather than producing inflated values from the old behavior.

Signed-off-by: Julien Pivotto <291750+roidelapluie@users.noreply.github.com>
2026-02-02 11:54:35 +01:00

420 lines
8.6 KiB
Plaintext

# Reference from PROM-52: Complete dataset
load 15s
metric 1+1x4 9+1x4
eval instant at 5s increase(metric[1m])
eval instant at 20s increase(metric[1m])
{} 1.833333333
eval instant at 35s increase(metric[1m])
{} 2.833333333
eval instant at 50s increase(metric[1m])
{} 4
eval instant at 65s increase(metric[1m])
{} 4
eval instant at 80s increase(metric[1m])
{} 8
eval instant at 95s increase(metric[1m])
{} 8
eval instant at 110s increase(metric[1m])
{} 8
eval instant at 125s increase(metric[1m])
{} 4
eval instant at 5s increase(metric[1m] anchored)
{} 0
eval instant at 20s increase(metric[1m] anchored)
{} 1
eval instant at 35s increase(metric[1m] anchored)
{} 2
eval instant at 50s increase(metric[1m] anchored)
{} 3
eval instant at 65s increase(metric[1m] anchored)
{} 4
eval instant at 80s increase(metric[1m] anchored)
{} 7
eval instant at 95s increase(metric[1m] anchored)
{} 7
eval instant at 110s increase(metric[1m] anchored)
{} 7
eval instant at 125s increase(metric[1m] anchored)
{} 7
eval instant at 5s increase(metric[1m] smoothed)
{} 0.333333333
eval instant at 20s increase(metric[1m] smoothed)
{} 1.333333333
eval instant at 35s increase(metric[1m] smoothed)
{} 2.333333333
eval instant at 50s increase(metric[1m] smoothed)
{} 3.333333333
eval instant at 65s increase(metric[1m] smoothed)
{} 5
eval instant at 80s increase(metric[1m] smoothed)
{} 7
eval instant at 95s increase(metric[1m] smoothed)
{} 7
eval instant at 110s increase(metric[1m] smoothed)
{} 7
eval instant at 125s increase(metric[1m] smoothed)
{} 6
# Reference from PROM-52: Partial dataset
clear
load 15s
metric 1+1x2 _ _ 9+1x4
eval instant at 5s increase(metric[1m])
eval instant at 20s increase(metric[1m])
{} 1.833333333
eval instant at 35s increase(metric[1m])
{} 2.833333333
eval instant at 50s increase(metric[1m])
{} 3.166666666
eval instant at 65s increase(metric[1m])
{} 2.166666666
eval instant at 80s increase(metric[1m])
{} 8
eval instant at 95s increase(metric[1m])
{} 1.833333333
eval instant at 110s increase(metric[1m])
{} 2.833333333
eval instant at 125s increase(metric[1m])
{} 4
eval instant at 5s increase(metric[1m] anchored)
{} 0
eval instant at 20s increase(metric[1m] anchored)
{} 1
eval instant at 35s increase(metric[1m] anchored)
{} 2
eval instant at 50s increase(metric[1m] anchored)
{} 2
eval instant at 65s increase(metric[1m] anchored)
{} 2
eval instant at 80s increase(metric[1m] anchored)
{} 7
eval instant at 95s increase(metric[1m] anchored)
{} 7
eval instant at 110s increase(metric[1m] anchored)
{} 8
eval instant at 125s increase(metric[1m] anchored)
{} 9
eval instant at 5s increase(metric[1m] smoothed)
{} 0.333333333
eval instant at 20s increase(metric[1m] smoothed)
{} 1.333333333
eval instant at 35s increase(metric[1m] smoothed)
{} 2.666666666
eval instant at 50s increase(metric[1m] smoothed)
{} 4.666666666
eval instant at 65s increase(metric[1m] smoothed)
{} 6.333333333
eval instant at 80s increase(metric[1m] smoothed)
{} 7
eval instant at 95s increase(metric[1m] smoothed)
{} 6.666666666
eval instant at 110s increase(metric[1m] smoothed)
{} 5.666666666
eval instant at 125s increase(metric[1m] smoothed)
{} 4.666666666
# Test that interval is left-open.
clear
load 1m
metric 1 2 _ 4 5
eval instant at 2m increase(metric[1m] smoothed)
{} 1
eval instant at 2m increase(metric[1m] anchored)
# Basic test with counter resets
clear
load 1m
metric{id="1"} 1+1x4 1+1x4
metric{id="2"} 3 2+2x9
metric{id="3"} 5+3x2 3+3x6
eval instant at 1m30s increase(metric[1m])
eval instant at 1m30s increase(metric[1m] smoothed)
{id="1"} 1
{id="2"} 2
{id="3"} 3
eval instant at 1m30s increase(metric[1m] anchored)
{id="1"} 1
{id="2"} 2
{id="3"} 3
eval instant at 1m30s delta(metric[1m])
eval instant at 1m30s delta(metric[1m] anchored)
{id="1"} 1
{id="2"} -1
{id="3"} 3
eval instant at 3m0s delta(metric[1m] anchored)
{id="1"} 1
{id="2"} 2
{id="3"} -8
eval instant at 3m30s delta(metric[1m] anchored)
{id="1"} 1
{id="2"} 2
{id="3"} -8
eval instant at 6m increase(metric[5m])
{id="1"} 5
{id="2"} 10
{id="3"} 15
eval instant at 6m15s increase(metric[5m] smoothed)
{id="1"} 5
{id="2"} 10
{id="3"} 15
eval instant at 6m increase(metric[5m] smoothed)
{id="1"} 5
{id="2"} 10
{id="3"} 15
eval instant at 5m increase(metric[5m] anchored)
{id="1"} 5
{id="2"} 10
{id="3"} 15
eval instant at 15m increase(metric[5m] anchored)
clear
load 1m
metric{id="1"} 11 -1 100 0
metric{id="2"} 0 0 100 0 0 11 -1
eval instant at 5m30s delta(metric[5m] smoothed)
{id="1"} -5
{id="2"} 5
eval instant at 5m45s delta(metric[5m] smoothed)
{id="1"} -2
{id="2"} 2
clear
load 1m
metric{id="1"} 1+1x10
metric{id="2"} 1 1+1x10
metric{id="3"} 99-1x10
metric{id="4"} 99 99-1x10
eval instant at 5m changes(metric[5m])
{id="1"} 4
{id="2"} 4
{id="3"} 4
{id="4"} 4
eval instant at 5m30s changes(metric[5m])
{id="1"} 4
{id="2"} 4
{id="3"} 4
{id="4"} 4
eval instant at 5m0s changes(metric[5m] anchored)
{id="1"} 5
{id="2"} 4
{id="3"} 5
{id="4"} 4
eval instant at 6m changes(metric[5m] anchored)
{id="1"} 5
{id="2"} 5
{id="3"} 5
{id="4"} 5
eval instant at 5m30s changes(metric[5m] anchored)
{id="1"} 5
{id="2"} 4
{id="3"} 5
{id="4"} 4
eval instant at 5m30s resets(metric[5m])
{id="1"} 0
{id="2"} 0
{id="3"} 4
{id="4"} 4
eval instant at 5m30s resets(metric[5m] anchored)
{id="1"} 0
{id="2"} 0
{id="3"} 5
{id="4"} 4
clear
load 1m
metric{id="1"} 2 _ 1 _ _ _ _ _ 0
metric{id="2"} 99-1x10
eval instant at 2m changes(metric[1m])
{id="1"} 0
{id="2"} 0
eval instant at 3m changes(metric[1m])
{id="2"} 0
eval instant at 2m changes(metric[1m] anchored)
{id="1"} 1
{id="2"} 1
eval instant at 3m changes(metric[1m] anchored)
{id="2"} 1
eval instant at 8m changes(metric[1m] anchored)
{id="1"} 0
{id="2"} 1
eval instant at 8m changes(metric[1m1ms] anchored)
{id="1"} 1
{id="2"} 2
eval instant at 2m resets(metric[1m])
{id="1"} 0
{id="2"} 0
eval instant at 3m resets(metric[1m])
{id="2"} 0
eval instant at 2m resets(metric[1m] anchored)
{id="1"} 1
{id="2"} 1
eval instant at 3m resets(metric[1m] anchored)
{id="2"} 1
eval instant at 8m resets(metric[1m] anchored)
{id="1"} 0
{id="2"} 1
eval instant at 8m resets(metric[1m1ms] anchored)
{id="1"} 1
{id="2"} 2
clear
load 1m
metric 9 8 5 4
eval instant at 2m15s increase(metric[2m] smoothed)
{} 12
# Smoothed rate interpolation across a counter reset.
clear
load 15s
metric 100 10
eval instant at 12s rate(metric[10s] smoothed)
{} 0.666666666666667
clear
eval instant at 1m deriv(foo[3m] smoothed)
expect fail msg: smoothed modifier can only be used with: delta, increase, rate - not with deriv
eval instant at 1m resets(foo[3m] smoothed)
expect fail msg: smoothed modifier can only be used with: delta, increase, rate - not with resets
eval instant at 1m changes(foo[3m] smoothed)
expect fail msg: smoothed modifier can only be used with: delta, increase, rate - not with changes
eval instant at 1m max_over_time(foo[3m] smoothed)
expect fail msg: smoothed modifier can only be used with: delta, increase, rate - not with max_over_time
eval instant at 1m predict_linear(foo[3m] smoothed, 4)
expect fail msg: smoothed modifier can only be used with: delta, increase, rate - not with predict_linear
eval instant at 1m deriv(foo[3m] anchored)
expect fail msg: anchored modifier can only be used with: changes, delta, increase, rate, resets - not with deriv
eval instant at 1m resets(foo[3m] anchored)
eval instant at 1m changes(foo[3m] anchored)
eval instant at 1m max_over_time(foo[3m] anchored)
expect fail msg: anchored modifier can only be used with: changes, delta, increase, rate, resets - not with max_over_time
eval instant at 1m predict_linear(foo[3m] anchored, 4)
expect fail msg: anchored modifier can only be used with: changes, delta, increase, rate, resets - not with predict_linear
clear
load 10s
metric 1+1x10
withreset 1+1x4 1+1x5
notregular 0 5 100 2 8
eval instant at 10s metric smoothed
metric 2
eval instant at 15s metric smoothed
metric 2.5
eval instant at 5s metric smoothed
metric 1.5
eval instant at 105s metric smoothed
metric 11
eval instant at 45s withreset smoothed
withreset 3
eval instant at 30s notregular smoothed
notregular 2