prometheus/promql
beorn7 c46074f4dd promql: make avg aggregation more precise and less expensive
The basic idea here is that the previous code was always doing
incremental calculation of the mean value, which is more costly and
can be less precise. It protects against overflows, but in most cases,
an overflow doesn't happen anyway.

The other idea applied here is to expand on #14074, where Kahan
summation was applied to sum().

With this commit, the average is calculated in a conventional way
(adding everything up and divide in the end) as long as the sum isn't
overflowing float64. This is combined with Kahan summation so that the
avg aggregation, in most cases, is really equivalent to the sum
aggregation with a following division (which is the user's expectation
as avg is supposed to be syntactic sugar for sum with a following
divison).

If the sum hits ±Inf, the calculation reverts to incremental
calculation of the mean value. Kahan summation is also applied here,
although it cannot fully compensate for the numerical errors
introduced by the incremental mean calculation. (The tests added in
this commit would fail if incremental mean calculation was always
used.)

Signed-off-by: beorn7 <beorn@grafana.com>
2024-07-10 19:20:24 +02:00
..
fuzz-data textparse: Add fuzzing and fix bug caught 2017-07-07 11:12:17 +02:00
parser feat: add limitk() and limit_ratio() operators (#12503) 2024-07-03 22:18:57 +02:00
promqltest promql: make avg aggregation more precise and less expensive 2024-07-10 19:20:24 +02:00
bench_test.go promql: add avg aggregation benchmark 2024-07-04 18:59:30 +02:00
engine.go promql: make avg aggregation more precise and less expensive 2024-07-10 19:20:24 +02:00
engine_internal_test.go refactor: extract some PromQL Engine tests which use unexported structs 2024-05-08 16:27:17 +01:00
engine_test.go feat: add limitk() and limit_ratio() operators (#12503) 2024-07-03 22:18:57 +02:00
functions.go Merge pull request #14362 from charleskorn/charleskorn/sum-infinity 2024-07-03 01:05:03 -04:00
functions_internal_test.go Fix issue where summation of +/- infinity returns NaN instead of infinity 2024-06-28 11:26:54 +10:00
functions_test.go test: move most PromQL tests into separate test package 2024-05-08 16:28:56 +01:00
fuzz.go promql: fuzz test needs symbol table for parser 2024-02-26 11:45:25 +00:00
fuzz_test.go remove obsolete build tag 2024-01-17 22:26:32 +08:00
histogram_stats_iterator.go Implement histogram statistics decoder (#14097) 2024-06-06 17:17:13 +02:00
histogram_stats_iterator_test.go Implement histogram statistics decoder (#14097) 2024-06-06 17:17:13 +02:00
promql_test.go feat: add limitk() and limit_ratio() operators (#12503) 2024-07-03 22:18:57 +02:00
quantile.go Merge branch 'main' into nhcb 2024-05-14 16:20:15 +08:00
quantile_test.go PromQL: ignore small errors for bucketQuantile (#13153) 2023-11-25 00:05:38 +01:00
query_logger.go Join errors 2024-05-27 17:14:17 +02:00
query_logger_test.go promql.ActiveQueryTracker: Unmap mmapped file when done 2024-05-09 14:27:29 +02:00
value.go Optimize histogram iterators (#13340) 2024-01-23 17:02:14 +01:00
value_test.go test: move most PromQL tests into separate test package 2024-05-08 16:28:56 +01:00