promql: fix smoothed rate returning zero for data only after range

For smoothed rate/increase, a result should only be returned
when there is data available to interpolate across the range. If the
range has a single data point only on one side, the result is
meaningless and should be empty.

The "data only before" case was already handled: if the last fetched
sample is at or before rangeStart, extendedRate returns nothing.

Add the symmetric guard for the "data only after" case: if the first
fetched sample is strictly after rangeEnd, return nothing as well.

This mirrors the behaviour described in prometheus/prometheus#18295,
where a smoothed rate that has no data before the range should not
return zero.

Signed-off-by: Julien Pivotto <291750+roidelapluie@users.noreply.github.com>
This commit is contained in:
Julien Pivotto
2026-04-15 16:25:58 +02:00
parent 34cebfe953
commit 93ec767fed
2 changed files with 20 additions and 1 deletions

View File

@@ -142,6 +142,9 @@ func extendedRate(vals Matrix, args parser.Expressions, enh *EvalNodeHelper, isC
if f[lastSampleIndex].T <= rangeStart {
return enh.Out, annos
}
if smoothed && f[firstSampleIndex].T > rangeEnd {
return enh.Out, annos
}
left := pickOrInterpolateLeft(f, firstSampleIndex, rangeStart, smoothed, isCounter)
right := pickOrInterpolateRight(f, lastSampleIndex, rangeEnd, smoothed, isCounter)

View File

@@ -417,4 +417,20 @@ eval instant at 45s withreset smoothed
withreset 3
eval instant at 30s notregular smoothed
notregular 2
notregular 2
# Smoothed rate returns empty when data is only before or only after the range.
clear
load 10s
metric _ 5+1x4
eval instant at 5s rate(metric[5s] smoothed)
eval instant at 5s increase(metric[5s] smoothed)
eval instant at 15s increase(metric[10s] smoothed)
{} 0.5
eval instant at 60s rate(metric[5s] smoothed)
eval instant at 60s increase(metric[5s] smoothed)