Skip to content

Commit

Permalink
Update rate calculation to match behaviour in prometheus/prometheus…
Browse files Browse the repository at this point in the history
  • Loading branch information
charleskorn committed Apr 2, 2024
1 parent 6bbc93e commit 1fd7ad5
Showing 1 changed file with 14 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -152,33 +152,36 @@ func (m *RangeVectorSelectorWithTransformation) fillBuffer(rangeStart, rangeEnd
}

// This is based on extrapolatedRate from promql/functions.go.
// https://github.com/prometheus/prometheus/pull/13725 has a good explanation of the intended behaviour here.
func (m *RangeVectorSelectorWithTransformation) calculateRate(rangeStart, rangeEnd int64, firstPoint, lastPoint promql.FPoint, delta float64, count int) float64 {
durationToStart := float64(firstPoint.T-rangeStart) / 1000
durationToEnd := float64(rangeEnd-lastPoint.T) / 1000

sampledInterval := float64(lastPoint.T-firstPoint.T) / 1000
averageDurationBetweenSamples := sampledInterval / float64(count-1)

extrapolationThreshold := averageDurationBetweenSamples * 1.1
extrapolateToInterval := sampledInterval

if durationToStart >= extrapolationThreshold {
durationToStart = averageDurationBetweenSamples / 2
}

if delta > 0 && firstPoint.F >= 0 {
durationToZero := sampledInterval * (firstPoint.F / delta)
if durationToZero < durationToStart {
durationToStart = durationToZero
}
}

extrapolationThreshold := averageDurationBetweenSamples * 1.1
extrapolateToInterval := sampledInterval
extrapolateToInterval += durationToStart

if durationToStart < extrapolationThreshold {
extrapolateToInterval += durationToStart
} else {
extrapolateToInterval += averageDurationBetweenSamples / 2
}
if durationToEnd < extrapolationThreshold {
extrapolateToInterval += durationToEnd
} else {
extrapolateToInterval += averageDurationBetweenSamples / 2
if durationToEnd >= extrapolationThreshold {
durationToEnd = averageDurationBetweenSamples / 2
}

extrapolateToInterval += durationToEnd

factor := extrapolateToInterval / sampledInterval
factor /= m.Selector.Range.Seconds()
return delta * factor
Expand Down

0 comments on commit 1fd7ad5

Please sign in to comment.