Skip to content

tsdb: Add fast paths to XOR chunk reading - #18049

Merged
bboreham merged 1 commit into
mainfrom
codesome/xor-experiments
Aug 18, 2026
Merged

bboreham merged 1 commit into
mainfrom
codesome/xor-experiments

Conversation

@codesome

@codesome codesome commented Feb 9, 2026

Copy link
Copy Markdown
Member

This fast path addition speeds up a good chunk of XOR chunk decompression. The benchmarks look good (at least in apple silicon). I can try something similar for native histograms later as well.

BenchmarkXorRead results (10 iterations)
goos: darwin
goarch: arm64
pkg: github.com/prometheus/prometheus/tsdb/chunkenc
cpu: Apple M4 Max
           │ old_xor.txt  │             new_xor.txt             │
           │    sec/op    │   sec/op     vs base                │
XorRead-16   1063.0n ± 1%   828.0n ± 1%  -22.11% (p=0.000 n=10)
BenchmarkRangeQuery results (6 iterations)
goos: darwin
goarch: arm64
pkg: github.com/prometheus/prometheus/promql
cpu: Apple M4 Max
                                                                                                          │  old_6.txt  │              new_6.txt              │
                                                                                                          │   sec/op    │    sec/op     vs base               │
RangeQuery/expr=a_one,steps=1-16                                                                            4.049µ ± 1%   3.990µ ±  6%        ~ (p=0.132 n=6)
RangeQuery/expr=a_one,steps=1000-16                                                                         23.36µ ± 1%   21.33µ ±  1%   -8.70% (p=0.002 n=6)
RangeQuery/expr=a_hundred,steps=1-16                                                                        126.9µ ± 0%   108.6µ ±  1%  -14.44% (p=0.002 n=6)
RangeQuery/expr=a_hundred,steps=1000-16                                                                     2.041m ± 1%   1.827m ±  1%  -10.47% (p=0.002 n=6)
RangeQuery/expr=rate(a_one[1m]),steps=1-16                                                                  5.501µ ± 3%   5.397µ ±  0%   -1.89% (p=0.002 n=6)
RangeQuery/expr=rate(a_one[1m]),steps=1000-16                                                               59.49µ ± 0%   58.75µ ±  0%   -1.24% (p=0.002 n=6)
RangeQuery/expr=rate(a_hundred[1m]),steps=1-16                                                              158.9µ ± 2%   139.1µ ±  0%  -12.47% (p=0.002 n=6)
RangeQuery/expr=rate(a_hundred[1m]),steps=1000-16                                                           5.992m ± 0%   5.891m ±  0%   -1.69% (p=0.002 n=6)
RangeQuery/expr=rate(a_one[1m]),steps=10000-16                                                              592.5µ ± 0%   583.7µ ±  0%   -1.50% (p=0.002 n=6)
RangeQuery/expr=rate(a_hundred[1m]),steps=10000-16                                                          62.96m ± 0%   61.72m ±  0%   -1.97% (p=0.002 n=6)
RangeQuery/expr=rate(sparse[1m]),steps=10000-16                                                             4.030m ± 0%   4.058m ±  1%   +0.69% (p=0.002 n=6)
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=1-16                                                         6.476µ ± 1%   6.341µ ±  1%   -2.08% (p=0.002 n=6)
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=1000-16                                                      75.05µ ± 2%   72.88µ ±  0%   -2.89% (p=0.002 n=6)
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=1-16                                                     212.5µ ± 0%   190.4µ ±  0%  -10.38% (p=0.002 n=6)
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=1000-16                                                  7.229m ± 1%   7.046m ±  0%   -2.53% (p=0.002 n=6)
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=10000-16                                                     722.7µ ± 0%   705.6µ ±  0%   -2.36% (p=0.002 n=6)
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=10000-16                                                 73.84m ± 0%   72.26m ±  1%   -2.14% (p=0.002 n=6)
RangeQuery/expr=rate(sparse[1m]_smoothed),steps=10000-16                                                    4.239m ± 0%   4.254m ±  0%   +0.35% (p=0.002 n=6)
RangeQuery/expr=double_exponential_smoothing(a_one[1d],_0.3,_0.3),steps=1-16                                327.3µ ± 1%   309.4µ ±  1%   -5.44% (p=0.002 n=6)
RangeQuery/expr=double_exponential_smoothing(a_one[1d],_0.3,_0.3),steps=1000-16                             34.14m ± 0%   34.14m ±  5%        ~ (p=0.937 n=6)
RangeQuery/expr=double_exponential_smoothing(a_hundred[1d],_0.3,_0.3),steps=1-16                            26.48m ± 1%   24.53m ±  0%   -7.36% (p=0.002 n=6)
RangeQuery/expr=double_exponential_smoothing(a_hundred[1d],_0.3,_0.3),steps=1000-16                          3.400 ± 1%    3.403 ±  1%        ~ (p=0.394 n=6)
RangeQuery/expr=changes(a_one[1d]),steps=1-16                                                               267.0µ ± 2%   244.9µ ±  0%   -8.26% (p=0.002 n=6)
RangeQuery/expr=changes(a_one[1d]),steps=1000-16                                                            13.16m ± 4%   12.78m ±  5%        ~ (p=0.065 n=6)
RangeQuery/expr=changes(a_hundred[1d]),steps=1-16                                                           22.60m ± 1%   20.36m ±  0%   -9.91% (p=0.002 n=6)
RangeQuery/expr=changes(a_hundred[1d]),steps=1000-16                                                         1.330 ± 9%    1.279 ±  9%   -3.85% (p=0.041 n=6)
RangeQuery/expr=rate(a_one[1d]),steps=1-16                                                                  247.4µ ± 0%   229.2µ ±  3%   -7.35% (p=0.002 n=6)
RangeQuery/expr=rate(a_one[1d]),steps=1000-16                                                               3.908m ± 2%   3.898m ±  1%        ~ (p=0.589 n=6)
RangeQuery/expr=rate(a_hundred[1d]),steps=1-16                                                              20.83m ± 1%   18.68m ±  0%  -10.31% (p=0.002 n=6)
RangeQuery/expr=rate(a_hundred[1d]),steps=1000-16                                                           384.5m ± 2%   384.6m ±  1%        ~ (p=0.818 n=6)
RangeQuery/expr=absent_over_time(a_one[1d]),steps=1-16                                                      243.0µ ± 0%   224.2µ ±  0%   -7.71% (p=0.002 n=6)
RangeQuery/expr=absent_over_time(a_one[1d]),steps=1000-16                                                   1.710m ± 1%   1.686m ±  0%   -1.39% (p=0.002 n=6)
RangeQuery/expr=absent_over_time(a_hundred[1d]),steps=1-16                                                  20.39m ± 0%   18.20m ±  0%  -10.71% (p=0.002 n=6)
RangeQuery/expr=absent_over_time(a_hundred[1d]),steps=1000-16                                               166.5m ± 1%   164.7m ±  0%   -1.05% (p=0.002 n=6)
RangeQuery/expr=-a_one,steps=1-16                                                                           4.665µ ± 0%   4.488µ ±  2%   -3.79% (p=0.002 n=6)
RangeQuery/expr=-a_one,steps=1000-16                                                                        25.00µ ± 2%   22.37µ ±  1%  -10.55% (p=0.002 n=6)
RangeQuery/expr=-a_hundred,steps=1-16                                                                       133.4µ ± 2%   111.8µ ±  0%  -16.21% (p=0.002 n=6)
RangeQuery/expr=-a_hundred,steps=1000-16                                                                    2.134m ± 1%   1.853m ±  1%  -13.20% (p=0.002 n=6)
RangeQuery/expr=a_one_-_b_one,steps=1-16                                                                    7.888µ ± 1%   7.436µ ±  1%   -5.74% (p=0.002 n=6)
RangeQuery/expr=a_one_-_b_one,steps=1000-16                                                                 160.1µ ± 1%   154.1µ ±  0%   -3.76% (p=0.002 n=6)
RangeQuery/expr=a_hundred_-_b_hundred,steps=1-16                                                            305.8µ ± 1%   261.2µ ±  0%  -14.58% (p=0.002 n=6)
RangeQuery/expr=a_hundred_-_b_hundred,steps=1000-16                                                         13.53m ± 1%   12.96m ±  0%   -4.20% (p=0.002 n=6)
RangeQuery/expr=a_one_-_b_one,steps=10000-16                                                                1.585m ± 0%   1.539m ±  1%   -2.94% (p=0.002 n=6)
RangeQuery/expr=a_hundred_-_b_hundred,steps=10000-16                                                        140.6m ± 2%   136.1m ±  1%   -3.22% (p=0.002 n=6)
RangeQuery/expr=a_one_and_b_one{l=~'.*[0-4]$'},steps=1-16                                                   11.39µ ± 1%   11.30µ ±  1%   -0.75% (p=0.041 n=6)
RangeQuery/expr=a_one_and_b_one{l=~'.*[0-4]$'},steps=1000-16                                                49.82µ ± 0%   47.06µ ±  0%   -5.53% (p=0.002 n=6)
RangeQuery/expr=a_hundred_and_b_hundred{l=~'.*[0-4]$'},steps=1-16                                           218.4µ ± 0%   185.3µ ±  1%  -15.15% (p=0.002 n=6)
RangeQuery/expr=a_hundred_and_b_hundred{l=~'.*[0-4]$'},steps=1000-16                                        5.331m ± 0%   4.891m ±  0%   -8.25% (p=0.002 n=6)
RangeQuery/expr=a_one_or_b_one{l=~'.*[0-4]$'},steps=1-16                                                    11.60µ ± 1%   11.48µ ±  0%   -1.09% (p=0.002 n=6)
RangeQuery/expr=a_one_or_b_one{l=~'.*[0-4]$'},steps=1000-16                                                 82.66µ ± 0%   80.05µ ±  0%   -3.16% (p=0.002 n=6)
RangeQuery/expr=a_hundred_or_b_hundred{l=~'.*[0-4]$'},steps=1-16                                            228.9µ ± 1%   196.2µ ±  0%  -14.28% (p=0.002 n=6)
RangeQuery/expr=a_hundred_or_b_hundred{l=~'.*[0-4]$'},steps=1000-16                                         6.781m ± 1%   6.389m ±  2%   -5.79% (p=0.002 n=6)
RangeQuery/expr=a_one_unless_b_one{l=~'.*[0-4]$'},steps=1-16                                                11.61µ ± 2%   11.48µ ±  0%        ~ (p=0.058 n=6)
RangeQuery/expr=a_one_unless_b_one{l=~'.*[0-4]$'},steps=1000-16                                             81.36µ ± 0%   78.42µ ±  0%   -3.61% (p=0.002 n=6)
RangeQuery/expr=a_hundred_unless_b_hundred{l=~'.*[0-4]$'},steps=1-16                                        219.3µ ± 1%   185.1µ ±  0%  -15.62% (p=0.002 n=6)
RangeQuery/expr=a_hundred_unless_b_hundred{l=~'.*[0-4]$'},steps=1000-16                                     5.337m ± 0%   4.900m ±  0%   -8.18% (p=0.002 n=6)
RangeQuery/expr=a_one_and_b_one{l='notfound'},steps=1-16                                                    6.339µ ± 1%   6.148µ ±  1%   -3.01% (p=0.002 n=6)
RangeQuery/expr=a_one_and_b_one{l='notfound'},steps=1000-16                                                 44.56µ ± 1%   41.90µ ±  1%   -5.97% (p=0.002 n=6)
RangeQuery/expr=a_hundred_and_b_hundred{l='notfound'},steps=1-16                                            136.8µ ± 1%   114.5µ ±  1%  -16.35% (p=0.002 n=6)
RangeQuery/expr=a_hundred_and_b_hundred{l='notfound'},steps=1000-16                                         2.607m ± 1%   2.333m ±  1%  -10.50% (p=0.002 n=6)
RangeQuery/expr=abs(a_one),steps=1-16                                                                       5.182µ ± 0%   4.966µ ±  1%   -4.17% (p=0.002 n=6)
RangeQuery/expr=abs(a_one),steps=1000-16                                                                    67.74µ ± 1%   64.69µ ±  0%   -4.50% (p=0.002 n=6)
RangeQuery/expr=abs(a_hundred),steps=1-16                                                                   148.4µ ± 0%   125.7µ ±  2%  -15.30% (p=0.002 n=6)
RangeQuery/expr=abs(a_hundred),steps=1000-16                                                                5.642m ± 1%   5.389m ±  1%   -4.49% (p=0.002 n=6)
RangeQuery/expr=label_replace(a_one,_'l2',_'$1',_'l',_'(.*)'),steps=1-16                                    7.193µ ± 1%   6.981µ ±  3%   -2.95% (p=0.026 n=6)
RangeQuery/expr=label_replace(a_one,_'l2',_'$1',_'l',_'(.*)'),steps=1000-16                                 27.44µ ± 0%   24.63µ ±  0%  -10.24% (p=0.002 n=6)
RangeQuery/expr=label_replace(a_hundred,_'l2',_'$1',_'l',_'(.*)'),steps=1-16                                151.0µ ± 1%   128.3µ ±  0%  -15.04% (p=0.002 n=6)
RangeQuery/expr=label_replace(a_hundred,_'l2',_'$1',_'l',_'(.*)'),steps=1000-16                             2.117m ± 1%   1.841m ±  1%  -13.03% (p=0.002 n=6)
RangeQuery/expr=label_join(a_one,_'l2',_'-',_'l',_'l'),steps=1-16                                           5.969µ ± 1%   5.782µ ±  0%   -3.13% (p=0.002 n=6)
RangeQuery/expr=label_join(a_one,_'l2',_'-',_'l',_'l'),steps=1000-16                                        26.33µ ± 1%   23.40µ ±  0%  -11.13% (p=0.002 n=6)
RangeQuery/expr=label_join(a_hundred,_'l2',_'-',_'l',_'l'),steps=1-16                                       144.4µ ± 0%   122.2µ ±  1%  -15.37% (p=0.002 n=6)
RangeQuery/expr=label_join(a_hundred,_'l2',_'-',_'l',_'l'),steps=1000-16                                    2.107m ± 0%   1.839m ±  2%  -12.73% (p=0.002 n=6)
RangeQuery/expr=sum(a_one),steps=1-16                                                                       5.150µ ± 0%   4.941µ ±  0%   -4.07% (p=0.002 n=6)
RangeQuery/expr=sum(a_one),steps=1000-16                                                                    42.76µ ± 0%   40.04µ ±  0%   -6.37% (p=0.002 n=6)
RangeQuery/expr=sum(a_hundred),steps=1-16                                                                   128.8µ ± 0%   106.0µ ±  0%  -17.68% (p=0.002 n=6)
RangeQuery/expr=sum(a_hundred),steps=1000-16                                                                2.474m ± 0%   2.165m ±  1%  -12.50% (p=0.002 n=6)
RangeQuery/expr=avg(a_one),steps=1-16                                                                       5.131µ ± 1%   4.927µ ±  2%   -3.98% (p=0.002 n=6)
RangeQuery/expr=avg(a_one),steps=1000-16                                                                    43.12µ ± 1%   40.22µ ±  0%   -6.73% (p=0.002 n=6)
RangeQuery/expr=avg(a_hundred),steps=1-16                                                                   127.9µ ± 2%   106.2µ ±  0%  -16.97% (p=0.002 n=6)
RangeQuery/expr=avg(a_hundred),steps=1000-16                                                                2.474m ± 0%   2.173m ±  0%  -12.14% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(h_one),steps=1-16                                                           20.07µ ± 0%   17.58µ ±  0%  -12.41% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(h_one),steps=1000-16                                                        349.8µ ± 0%   316.0µ ±  0%   -9.64% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(h_hundred),steps=1-16                                                       1.354m ± 0%   1.103m ±  0%  -18.57% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(h_hundred),steps=1000-16                                                    27.41m ± 1%   24.31m ±  0%  -11.30% (p=0.002 n=6)
RangeQuery/expr=sum_without_(le)(h_one),steps=1-16                                                          18.21µ ± 1%   15.67µ ±  1%  -13.95% (p=0.002 n=6)
RangeQuery/expr=sum_without_(le)(h_one),steps=1000-16                                                       285.5µ ± 1%   257.4µ ±  2%   -9.86% (p=0.002 n=6)
RangeQuery/expr=sum_without_(le)(h_hundred),steps=1-16                                                      1.375m ± 2%   1.125m ±  1%  -18.18% (p=0.002 n=6)
RangeQuery/expr=sum_without_(le)(h_hundred),steps=1000-16                                                   28.27m ± 1%   25.19m ±  1%  -10.89% (p=0.002 n=6)
RangeQuery/expr=sum_by_(l)(h_one),steps=1-16                                                                18.08µ ± 0%   15.59µ ±  0%  -13.77% (p=0.002 n=6)
RangeQuery/expr=sum_by_(l)(h_one),steps=1000-16                                                             287.1µ ± 1%   257.5µ ±  2%  -10.32% (p=0.002 n=6)
RangeQuery/expr=sum_by_(l)(h_hundred),steps=1-16                                                            1.372m ± 1%   1.125m ±  0%  -18.04% (p=0.002 n=6)
RangeQuery/expr=sum_by_(l)(h_hundred),steps=1000-16                                                         28.30m ± 1%   25.30m ±  3%  -10.62% (p=0.002 n=6)
RangeQuery/expr=sum_by_(le)(h_one),steps=1-16                                                               20.16µ ± 0%   17.61µ ±  0%  -12.65% (p=0.002 n=6)
RangeQuery/expr=sum_by_(le)(h_one),steps=1000-16                                                            349.5µ ± 1%   317.0µ ±  1%   -9.31% (p=0.002 n=6)
RangeQuery/expr=sum_by_(le)(h_hundred),steps=1-16                                                           1.348m ± 2%   1.103m ±  1%  -18.18% (p=0.002 n=6)
RangeQuery/expr=sum_by_(le)(h_hundred),steps=1000-16                                                        27.38m ± 1%   24.25m ±  0%  -11.42% (p=0.002 n=6)
RangeQuery/expr=count_values('value',_h_one),steps=100-16                                                   593.6µ ± 0%   583.2µ ±  0%   -1.76% (p=0.002 n=6)
RangeQuery/expr=count_values('value',_h_hundred),steps=100-16                                               82.25m ± 2%   81.79m ±  2%        ~ (p=0.180 n=6)
RangeQuery/expr=topk(1,_a_one),steps=1-16                                                                   6.042µ ± 1%   5.834µ ±  1%   -3.45% (p=0.002 n=6)
RangeQuery/expr=topk(1,_a_one),steps=1000-16                                                                143.5µ ± 0%   140.8µ ±  1%   -1.91% (p=0.002 n=6)
RangeQuery/expr=topk(1,_a_hundred),steps=1-16                                                               130.5µ ± 1%   107.8µ ±  0%  -17.41% (p=0.002 n=6)
RangeQuery/expr=topk(1,_a_hundred),steps=1000-16                                                            2.655m ± 1%   2.354m ±  0%  -11.32% (p=0.002 n=6)
RangeQuery/expr=topk(5,_a_one),steps=1-16                                                                   6.047µ ± 0%   5.824µ ±  2%   -3.70% (p=0.002 n=6)
RangeQuery/expr=topk(5,_a_one),steps=1000-16                                                                144.1µ ± 2%   141.0µ ±  0%   -2.16% (p=0.002 n=6)
RangeQuery/expr=topk(5,_a_hundred),steps=1-16                                                               133.9µ ± 2%   111.4µ ±  0%  -16.78% (p=0.002 n=6)
RangeQuery/expr=topk(5,_a_hundred),steps=1000-16                                                            4.081m ± 0%   3.815m ±  3%   -6.53% (p=0.002 n=6)
RangeQuery/expr=limitk(1,_a_one),steps=1-16                                                                 6.077µ ± 2%   5.821µ ±  0%   -4.21% (p=0.002 n=6)
RangeQuery/expr=limitk(1,_a_one),steps=1000-16                                                              141.6µ ± 1%   137.4µ ±  1%   -2.95% (p=0.002 n=6)
RangeQuery/expr=limitk(1,_a_hundred),steps=1-16                                                             130.4µ ± 1%   107.1µ ±  0%  -17.86% (p=0.002 n=6)
RangeQuery/expr=limitk(1,_a_hundred),steps=1000-16                                                          2.352m ± 1%   2.049m ±  1%  -12.88% (p=0.002 n=6)
RangeQuery/expr=limitk(5,_a_one),steps=1-16                                                                 6.043µ ± 0%   5.834µ ±  2%   -3.46% (p=0.002 n=6)
RangeQuery/expr=limitk(5,_a_one),steps=1000-16                                                              141.2µ ± 2%   137.6µ ±  3%        ~ (p=0.093 n=6)
RangeQuery/expr=limitk(5,_a_hundred),steps=1-16                                                             131.5µ ± 1%   124.0µ ±  6%   -5.76% (p=0.002 n=6)
RangeQuery/expr=limitk(5,_a_hundred),steps=1000-16                                                          2.507m ± 1%   2.248m ± 16%        ~ (p=0.394 n=6)
RangeQuery/expr=limit_ratio(0.1,_a_one),steps=1-16                                                          5.947µ ± 0%   5.761µ ±  0%   -3.13% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(0.1,_a_one),steps=1000-16                                                       108.2µ ± 1%   105.1µ ±  0%   -2.90% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(0.1,_a_hundred),steps=1-16                                                      134.0µ ± 0%   111.8µ ±  1%  -16.57% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(0.1,_a_hundred),steps=1000-16                                                   3.674m ± 1%   3.384m ±  0%   -7.90% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(0.5,_a_one),steps=1-16                                                          5.965µ ± 1%   5.755µ ±  0%   -3.53% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(0.5,_a_one),steps=1000-16                                                       107.9µ ± 0%   105.2µ ±  2%   -2.53% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(0.5,_a_hundred),steps=1-16                                                      143.3µ ± 1%   120.5µ ±  1%  -15.96% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(0.5,_a_hundred),steps=1000-16                                                   5.568m ± 1%   5.274m ±  0%   -5.29% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(-0.5,_a_one),steps=1-16                                                         6.231µ ± 0%   6.029µ ±  1%   -3.23% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(-0.5,_a_one),steps=1000-16                                                      154.9µ ± 0%   151.7µ ±  0%   -2.07% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(-0.5,_a_hundred),steps=1-16                                                     144.1µ ± 1%   122.3µ ±  0%  -15.08% (p=0.002 n=6)
RangeQuery/expr=limit_ratio(-0.5,_a_hundred),steps=1000-16                                                  5.870m ± 1%   5.603m ±  1%   -4.56% (p=0.002 n=6)
RangeQuery/expr=rate(a_one[1m])_+_rate(b_one[1m]),steps=1-16                                                10.81µ ± 1%   10.34µ ±  1%   -4.42% (p=0.002 n=6)
RangeQuery/expr=rate(a_one[1m])_+_rate(b_one[1m]),steps=1000-16                                             231.4µ ± 0%   228.6µ ±  1%   -1.19% (p=0.002 n=6)
RangeQuery/expr=rate(a_hundred[1m])_+_rate(b_hundred[1m]),steps=1-16                                        368.6µ ± 2%   322.5µ ±  0%  -12.49% (p=0.002 n=6)
RangeQuery/expr=rate(a_hundred[1m])_+_rate(b_hundred[1m]),steps=1000-16                                     21.37m ± 0%   21.10m ±  0%   -1.26% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(rate(a_one[1m])),steps=1-16                                                 7.017µ ± 2%   6.793µ ±  1%   -3.20% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(rate(a_one[1m])),steps=1000-16                                              79.31µ ± 0%   77.81µ ±  0%   -1.90% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m])),steps=1-16                                             163.4µ ± 1%   139.5µ ±  0%  -14.66% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m])),steps=1000-16                                          6.433m ± 0%   6.276m ±  0%   -2.44% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(rate(a_one[1m]))_/_sum_without_(l)(rate(b_one[1m])),steps=1-16              13.26µ ± 1%   12.83µ ±  0%   -3.23% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(rate(a_one[1m]))_/_sum_without_(l)(rate(b_one[1m])),steps=1000-16           269.5µ ± 0%   267.0µ ±  0%   -0.91% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m]))_/_sum_without_(l)(rate(b_hundred[1m])),steps=1-16      324.8µ ± 1%   278.1µ ±  2%  -14.40% (p=0.002 n=6)
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m]))_/_sum_without_(l)(rate(b_hundred[1m])),steps=1000-16   12.96m ± 2%   12.66m ±  0%   -2.30% (p=0.002 n=6)
RangeQuery/expr=histogram_quantile(0.9,_rate(h_one[5m])),steps=1-16                                         29.07µ ± 0%   26.61µ ±  0%   -8.47% (p=0.002 n=6)
RangeQuery/expr=histogram_quantile(0.9,_rate(h_one[5m])),steps=1000-16                                      1.213m ± 1%   1.196m ±  0%   -1.39% (p=0.002 n=6)
RangeQuery/expr=histogram_quantile(0.9,_rate(h_hundred[5m])),steps=1-16                                     2.242m ± 1%   1.982m ±  0%  -11.58% (p=0.002 n=6)
RangeQuery/expr=histogram_quantile(0.9,_rate(h_hundred[5m])),steps=1000-16                                  120.1m ± 1%   118.6m ±  1%        ~ (p=0.065 n=6)
RangeQuery/expr=a_one_+_on(l)_group_right_a_one,steps=1-16                                                  8.643µ ± 1%   8.207µ ±  1%   -5.04% (p=0.002 n=6)
RangeQuery/expr=a_one_+_on(l)_group_right_a_one,steps=1000-16                                               206.9µ ± 0%   201.7µ ±  0%   -2.54% (p=0.002 n=6)
RangeQuery/expr=a_hundred_+_on(l)_group_right_a_one,steps=1-16                                              143.5µ ± 0%   121.2µ ±  1%  -15.51% (p=0.002 n=6)
RangeQuery/expr=a_hundred_+_on(l)_group_right_a_one,steps=1000-16                                           3.973m ± 1%   3.716m ±  1%   -6.46% (p=0.002 n=6)
RangeQuery/expr=count({__name__!=""}),steps=1-16                                                            1.769m ± 1%   1.438m ±  1%  -18.74% (p=0.002 n=6)
RangeQuery/expr=count({__name__!="",l=""}),steps=1-16                                                       65.34µ ± 1%   62.28µ ±  0%   -4.69% (p=0.002 n=6)
RangeQuery/expr=timestamp(a_one),steps=1-16                                                                 4.936µ ± 0%   4.767µ ±  0%   -3.41% (p=0.002 n=6)
RangeQuery/expr=timestamp(a_one),steps=1000-16                                                              91.11µ ± 6%   89.37µ ±  9%        ~ (p=0.310 n=6)
RangeQuery/expr=timestamp(a_hundred),steps=1-16                                                             152.8µ ± 1%   130.4µ ±  2%  -14.69% (p=0.002 n=6)
RangeQuery/expr=timestamp(a_hundred),steps=1000-16                                                          5.360m ± 0%   5.235m ±  0%   -2.34% (p=0.002 n=6)
geomean                                                                                                     377.8µ        349.4µ         -7.54%

Which issue(s) does the PR fix:

None

Does this PR introduce a user-facing change?

[ENHANCEMENT] tsdb: Add fast path for XOR chunk decompression to speed up queries.

@codesome

codesome commented Feb 9, 2026

Copy link
Copy Markdown
Member Author

@bboreham might be interesting to you :)

@bboreham

Copy link
Copy Markdown
Member

Thanks, I have felt for a while that much of this code could be speeded up.
Also I recall Damian Gryski (the original author) said it was never optimised.

Do you think there are enough tests to be confident in changing it?

Also we should run benchmarks on X64 in case things are different there.

@codesome

Copy link
Copy Markdown
Member Author

Do you think there are enough tests to be confident in changing it?

I haven't looked at it.

Also we should run benchmarks on X64 in case things are different there.

I can run prombench for a few hours for now to see if its better. I can run the benchmark on my ancient x64 laptop later when I get a chance.

@codesome

Copy link
Copy Markdown
Member Author

/prombench main

@prombot

prombot commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

⏱️ Welcome to Prometheus Benchmarking Tool. ⏱️

Compared versions: PR-18049 and main

After the successful deployment (check status here), the benchmarking results can be viewed at:

Available Commands:

  • To restart benchmark: /prombench restart main
  • To stop benchmark: /prombench cancel
  • To print help: /prombench help

@roidelapluie roidelapluie left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

goos: linux
goarch: amd64
pkg: github.com/prometheus/prometheus/tsdb/chunkenc
cpu: Intel(R) Core(TM) Ultra 9 185H
           │ /tmp/main-xor.txt │        /tmp/pr-xor.txt        │
           │      sec/op       │   sec/op     vs base          │
XorRead-22        1.693µ ± 16%   1.589µ ± 7%  ~ (p=0.089 n=10)

           │ /tmp/main-xor.txt │        /tmp/pr-xor.txt         │
           │       B/op        │    B/op     vs base            │
XorRead-22          0.000 ± 0%   0.000 ± 0%  ~ (p=1.000 n=10) ¹
¹ all samples are equal

           │ /tmp/main-xor.txt │        /tmp/pr-xor.txt         │
           │     allocs/op     │ allocs/op   vs base            │
XorRead-22          0.000 ± 0%   0.000 ± 0%  ~ (p=1.000 n=10) ¹
¹ all samples are equal

LGTM (also from a coding perspective)

@bwplotka bwplotka left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice 👍🏽

@bboreham

Copy link
Copy Markdown
Member

So it makes no practical difference on X64?

@roidelapluie

Copy link
Copy Markdown
Member
goos: linux
goarch: amd64
pkg: github.com/prometheus/prometheus/promql
cpu: Intel(R) Core(TM) Ultra 9 185H
                                                                                                          │ /tmp/bench_results.txt │          /tmp/pr_results.txt           │
                                                                                                          │         sec/op         │    sec/op      vs base                 │
RangeQuery/expr=a_one,steps=1-22                                                                                      47.09µ ± ∞ ¹    53.99µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one,steps=1000-22                                                                                  230.50µ ± ∞ ¹    88.26µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred,steps=1-22                                                                                  549.6µ ± ∞ ¹    457.1µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred,steps=1000-22                                                                               6.831m ± ∞ ¹    5.933m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]),steps=1-22                                                                            70.32µ ± ∞ ¹    43.70µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]),steps=1000-22                                                                         502.7µ ± ∞ ¹    216.3µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]),steps=1-22                                                                        542.4µ ± ∞ ¹    491.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]),steps=1000-22                                                                     16.62m ± ∞ ¹    20.20m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]),steps=10000-22                                                                        2.032m ± ∞ ¹    1.975m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]),steps=10000-22                                                                    166.8m ± ∞ ¹    163.9m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(sparse[1m]),steps=10000-22                                                                       11.03m ± ∞ ¹    12.31m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=1-22                                                                   56.34µ ± ∞ ¹    56.69µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=1000-22                                                                374.9µ ± ∞ ¹    293.9µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=1-22                                                               755.4µ ± ∞ ¹    879.8µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=1000-22                                                            18.08m ± ∞ ¹    18.21m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=10000-22                                                               2.316m ± ∞ ¹    1.764m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=10000-22                                                           193.1m ± ∞ ¹    186.9m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(sparse[1m]_smoothed),steps=10000-22                                                              11.18m ± ∞ ¹    12.69m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_one[1d],_0.3,_0.3),steps=1-22                                          895.8µ ± ∞ ¹   1159.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_one[1d],_0.3,_0.3),steps=1000-22                                       66.11m ± ∞ ¹    67.42m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_hundred[1d],_0.3,_0.3),steps=1-22                                      57.32m ± ∞ ¹    53.15m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_hundred[1d],_0.3,_0.3),steps=1000-22                                    6.379 ± ∞ ¹     6.374 ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_one[1d]),steps=1-22                                                                         902.5µ ± ∞ ¹    807.0µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_one[1d]),steps=1000-22                                                                      88.69m ± ∞ ¹    88.78m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_hundred[1d]),steps=1-22                                                                     63.33m ± ∞ ¹    59.09m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_hundred[1d]),steps=1000-22                                                                   8.832 ± ∞ ¹     8.815 ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1d]),steps=1-22                                                                           1019.7µ ± ∞ ¹    686.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1d]),steps=1000-22                                                                         16.42m ± ∞ ¹    15.39m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1d]),steps=1-22                                                                        47.73m ± ∞ ¹    45.65m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1d]),steps=1000-22                                                                      1.302 ± ∞ ¹     1.306 ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_one[1d]),steps=1-22                                                                805.7µ ± ∞ ¹    775.8µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_one[1d]),steps=1000-22                                                             8.539m ± ∞ ¹    9.903m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_hundred[1d]),steps=1-22                                                            47.66m ± ∞ ¹    43.34m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_hundred[1d]),steps=1000-22                                                         767.8m ± ∞ ¹    764.1m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=-a_one,steps=1-22                                                                                     53.66µ ± ∞ ¹    41.85µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=-a_one,steps=1000-22                                                                                  100.8µ ± ∞ ¹    116.7µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=-a_hundred,steps=1-22                                                                                 434.6µ ± ∞ ¹    502.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=-a_hundred,steps=1000-22                                                                              6.974m ± ∞ ¹    5.259m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_-_b_one,steps=1-22                                                                              43.68µ ± ∞ ¹    53.67µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_-_b_one,steps=1000-22                                                                           608.4µ ± ∞ ¹    524.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_-_b_hundred,steps=1-22                                                                     1187.1µ ± ∞ ¹    969.9µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_-_b_hundred,steps=1000-22                                                                   36.52m ± ∞ ¹    35.37m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_-_b_one,steps=10000-22                                                                          5.145m ± ∞ ¹    4.939m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_-_b_hundred,steps=10000-22                                                                  420.3m ± ∞ ¹    387.1m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l=~'.*[0-4]$'},steps=1-22                                                            216.19µ ± ∞ ¹    86.97µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l=~'.*[0-4]$'},steps=1000-22                                                          476.4µ ± ∞ ¹    257.3µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_and_b_hundred{l=~'.*[0-4]$'},steps=1-22                                                    1964.7µ ± ∞ ¹    823.0µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_and_b_hundred{l=~'.*[0-4]$'},steps=1000-22                                                  14.39m ± ∞ ¹    13.23m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_or_b_one{l=~'.*[0-4]$'},steps=1-22                                                             102.58µ ± ∞ ¹    66.45µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_or_b_one{l=~'.*[0-4]$'},steps=1000-22                                                           317.3µ ± ∞ ¹    366.0µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_or_b_hundred{l=~'.*[0-4]$'},steps=1-22                                                      856.4µ ± ∞ ¹    729.9µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_or_b_hundred{l=~'.*[0-4]$'},steps=1000-22                                                   18.81m ± ∞ ¹    18.40m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_unless_b_one{l=~'.*[0-4]$'},steps=1-22                                                          76.83µ ± ∞ ¹    94.93µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_unless_b_one{l=~'.*[0-4]$'},steps=1000-22                                                       277.5µ ± ∞ ¹    329.6µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_unless_b_hundred{l=~'.*[0-4]$'},steps=1-22                                                 1001.0µ ± ∞ ¹    694.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_unless_b_hundred{l=~'.*[0-4]$'},steps=1000-22                                               14.76m ± ∞ ¹    15.18m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l='notfound'},steps=1-22                                                              60.78µ ± ∞ ¹    73.78µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l='notfound'},steps=1000-22                                                           176.0µ ± ∞ ¹    200.7µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_and_b_hundred{l='notfound'},steps=1-22                                                      458.5µ ± ∞ ¹    380.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_and_b_hundred{l='notfound'},steps=1000-22                                                   9.222m ± ∞ ¹    6.988m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=abs(a_one),steps=1-22                                                                                 49.84µ ± ∞ ¹    50.41µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=abs(a_one),steps=1000-22                                                                              217.0µ ± ∞ ¹    247.5µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=abs(a_hundred),steps=1-22                                                                             538.2µ ± ∞ ¹    582.3µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=abs(a_hundred),steps=1000-22                                                                          14.41m ± ∞ ¹    15.45m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_one,_'l2',_'$1',_'l',_'(.*)'),steps=1-22                                              76.65µ ± ∞ ¹    90.46µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_one,_'l2',_'$1',_'l',_'(.*)'),steps=1000-22                                           140.4µ ± ∞ ¹    113.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_hundred,_'l2',_'$1',_'l',_'(.*)'),steps=1-22                                          531.8µ ± ∞ ¹    395.3µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_hundred,_'l2',_'$1',_'l',_'(.*)'),steps=1000-22                                       7.094m ± ∞ ¹    6.276m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_one,_'l2',_'-',_'l',_'l'),steps=1-22                                                     52.68µ ± ∞ ¹    52.62µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_one,_'l2',_'-',_'l',_'l'),steps=1000-22                                                  105.6µ ± ∞ ¹    176.1µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_hundred,_'l2',_'-',_'l',_'l'),steps=1-22                                                 472.8µ ± ∞ ¹    425.3µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_hundred,_'l2',_'-',_'l',_'l'),steps=1000-22                                              6.635m ± ∞ ¹    5.484m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum(a_one),steps=1-22                                                                                 52.91µ ± ∞ ¹    42.39µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum(a_one),steps=1000-22                                                                              198.9µ ± ∞ ¹    193.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum(a_hundred),steps=1-22                                                                             404.9µ ± ∞ ¹    362.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum(a_hundred),steps=1000-22                                                                          6.844m ± ∞ ¹    7.603m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=avg(a_one),steps=1-22                                                                                 39.04µ ± ∞ ¹    38.47µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=avg(a_one),steps=1000-22                                                                              211.2µ ± ∞ ¹    157.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=avg(a_hundred),steps=1-22                                                                             450.2µ ± ∞ ¹    359.2µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=avg(a_hundred),steps=1000-22                                                                          6.881m ± ∞ ¹    6.364m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(h_one),steps=1-22                                                                    110.34µ ± ∞ ¹    82.18µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(h_one),steps=1000-22                                                                  1.196m ± ∞ ¹    1.154m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(h_hundred),steps=1-22                                                                 3.983m ± ∞ ¹    4.171m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(h_hundred),steps=1000-22                                                              81.17m ± ∞ ¹    80.16m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(le)(h_one),steps=1-22                                                                   130.81µ ± ∞ ¹    93.46µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(le)(h_one),steps=1000-22                                                                 942.7µ ± ∞ ¹   1083.1µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(le)(h_hundred),steps=1-22                                                                4.052m ± ∞ ¹    3.561m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(le)(h_hundred),steps=1000-22                                                             83.17m ± ∞ ¹    77.36m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(l)(h_one),steps=1-22                                                                          81.52µ ± ∞ ¹    94.71µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(l)(h_one),steps=1000-22                                                                       969.9µ ± ∞ ¹   1085.3µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(l)(h_hundred),steps=1-22                                                                      4.593m ± ∞ ¹    3.519m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(l)(h_hundred),steps=1000-22                                                                   82.80m ± ∞ ¹    79.21m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_one),steps=1-22                                                                        134.06µ ± ∞ ¹    84.38µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_one),steps=1000-22                                                                      1.462m ± ∞ ¹    1.239m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_hundred),steps=1-22                                                                     5.094m ± ∞ ¹    3.470m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_hundred),steps=1000-22                                                                  82.47m ± ∞ ¹    75.57m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=count_values('value',_h_one),steps=100-22                                                             2.280m ± ∞ ¹    2.118m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=count_values('value',_h_hundred),steps=100-22                                                         275.5m ± ∞ ¹    288.3m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(1,_a_one),steps=1-22                                                                             92.77µ ± ∞ ¹    68.39µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(1,_a_one),steps=1000-22                                                                          568.8µ ± ∞ ¹    520.2µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(1,_a_hundred),steps=1-22                                                                         537.8µ ± ∞ ¹    525.1µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(1,_a_hundred),steps=1000-22                                                                      8.495m ± ∞ ¹    8.127m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(5,_a_one),steps=1-22                                                                             49.46µ ± ∞ ¹    64.89µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(5,_a_one),steps=1000-22                                                                          408.4µ ± ∞ ¹    408.6µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(5,_a_hundred),steps=1-22                                                                         559.1µ ± ∞ ¹    511.0µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(5,_a_hundred),steps=1000-22                                                                     11.846m ± ∞ ¹    9.541m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(1,_a_one),steps=1-22                                                                           49.04µ ± ∞ ¹    38.86µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(1,_a_one),steps=1000-22                                                                        317.7µ ± ∞ ¹    484.5µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(1,_a_hundred),steps=1-22                                                                       405.0µ ± ∞ ¹    477.0µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(1,_a_hundred),steps=1000-22                                                                    6.209m ± ∞ ¹    5.547m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(5,_a_one),steps=1-22                                                                           63.03µ ± ∞ ¹    37.26µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(5,_a_one),steps=1000-22                                                                        494.3µ ± ∞ ¹    336.2µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(5,_a_hundred),steps=1-22                                                                       466.8µ ± ∞ ¹    310.8µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(5,_a_hundred),steps=1000-22                                                                    6.409m ± ∞ ¹    7.265m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.1,_a_one),steps=1-22                                                                    44.59µ ± ∞ ¹    45.44µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.1,_a_one),steps=1000-22                                                                 335.6µ ± ∞ ¹    405.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.1,_a_hundred),steps=1-22                                                                569.4µ ± ∞ ¹    390.7µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.1,_a_hundred),steps=1000-22                                                             10.98m ± ∞ ¹    10.47m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.5,_a_one),steps=1-22                                                                    67.57µ ± ∞ ¹    39.21µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.5,_a_one),steps=1000-22                                                                 344.2µ ± ∞ ¹    428.0µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.5,_a_hundred),steps=1-22                                                                647.0µ ± ∞ ¹    570.6µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.5,_a_hundred),steps=1000-22                                                             17.90m ± ∞ ¹    16.97m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(-0.5,_a_one),steps=1-22                                                                   40.72µ ± ∞ ¹    50.59µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(-0.5,_a_one),steps=1000-22                                                                560.2µ ± ∞ ¹    432.3µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(-0.5,_a_hundred),steps=1-22                                                               494.7µ ± ∞ ¹    379.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(-0.5,_a_hundred),steps=1000-22                                                            24.01m ± ∞ ¹    15.63m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m])_+_rate(b_one[1m]),steps=1-22                                                         130.18µ ± ∞ ¹    72.40µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m])_+_rate(b_one[1m]),steps=1000-22                                                       946.5µ ± ∞ ¹    862.1µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m])_+_rate(b_hundred[1m]),steps=1-22                                                 1415.0µ ± ∞ ¹    949.5µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m])_+_rate(b_hundred[1m]),steps=1000-22                                               56.23m ± ∞ ¹    59.00m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_one[1m])),steps=1-22                                                           59.53µ ± ∞ ¹    84.11µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_one[1m])),steps=1000-22                                                        423.8µ ± ∞ ¹    295.3µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m])),steps=1-22                                                       751.3µ ± ∞ ¹    570.7µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m])),steps=1000-22                                                    17.68m ± ∞ ¹    19.20m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_one[1m]))_/_sum_without_(l)(rate(b_one[1m])),steps=1-22                        97.22µ ± ∞ ¹    71.55µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_one[1m]))_/_sum_without_(l)(rate(b_one[1m])),steps=1000-22                     928.3µ ± ∞ ¹    886.2µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m]))_/_sum_without_(l)(rate(b_hundred[1m])),steps=1-22                1.241m ± ∞ ¹    1.121m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m]))_/_sum_without_(l)(rate(b_hundred[1m])),steps=1000-22             35.46m ± ∞ ¹    33.60m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=histogram_quantile(0.9,_rate(h_one[5m])),steps=1-22                                                   179.4µ ± ∞ ¹    111.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=histogram_quantile(0.9,_rate(h_one[5m])),steps=1000-22                                                3.175m ± ∞ ¹    3.932m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=histogram_quantile(0.9,_rate(h_hundred[5m])),steps=1-22                                               7.864m ± ∞ ¹    7.952m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=histogram_quantile(0.9,_rate(h_hundred[5m])),steps=1000-22                                            328.9m ± ∞ ¹    334.5m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_+_on(l)_group_right_a_one,steps=1-22                                                            97.83µ ± ∞ ¹   113.79µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_+_on(l)_group_right_a_one,steps=1000-22                                                         821.2µ ± ∞ ¹    769.1µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_+_on(l)_group_right_a_one,steps=1-22                                                        724.3µ ± ∞ ¹    622.5µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_+_on(l)_group_right_a_one,steps=1000-22                                                     22.13m ± ∞ ¹    12.03m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=count({__name__!=""}),steps=1-22                                                                      5.960m ± ∞ ¹    4.084m ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=count({__name__!="",l=""}),steps=1-22                                                                 267.7µ ± ∞ ¹    240.4µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=timestamp(a_one),steps=1-22                                                                           49.33µ ± ∞ ¹    38.81µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=timestamp(a_one),steps=1000-22                                                                        348.7µ ± ∞ ¹    347.1µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=timestamp(a_hundred),steps=1-22                                                                       594.3µ ± ∞ ¹    457.8µ ± ∞ ¹        ~ (p=1.000 n=1) ²
RangeQuery/expr=timestamp(a_hundred),steps=1000-22                                                                    18.08m ± ∞ ¹    15.76m ± ∞ ¹        ~ (p=1.000 n=1) ²
geomean                                                                                                               1.601m          1.441m        -10.00%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05

                                                                                                          │ /tmp/bench_results.txt │          /tmp/pr_results.txt           │
                                                                                                          │          B/op          │      B/op       vs base                │
RangeQuery/expr=a_one,steps=1-22                                                                                     8.536Ki ± ∞ ¹    8.547Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one,steps=1000-22                                                                                  16.01Ki ± ∞ ¹    15.99Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred,steps=1-22                                                                                 49.40Ki ± ∞ ¹    49.29Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred,steps=1000-22                                                                              1.104Mi ± ∞ ¹    1.109Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]),steps=1-22                                                                           11.23Ki ± ∞ ¹    11.01Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]),steps=1000-22                                                                        18.33Ki ± ∞ ¹    18.36Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]),steps=1-22                                                                       75.87Ki ± ∞ ¹    76.44Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]),steps=1000-22                                                                    1.104Mi ± ∞ ¹    1.108Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]),steps=10000-22                                                                       158.3Ki ± ∞ ¹    159.1Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]),steps=10000-22                                                                   10.55Mi ± ∞ ¹    10.55Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(sparse[1m]),steps=10000-22                                                                      45.68Ki ± ∞ ¹    45.62Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=1-22                                                                  13.35Ki ± ∞ ¹    13.33Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=1000-22                                                               24.00Ki ± ∞ ¹    23.92Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=1-22                                                              78.13Ki ± ∞ ¹    78.82Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=1000-22                                                           1.140Mi ± ∞ ¹    1.140Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=10000-22                                                              165.2Ki ± ∞ ¹    165.1Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=10000-22                                                          10.64Mi ± ∞ ¹    10.64Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(sparse[1m]_smoothed),steps=10000-22                                                             50.03Ki ± ∞ ¹    50.95Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_one[1d],_0.3,_0.3),steps=1-22                                         1.250Mi ± ∞ ¹    1.251Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_one[1d],_0.3,_0.3),steps=1000-22                                      1.390Mi ± ∞ ¹    1.393Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_hundred[1d],_0.3,_0.3),steps=1-22                                     3.387Mi ± ∞ ¹    3.387Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_hundred[1d],_0.3,_0.3),steps=1000-22                                  13.56Mi ± ∞ ¹    13.56Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_one[1d]),steps=1-22                                                                        879.9Ki ± ∞ ¹    879.9Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_one[1d]),steps=1000-22                                                                     813.5Ki ± ∞ ¹    891.0Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_hundred[1d]),steps=1-22                                                                    2.958Mi ± ∞ ¹    2.886Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_hundred[1d]),steps=1000-22                                                                 3.921Mi ± ∞ ¹    3.921Mi ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=rate(a_one[1d]),steps=1-22                                                                           805.6Ki ± ∞ ¹    880.4Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1d]),steps=1000-22                                                                        814.0Ki ± ∞ ¹    891.5Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1d]),steps=1-22                                                                       2.980Mi ± ∞ ¹    2.979Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1d]),steps=1000-22                                                                    3.941Mi ± ∞ ¹    4.019Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_one[1d]),steps=1-22                                                               805.0Ki ± ∞ ¹    879.0Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_one[1d]),steps=1000-22                                                            829.4Ki ± ∞ ¹    912.5Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_hundred[1d]),steps=1-22                                                           2.883Mi ± ∞ ¹    2.964Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_hundred[1d]),steps=1000-22                                                        4.760Mi ± ∞ ¹    4.760Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=-a_one,steps=1-22                                                                                    8.708Ki ± ∞ ¹    8.711Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=-a_one,steps=1000-22                                                                                 16.28Ki ± ∞ ¹    16.29Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=-a_hundred,steps=1-22                                                                                51.93Ki ± ∞ ¹    51.90Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=-a_hundred,steps=1000-22                                                                             1.107Mi ± ∞ ¹    1.112Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_-_b_one,steps=1-22                                                                             13.14Ki ± ∞ ¹    13.18Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_-_b_one,steps=1000-22                                                                          24.74Ki ± ∞ ¹    21.27Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_-_b_hundred,steps=1-22                                                                     194.8Ki ± ∞ ¹    194.8Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_-_b_hundred,steps=1000-22                                                                  3.103Mi ± ∞ ¹    3.103Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_-_b_one,steps=10000-22                                                                         413.0Ki ± ∞ ¹    413.0Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_hundred_-_b_hundred,steps=10000-22                                                                 29.21Mi ± ∞ ¹    29.21Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l=~'.*[0-4]$'},steps=1-22                                                            22.05Ki ± ∞ ¹    22.04Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l=~'.*[0-4]$'},steps=1000-22                                                         26.22Ki ± ∞ ¹    29.68Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_and_b_hundred{l=~'.*[0-4]$'},steps=1-22                                                    136.6Ki ± ∞ ¹    136.5Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_and_b_hundred{l=~'.*[0-4]$'},steps=1000-22                                                 2.235Mi ± ∞ ¹    2.234Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_or_b_one{l=~'.*[0-4]$'},steps=1-22                                                             22.17Ki ± ∞ ¹    21.37Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_or_b_one{l=~'.*[0-4]$'},steps=1000-22                                                          29.83Ki ± ∞ ¹    26.39Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_or_b_hundred{l=~'.*[0-4]$'},steps=1-22                                                     140.7Ki ± ∞ ¹    139.3Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_or_b_hundred{l=~'.*[0-4]$'},steps=1000-22                                                  2.639Mi ± ∞ ¹    2.626Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_unless_b_one{l=~'.*[0-4]$'},steps=1-22                                                         22.16Ki ± ∞ ¹    21.38Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_unless_b_one{l=~'.*[0-4]$'},steps=1000-22                                                      26.36Ki ± ∞ ¹    29.82Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_unless_b_hundred{l=~'.*[0-4]$'},steps=1-22                                                 137.3Ki ± ∞ ¹    136.3Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_unless_b_hundred{l=~'.*[0-4]$'},steps=1000-22                                              2.235Mi ± ∞ ¹    2.235Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l='notfound'},steps=1-22                                                             10.86Ki ± ∞ ¹    10.91Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l='notfound'},steps=1000-22                                                          18.55Ki ± ∞ ¹    18.56Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_and_b_hundred{l='notfound'},steps=1-22                                                     90.00Ki ± ∞ ¹    90.00Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_hundred_and_b_hundred{l='notfound'},steps=1000-22                                                  1.144Mi ± ∞ ¹    1.149Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=abs(a_one),steps=1-22                                                                                8.389Ki ± ∞ ¹    8.379Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=abs(a_one),steps=1000-22                                                                             16.84Ki ± ∞ ¹    13.37Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=abs(a_hundred),steps=1-22                                                                            89.38Ki ± ∞ ¹    89.38Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=abs(a_hundred),steps=1000-22                                                                         1.944Mi ± ∞ ¹    1.936Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_one,_'l2',_'$1',_'l',_'(.*)'),steps=1-22                                             12.01Ki ± ∞ ¹    12.77Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_one,_'l2',_'$1',_'l',_'(.*)'),steps=1000-22                                          21.70Ki ± ∞ ¹    20.41Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_hundred,_'l2',_'$1',_'l',_'(.*)'),steps=1-22                                         63.74Ki ± ∞ ¹    64.38Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_hundred,_'l2',_'$1',_'l',_'(.*)'),steps=1000-22                                      1.123Mi ± ∞ ¹    1.124Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_one,_'l2',_'-',_'l',_'l'),steps=1-22                                                    8.735Ki ± ∞ ¹   10.691Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_one,_'l2',_'-',_'l',_'l'),steps=1000-22                                                 17.19Ki ± ∞ ¹    17.20Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_hundred,_'l2',_'-',_'l',_'l'),steps=1-22                                                58.08Ki ± ∞ ¹    58.75Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_hundred,_'l2',_'-',_'l',_'l'),steps=1000-22                                             1.113Mi ± ∞ ¹    1.118Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum(a_one),steps=1-22                                                                                9.428Ki ± ∞ ¹    9.428Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum(a_one),steps=1000-22                                                                             17.09Ki ± ∞ ¹    17.09Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum(a_hundred),steps=1-22                                                                            60.62Ki ± ∞ ¹    60.62Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum(a_hundred),steps=1000-22                                                                         1.127Mi ± ∞ ¹    1.127Mi ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=avg(a_one),steps=1-22                                                                                9.428Ki ± ∞ ¹    9.428Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=avg(a_one),steps=1000-22                                                                             17.09Ki ± ∞ ¹    17.09Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=avg(a_hundred),steps=1-22                                                                            60.62Ki ± ∞ ¹    60.62Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=avg(a_hundred),steps=1000-22                                                                         1.127Mi ± ∞ ¹    1.127Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(h_one),steps=1-22                                                                    18.80Ki ± ∞ ¹    18.02Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(h_one),steps=1000-22                                                                 230.4Ki ± ∞ ¹    231.2Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(h_hundred),steps=1-22                                                                580.0Ki ± ∞ ¹    580.0Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(h_hundred),steps=1000-22                                                             9.050Mi ± ∞ ¹    9.043Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(le)(h_one),steps=1-22                                                                   13.89Ki ± ∞ ¹    14.68Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(le)(h_one),steps=1000-22                                                                145.1Ki ± ∞ ¹    144.3Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(le)(h_hundred),steps=1-22                                                               615.7Ki ± ∞ ¹    615.7Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(le)(h_hundred),steps=1000-22                                                            9.272Mi ± ∞ ¹    9.272Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(l)(h_one),steps=1-22                                                                         14.69Ki ± ∞ ¹    14.67Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(l)(h_one),steps=1000-22                                                                      145.1Ki ± ∞ ¹    145.1Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(l)(h_hundred),steps=1-22                                                                     615.0Ki ± ∞ ¹    615.0Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(l)(h_hundred),steps=1000-22                                                                  9.271Mi ± ∞ ¹    9.271Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_one),steps=1-22                                                                        18.79Ki ± ∞ ¹    18.05Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_one),steps=1000-22                                                                     231.2Ki ± ∞ ¹    230.4Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_hundred),steps=1-22                                                                    580.8Ki ± ∞ ¹    580.7Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_hundred),steps=1000-22                                                                 9.007Mi ± ∞ ¹    9.007Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=count_values('value',_h_one),steps=100-22                                                            701.7Ki ± ∞ ¹    701.7Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=count_values('value',_h_hundred),steps=100-22                                                        94.32Mi ± ∞ ¹    94.12Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(1,_a_one),steps=1-22                                                                            10.27Ki ± ∞ ¹    10.28Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(1,_a_one),steps=1000-22                                                                         227.9Ki ± ∞ ¹    227.9Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=topk(1,_a_hundred),steps=1-22                                                                        71.31Ki ± ∞ ¹    70.70Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(1,_a_hundred),steps=1000-22                                                                     1.369Mi ± ∞ ¹    1.336Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(5,_a_one),steps=1-22                                                                            9.480Ki ± ∞ ¹   10.271Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(5,_a_one),steps=1000-22                                                                         217.8Ki ± ∞ ¹    221.2Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(5,_a_hundred),steps=1-22                                                                        71.48Ki ± ∞ ¹    71.48Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=topk(5,_a_hundred),steps=1000-22                                                                     1.590Mi ± ∞ ¹    1.586Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(1,_a_one),steps=1-22                                                                         10.271Ki ± ∞ ¹    9.480Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(1,_a_one),steps=1000-22                                                                       217.8Ki ± ∞ ¹    221.2Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(1,_a_hundred),steps=1-22                                                                      71.32Ki ± ∞ ¹    71.32Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(1,_a_hundred),steps=1000-22                                                                   1.370Mi ± ∞ ¹    1.369Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(5,_a_one),steps=1-22                                                                          9.488Ki ± ∞ ¹   10.285Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(5,_a_one),steps=1000-22                                                                       217.8Ki ± ∞ ¹    217.8Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limitk(5,_a_hundred),steps=1-22                                                                      71.41Ki ± ∞ ¹    71.41Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limitk(5,_a_hundred),steps=1000-22                                                                   1.552Mi ± ∞ ¹    1.547Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.1,_a_one),steps=1-22                                                                   9.350Ki ± ∞ ¹   10.149Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.1,_a_one),steps=1000-22                                                                174.3Ki ± ∞ ¹    174.3Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(0.1,_a_hundred),steps=1-22                                                               74.53Ki ± ∞ ¹    73.72Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.1,_a_hundred),steps=1000-22                                                            2.898Mi ± ∞ ¹    2.893Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.5,_a_one),steps=1-22                                                                   10.14Ki ± ∞ ¹    10.14Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(0.5,_a_one),steps=1000-22                                                                174.3Ki ± ∞ ¹    174.3Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(0.5,_a_hundred),steps=1-22                                                               89.86Ki ± ∞ ¹    90.65Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.5,_a_hundred),steps=1000-22                                                            8.826Mi ± ∞ ¹    8.821Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(-0.5,_a_one),steps=1-22                                                                  9.566Ki ± ∞ ¹   10.357Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(-0.5,_a_one),steps=1000-22                                                               217.9Ki ± ∞ ¹    221.3Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(-0.5,_a_hundred),steps=1-22                                                              91.36Ki ± ∞ ¹    91.36Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(-0.5,_a_hundred),steps=1000-22                                                           8.885Mi ± ∞ ¹    8.886Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m])_+_rate(b_one[1m]),steps=1-22                                                         17.23Ki ± ∞ ¹    18.12Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m])_+_rate(b_one[1m]),steps=1000-22                                                      29.20Ki ± ∞ ¹    29.20Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=rate(a_hundred[1m])_+_rate(b_hundred[1m]),steps=1-22                                                 240.7Ki ± ∞ ¹    240.7Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=rate(a_hundred[1m])_+_rate(b_hundred[1m]),steps=1000-22                                              3.098Mi ± ∞ ¹    3.098Mi ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(l)(rate(a_one[1m])),steps=1-22                                                          12.52Ki ± ∞ ¹    12.52Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(l)(rate(a_one[1m])),steps=1000-22                                                       19.91Ki ± ∞ ¹    19.90Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m])),steps=1-22                                                      89.91Ki ± ∞ ¹    89.91Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m])),steps=1000-22                                                   1.126Mi ± ∞ ¹    1.127Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_one[1m]))_/_sum_without_(l)(rate(b_one[1m])),steps=1-22                       20.42Ki ± ∞ ¹    21.29Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_one[1m]))_/_sum_without_(l)(rate(b_one[1m])),steps=1000-22                    28.83Ki ± ∞ ¹    32.39Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m]))_/_sum_without_(l)(rate(b_hundred[1m])),steps=1-22               169.6Ki ± ∞ ¹    170.5Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m]))_/_sum_without_(l)(rate(b_hundred[1m])),steps=1000-22            1.439Mi ± ∞ ¹    1.439Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=histogram_quantile(0.9,_rate(h_one[5m])),steps=1-22                                                  25.45Ki ± ∞ ¹    25.45Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=histogram_quantile(0.9,_rate(h_one[5m])),steps=1000-22                                               154.8Ki ± ∞ ¹    163.9Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=histogram_quantile(0.9,_rate(h_hundred[5m])),steps=1-22                                              1.218Mi ± ∞ ¹    1.219Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=histogram_quantile(0.9,_rate(h_hundred[5m])),steps=1000-22                                           9.872Mi ± ∞ ¹    9.881Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_+_on(l)_group_right_a_one,steps=1-22                                                           13.79Ki ± ∞ ¹    13.80Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_+_on(l)_group_right_a_one,steps=1000-22                                                        209.3Ki ± ∞ ¹    209.3Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_+_on(l)_group_right_a_one,steps=1-22                                                       112.0Ki ± ∞ ¹    111.2Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_+_on(l)_group_right_a_one,steps=1000-22                                                    1.180Mi ± ∞ ¹    1.179Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=count({__name__!=""}),steps=1-22                                                                     704.8Ki ± ∞ ¹    704.8Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=count({__name__!="",l=""}),steps=1-22                                                                25.57Ki ± ∞ ¹    25.57Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=timestamp(a_one),steps=1-22                                                                          8.730Ki ± ∞ ¹    8.730Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=timestamp(a_one),steps=1000-22                                                                       86.63Ki ± ∞ ¹    86.63Ki ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=timestamp(a_hundred),steps=1-22                                                                      137.4Ki ± ∞ ¹    138.1Ki ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=timestamp(a_hundred),steps=1000-22                                                                   5.852Mi ± ∞ ¹    5.852Mi ± ∞ ¹       ~ (p=1.000 n=1) ²
geomean                                                                                                              189.6Ki          190.7Ki        +0.57%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05
³ all samples are equal

                                                                                                          │ /tmp/bench_results.txt │         /tmp/pr_results.txt          │
                                                                                                          │       allocs/op        │  allocs/op    vs base                │
RangeQuery/expr=a_one,steps=1-22                                                                                       112.0 ± ∞ ¹    113.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one,steps=1000-22                                                                                    145.0 ± ∞ ¹    144.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred,steps=1-22                                                                                   750.0 ± ∞ ¹    748.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred,steps=1000-22                                                                               3.613k ± ∞ ¹   3.614k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]),steps=1-22                                                                             140.0 ± ∞ ¹    135.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]),steps=1000-22                                                                          164.0 ± ∞ ¹    164.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=rate(a_hundred[1m]),steps=1-22                                                                        1.270k ± ∞ ¹   1.318k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]),steps=1000-22                                                                     3.843k ± ∞ ¹   3.845k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]),steps=10000-22                                                                         455.0 ± ∞ ¹    457.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]),steps=10000-22                                                                    27.70k ± ∞ ¹   27.70k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(sparse[1m]),steps=10000-22                                                                        653.0 ± ∞ ¹    652.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=1-22                                                                    138.0 ± ∞ ¹    139.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=1000-22                                                                 172.0 ± ∞ ¹    171.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=1-22                                                               1.271k ± ∞ ¹   1.323k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=1000-22                                                            4.137k ± ∞ ¹   4.136k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m]_smoothed),steps=10000-22                                                                460.0 ± ∞ ¹    460.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=rate(a_hundred[1m]_smoothed),steps=10000-22                                                           27.70k ± ∞ ¹   27.70k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(sparse[1m]_smoothed),steps=10000-22                                                               657.0 ± ∞ ¹    659.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_one[1d],_0.3,_0.3),steps=1-22                                           409.0 ± ∞ ¹    412.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_one[1d],_0.3,_0.3),steps=1000-22                                       2.440k ± ∞ ¹   2.441k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_hundred[1d],_0.3,_0.3),steps=1-22                                      22.65k ± ∞ ¹   22.65k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=double_exponential_smoothing(a_hundred[1d],_0.3,_0.3),steps=1000-22                                   224.9k ± ∞ ¹   224.9k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_one[1d]),steps=1-22                                                                          365.0 ± ∞ ¹    364.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_one[1d]),steps=1000-22                                                                       388.0 ± ∞ ¹    390.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_hundred[1d]),steps=1-22                                                                     22.20k ± ∞ ¹   22.25k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=changes(a_hundred[1d]),steps=1000-22                                                                  24.68k ± ∞ ¹   24.68k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=rate(a_one[1d]),steps=1-22                                                                             368.0 ± ∞ ¹    370.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1d]),steps=1000-22                                                                          392.0 ± ∞ ¹    395.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_hundred[1d]),steps=1-22                                                                        22.70k ± ∞ ¹   22.70k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=rate(a_hundred[1d]),steps=1000-22                                                                     25.17k ± ∞ ¹   25.18k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_one[1d]),steps=1-22                                                                 361.0 ± ∞ ¹    362.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_one[1d]),steps=1000-22                                                              387.0 ± ∞ ¹    391.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_hundred[1d]),steps=1-22                                                            22.26k ± ∞ ¹   22.26k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=absent_over_time(a_hundred[1d]),steps=1000-22                                                         24.60k ± ∞ ¹   24.60k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=-a_one,steps=1-22                                                                                      117.0 ± ∞ ¹    118.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=-a_one,steps=1000-22                                                                                   149.0 ± ∞ ¹    149.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=-a_hundred,steps=1-22                                                                                  757.0 ± ∞ ¹    756.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=-a_hundred,steps=1000-22                                                                              3.622k ± ∞ ¹   3.622k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_one_-_b_one,steps=1-22                                                                               182.0 ± ∞ ¹    182.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_one_-_b_one,steps=1000-22                                                                            246.0 ± ∞ ¹    245.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_-_b_hundred,steps=1-22                                                                      1.968k ± ∞ ¹   1.967k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_-_b_hundred,steps=1000-22                                                                   7.781k ± ∞ ¹   7.781k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_one_-_b_one,steps=10000-22                                                                           814.0 ± ∞ ¹    814.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_hundred_-_b_hundred,steps=10000-22                                                                  54.81k ± ∞ ¹   54.81k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l=~'.*[0-4]$'},steps=1-22                                                              234.0 ± ∞ ¹    233.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l=~'.*[0-4]$'},steps=1000-22                                                           265.0 ± ∞ ¹    265.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_hundred_and_b_hundred{l=~'.*[0-4]$'},steps=1-22                                                     1.410k ± ∞ ¹   1.408k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_and_b_hundred{l=~'.*[0-4]$'},steps=1000-22                                                  6.787k ± ∞ ¹   6.787k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_one_or_b_one{l=~'.*[0-4]$'},steps=1-22                                                               234.0 ± ∞ ¹    234.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_one_or_b_one{l=~'.*[0-4]$'},steps=1000-22                                                            267.0 ± ∞ ¹    267.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_hundred_or_b_hundred{l=~'.*[0-4]$'},steps=1-22                                                      1.417k ± ∞ ¹   1.385k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_or_b_hundred{l=~'.*[0-4]$'},steps=1000-22                                                   6.871k ± ∞ ¹   6.869k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_unless_b_one{l=~'.*[0-4]$'},steps=1-22                                                           233.0 ± ∞ ¹    234.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_unless_b_one{l=~'.*[0-4]$'},steps=1000-22                                                        266.0 ± ∞ ¹    266.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_hundred_unless_b_hundred{l=~'.*[0-4]$'},steps=1-22                                                  1.408k ± ∞ ¹   1.399k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_unless_b_hundred{l=~'.*[0-4]$'},steps=1000-22                                               6.788k ± ∞ ¹   6.787k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l='notfound'},steps=1-22                                                               157.0 ± ∞ ¹    158.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_and_b_one{l='notfound'},steps=1000-22                                                            190.0 ± ∞ ¹    191.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_and_b_hundred{l='notfound'},steps=1-22                                                       906.0 ± ∞ ¹    906.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_hundred_and_b_hundred{l='notfound'},steps=1000-22                                                   3.771k ± ∞ ¹   3.773k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=abs(a_one),steps=1-22                                                                                  124.0 ± ∞ ¹    123.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=abs(a_one),steps=1000-22                                                                               157.0 ± ∞ ¹    156.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=abs(a_hundred),steps=1-22                                                                              781.0 ± ∞ ¹    781.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=abs(a_hundred),steps=1000-22                                                                          3.795k ± ∞ ¹   3.794k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_one,_'l2',_'$1',_'l',_'(.*)'),steps=1-22                                               180.0 ± ∞ ¹    180.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=label_replace(a_one,_'l2',_'$1',_'l',_'(.*)'),steps=1000-22                                            246.0 ± ∞ ¹    213.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_hundred,_'l2',_'$1',_'l',_'(.*)'),steps=1-22                                          1.208k ± ∞ ¹   1.257k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_replace(a_hundred,_'l2',_'$1',_'l',_'(.*)'),steps=1000-22                                       4.073k ± ∞ ¹   4.074k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_one,_'l2',_'-',_'l',_'l'),steps=1-22                                                      141.0 ± ∞ ¹    174.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_one,_'l2',_'-',_'l',_'l'),steps=1000-22                                                   174.0 ± ∞ ¹    174.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=label_join(a_hundred,_'l2',_'-',_'l',_'l'),steps=1-22                                                  979.0 ± ∞ ¹   1029.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=label_join(a_hundred,_'l2',_'-',_'l',_'l'),steps=1000-22                                              3.844k ± ∞ ¹   3.845k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum(a_one),steps=1-22                                                                                  125.0 ± ∞ ¹    125.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum(a_one),steps=1000-22                                                                               158.0 ± ∞ ¹    159.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum(a_hundred),steps=1-22                                                                              814.0 ± ∞ ¹    814.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum(a_hundred),steps=1000-22                                                                          3.631k ± ∞ ¹   3.631k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=avg(a_one),steps=1-22                                                                                  125.0 ± ∞ ¹    125.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=avg(a_one),steps=1000-22                                                                               159.0 ± ∞ ¹    158.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=avg(a_hundred),steps=1-22                                                                              814.0 ± ∞ ¹    814.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=avg(a_hundred),steps=1000-22                                                                          3.631k ± ∞ ¹   3.631k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(l)(h_one),steps=1-22                                                                      220.0 ± ∞ ¹    220.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(l)(h_one),steps=1000-22                                                                   560.0 ± ∞ ¹    561.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(h_hundred),steps=1-22                                                                 7.849k ± ∞ ¹   7.850k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(h_hundred),steps=1000-22                                                              37.77k ± ∞ ¹   37.77k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(le)(h_one),steps=1-22                                                                     202.0 ± ∞ ¹    202.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(le)(h_one),steps=1000-22                                                                  526.0 ± ∞ ¹    526.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(le)(h_hundred),steps=1-22                                                                7.937k ± ∞ ¹   7.937k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(le)(h_hundred),steps=1000-22                                                             37.87k ± ∞ ¹   37.87k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_by_(l)(h_one),steps=1-22                                                                           203.0 ± ∞ ¹    202.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(l)(h_one),steps=1000-22                                                                        526.0 ± ∞ ¹    526.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_by_(l)(h_hundred),steps=1-22                                                                      7.942k ± ∞ ¹   7.942k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_by_(l)(h_hundred),steps=1000-22                                                                   37.87k ± ∞ ¹   37.87k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_one),steps=1-22                                                                          220.0 ± ∞ ¹    221.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_one),steps=1000-22                                                                       561.0 ± ∞ ¹    560.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_by_(le)(h_hundred),steps=1-22                                                                     7.849k ± ∞ ¹   7.849k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_by_(le)(h_hundred),steps=1000-22                                                                  37.74k ± ∞ ¹   37.74k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=count_values('value',_h_one),steps=100-22                                                             5.316k ± ∞ ¹   5.316k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=count_values('value',_h_hundred),steps=100-22                                                         494.0k ± ∞ ¹   494.0k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(1,_a_one),steps=1-22                                                                              140.0 ± ∞ ¹    141.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(1,_a_one),steps=1000-22                                                                          3.172k ± ∞ ¹   3.172k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=topk(1,_a_hundred),steps=1-22                                                                          830.0 ± ∞ ¹    783.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(1,_a_hundred),steps=1000-22                                                                      6.656k ± ∞ ¹   6.647k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=topk(5,_a_one),steps=1-22                                                                              140.0 ± ∞ ¹    140.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=topk(5,_a_one),steps=1000-22                                                                          3.171k ± ∞ ¹   3.171k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=topk(5,_a_hundred),steps=1-22                                                                          788.0 ± ∞ ¹    788.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=topk(5,_a_hundred),steps=1000-22                                                                      8.656k ± ∞ ¹   8.655k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(1,_a_one),steps=1-22                                                                            140.0 ± ∞ ¹    140.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limitk(1,_a_one),steps=1000-22                                                                        3.171k ± ∞ ¹   3.171k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limitk(1,_a_hundred),steps=1-22                                                                        830.0 ± ∞ ¹    831.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(1,_a_hundred),steps=1000-22                                                                    6.656k ± ∞ ¹   6.656k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limitk(5,_a_one),steps=1-22                                                                            140.0 ± ∞ ¹    141.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limitk(5,_a_one),steps=1000-22                                                                        3.171k ± ∞ ¹   3.171k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limitk(5,_a_hundred),steps=1-22                                                                        784.0 ± ∞ ¹    784.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limitk(5,_a_hundred),steps=1000-22                                                                    6.654k ± ∞ ¹   6.652k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(0.1,_a_one),steps=1-22                                                                     141.0 ± ∞ ¹    141.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(0.1,_a_one),steps=1000-22                                                                 2.173k ± ∞ ¹   2.173k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(0.1,_a_hundred),steps=1-22                                                                 797.0 ± ∞ ¹    797.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(0.1,_a_hundred),steps=1000-22                                                             10.67k ± ∞ ¹   10.67k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(0.5,_a_one),steps=1-22                                                                     141.0 ± ∞ ¹    141.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(0.5,_a_one),steps=1000-22                                                                 2.173k ± ∞ ¹   2.173k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(0.5,_a_hundred),steps=1-22                                                                 814.0 ± ∞ ¹    814.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(0.5,_a_hundred),steps=1000-22                                                             12.74k ± ∞ ¹   12.74k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=limit_ratio(-0.5,_a_one),steps=1-22                                                                    144.0 ± ∞ ¹    144.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(-0.5,_a_one),steps=1000-22                                                                3.175k ± ∞ ¹   3.175k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(-0.5,_a_hundred),steps=1-22                                                                817.0 ± ∞ ¹    817.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=limit_ratio(-0.5,_a_hundred),steps=1000-22                                                            12.75k ± ∞ ¹   12.75k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m])_+_rate(b_one[1m]),steps=1-22                                                           227.0 ± ∞ ¹    228.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=rate(a_one[1m])_+_rate(b_one[1m]),steps=1000-22                                                        287.0 ± ∞ ¹    287.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=rate(a_hundred[1m])_+_rate(b_hundred[1m]),steps=1-22                                                  2.966k ± ∞ ¹   2.966k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=rate(a_hundred[1m])_+_rate(b_hundred[1m]),steps=1000-22                                               8.242k ± ∞ ¹   8.242k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(l)(rate(a_one[1m])),steps=1-22                                                            154.0 ± ∞ ¹    154.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(l)(rate(a_one[1m])),steps=1000-22                                                         184.0 ± ∞ ¹    184.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m])),steps=1-22                                                       1.373k ± ∞ ¹   1.373k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m])),steps=1000-22                                                    3.865k ± ∞ ¹   3.866k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_one[1m]))_/_sum_without_(l)(rate(b_one[1m])),steps=1-22                         268.0 ± ∞ ¹    270.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_one[1m]))_/_sum_without_(l)(rate(b_one[1m])),steps=1000-22                      327.0 ± ∞ ¹    329.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m]))_/_sum_without_(l)(rate(b_hundred[1m])),steps=1-22                2.584k ± ∞ ¹   2.585k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=sum_without_(l)(rate(a_hundred[1m]))_/_sum_without_(l)(rate(b_hundred[1m])),steps=1000-22             7.523k ± ∞ ¹   7.522k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=histogram_quantile(0.9,_rate(h_one[5m])),steps=1-22                                                    315.0 ± ∞ ¹    315.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=histogram_quantile(0.9,_rate(h_one[5m])),steps=1000-22                                                 636.0 ± ∞ ¹    639.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=histogram_quantile(0.9,_rate(h_hundred[5m])),steps=1-22                                               14.40k ± ∞ ¹   14.41k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=histogram_quantile(0.9,_rate(h_hundred[5m])),steps=1000-22                                            44.32k ± ∞ ¹   44.31k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_+_on(l)_group_right_a_one,steps=1-22                                                             195.0 ± ∞ ¹    196.0 ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_one_+_on(l)_group_right_a_one,steps=1000-22                                                         2.258k ± ∞ ¹   2.258k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=a_hundred_+_on(l)_group_right_a_one,steps=1-22                                                        1.006k ± ∞ ¹   1.005k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=a_hundred_+_on(l)_group_right_a_one,steps=1000-22                                                     3.841k ± ∞ ¹   3.841k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=count({__name__!=""}),steps=1-22                                                                      9.233k ± ∞ ¹   9.233k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=count({__name__!="",l=""}),steps=1-22                                                                  225.0 ± ∞ ¹    225.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=timestamp(a_one),steps=1-22                                                                            118.0 ± ∞ ¹    118.0 ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=timestamp(a_one),steps=1000-22                                                                        2.149k ± ∞ ¹   2.149k ± ∞ ¹       ~ (p=1.000 n=1) ³
RangeQuery/expr=timestamp(a_hundred),steps=1-22                                                                       1.169k ± ∞ ¹   1.168k ± ∞ ¹       ~ (p=1.000 n=1) ²
RangeQuery/expr=timestamp(a_hundred),steps=1000-22                                                                    6.036k ± ∞ ¹   6.036k ± ∞ ¹       ~ (p=1.000 n=1) ³
geomean                                                                                                               1.282k         1.284k        +0.13%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05
³ all samples are equal

pkg: github.com/prometheus/prometheus/tsdb/chunkenc
           │ /tmp/bench_results.txt │       /tmp/pr_results.txt       │
           │         sec/op         │    sec/op     vs base           │
XorRead-22             2.871µ ± ∞ ¹   3.161µ ± ∞ ¹  ~ (p=1.000 n=1) ²
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05

           │ /tmp/bench_results.txt │      /tmp/pr_results.txt       │
           │          B/op          │    B/op      vs base           │
XorRead-22              1.000 ± ∞ ¹   1.000 ± ∞ ¹  ~ (p=1.000 n=1) ²
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal

           │ /tmp/bench_results.txt │      /tmp/pr_results.txt       │
           │       allocs/op        │  allocs/op   vs base           │
XorRead-22              0.000 ± ∞ ¹   0.000 ± ∞ ¹  ~ (p=1.000 n=1) ²
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal

@roidelapluie

Copy link
Copy Markdown
Member

Looks like a 10% speedup on range queries.

@codesome

Copy link
Copy Markdown
Member Author

/prombench cancel

@prombot

prombot commented Feb 19, 2026

Copy link
Copy Markdown
Contributor

Benchmark cancel is in progress.

@codesome

codesome commented Feb 20, 2026 •

Copy link
Copy Markdown
Member Author

In #18049 (comment) I see that a bunch of queries did have speedup. It is showing ~ because there is only 1 run (needs -count=6 to show the diff for each test run). Lemme find a x64 machine to test it on.

@github-actions github-actions Bot added the stale label Apr 27, 2026
@bboreham
bboreham merged commit d8b4f66 into main Aug 18, 2026
32 checks passed
@bboreham
bboreham deleted the codesome/xor-experiments branch August 18, 2026 11:40
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Sep 26, 2026
##### [\`v3.15.0\`](https://github.com/prometheus/prometheus/releases/tag/v3.15.0)

- \[CHANGE] PromQL: A range query whose `end` was not aligned to `step` caused subqueries inside it to evaluate past the parent's last actual step, inflating `peakSamples` in the query stats and against the `query.max-samples` limit, and wasting storage I/O reading samples that were never used in the result. Add tests to prevent regression of the fix made in [#18081](prometheus/prometheus#18081). [#18598](prometheus/prometheus#18598)
- \[CHANGE] PromQL: Do not register a start timestamp reset if the start timestamp hasn't changed between subsequent samples. [#19454](prometheus/prometheus#19454)
- \[CHANGE] Logging: Deprecate `--log.level`; use `runtime.log_level` configuration to supply the default level. [#19511](prometheus/prometheus#19511)
- \[FEATURE] Configuration: Allow changing the process log level through `runtime.log_level` on configuration reload. [#19511](prometheus/prometheus#19511)
- \[FEATURE] Prometheus: Add `--auto-gomemlimit.refresh-interval` flag to periodically re-detect the container or system memory limit and update `GOMEMLIMIT` at runtime. [#18843](prometheus/prometheus#18843)
- \[FEATURE] Scraping: Add support for scraping targets via Unix Domain Sockets. [#12024](prometheus/prometheus#12024). [#18091](prometheus/prometheus#18091)
- \[FEATURE] scrape: Implement OM2.0 scrape format. [#18606](prometheus/prometheus#18606)
- \[ENHANCEMENT] Reduce TSDB head CPU utilization when initializing. [#18001](prometheus/prometheus#18001)
- \[ENHANCEMENT] Docker SD: Add labels `__meta_docker_container_image` and `__meta_docker_container_image_id`. [#19386](prometheus/prometheus#19386)
- \[ENHANCEMENT] Mixin: Add a p95/p99 remote-write send-batch latency panel to the remote-write dashboard. [#19500](prometheus/prometheus#19500)
- \[ENHANCEMENT] Mixin: Support native histograms in the remote-write send-batch latency panel. [#19522](prometheus/prometheus#19522)
- \[ENHANCEMENT] PromQL/TSDB: The `--enable-feature=st-storage` flag now automatically enables XOR2 float chunk encoding and ST-capable histogram chunk encoding, so you no longer need to pass `xor2-encoding` and `histograms-st-encoding` alongside it. [#19518](prometheus/prometheus#19518)
- \[ENHANCEMENT] Remote write / Alertmanager: upgrade sigv4 to v0.5.0, adding `session_name` and `tags` fields for STS AssumeRole sessions. The previously undocumented `service_name` field is now also documented. [#19569](prometheus/prometheus#19569)
- \[ENHANCEMENT] Scraping: Support zstd-compressed scrape responses, enabled via feature flag `zstd-scrape`. [#19502](prometheus/prometheus#19502)
- \[ENHANCEMENT] TSDB: Stabilize the XOR2 float chunk encoding. `--enable-feature=xor2-encoding` is deprecated; use `storage.tsdb.chunk_encoding.floats: xor2` instead. Check that other software reading the TSDB directly (e.g. Thanos sidecar) supports XOR2 before enabling. [#19461](prometheus/prometheus#19461)
- \[ENHANCEMENT] TSDB: add `prometheus_tsdb_head_appenders_created_total` metric. [#19411](prometheus/prometheus#19411)
- \[ENHANCEMENT] Tracing: add more spans to scrapes, API queries and rule evaluations. [#19410](prometheus/prometheus#19410)
- \[ENHANCEMENT] UI: Show the effective configuration for each scrape pool on the Targets and Service Discovery pages. [#19384](prometheus/prometheus#19384)
- \[ENHANCEMENT] scrape: Enable start time synthesis for summary `_count` and `_sum` series in scrape appender v2. [#19323](prometheus/prometheus#19323)
- \[ENHANCEMENT] scrape: stop all pools in parallel for faster shutdowns. [#19295](prometheus/prometheus#19295)
- \[ENHANCEMENT] storage/remote: Add undocumented failed\_request\_logging config field to debug log remote write V2 requests on send errors. [#19249](prometheus/prometheus#19249)
- \[ENHANCEMENT] TSDB: Add fast path for XOR chunk decompression to speed up queries. [#18049](prometheus/prometheus#18049)
- \[ENHANCEMENT] UI: Improve native histogram table formatting and add a background bar indicating the bucket count. [#19332](prometheus/prometheus#19332)
- \[ENHANCEMENT] TSDB: Add `prometheus_tsdb_head_series_pending_commit_underflow_total` to report pending-sample reservation underflows. [#19470](prometheus/prometheus#19470)
- \[PERF] AWS SD: Build RDS cluster labels once per cluster instead of once per instance. [#19504](prometheus/prometheus#19504)
- \[PERF] AWS SD: Describe RDS instances of different clusters concurrently, bounded by `request_concurrency`. [#19506](prometheus/prometheus#19506)
- \[PERF] AWS SD: Describe each ElastiCache resource once per refresh instead of twice. [#19585](prometheus/prometheus#19585)
- \[PERF] Remote read: Avoid cloning labels for sampled reads when no external labels are configured. [#19503](prometheus/prometheus#19503)
- \[PERF] Remote write: Reuse OTLP converter scratch state between requests. [#19388](prometheus/prometheus#19388)
- \[PERF] scrape: conversion from classic to native histograms should only parse start times when enabled. [#19446](prometheus/prometheus#19446)
- \[BUGFIX] PromQL: Fix `info()` enrichment for composite expressions with mixed `@`/offset references or selector-free vector branches, preventing metadata from being evaluated at an unrelated timestamp. [#19387](prometheus/prometheus#19387)
- \[BUGFIX] PromQL: Fix info() enrichment when input series use different subsets of identifying labels. [#19557](prometheus/prometheus#19557)
- \[BUGFIX] PromQL: Preserve metric-name dropping through the info function when delayed name removal is enabled. [#19413](prometheus/prometheus#19413)
- \[BUGFIX] TSDB: Don't silently drop samples when head garbage collection removes a series while it is being appended to. [#19272](prometheus/prometheus#19272)
- \[BUGFIX] TSDB: Keep series with uncommitted samples during selected- and stale-series compaction, including when appenders overlap. [#19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Do not retain head series after a synthetic start-timestamp zero sample is rejected. [#19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Prevent query panics during series eviction after WAL replay. [#19664](prometheus/prometheus#19664)
- \[BUGFIX] TSDB: fix potential deadlock between mmapSeriesChunks and gcSeries. [#19460](prometheus/prometheus#19460)
- \[BUGFIX] TSDB: fix default block reload interval for custom options. [#19368](prometheus/prometheus#19368)
- \[BUGFIX] AWS SD: Do not crash on serverless MSK clusters or MSK clusters without Open Monitoring. [#19194](prometheus/prometheus#19194)
- \[BUGFIX] AWS SD: Do not panic when the ElastiCache API omits optional fields of a serverless cache or cache cluster. [#19435](prometheus/prometheus#19435)
- \[BUGFIX] AWS SD: Reject non-positive `request_concurrency` instead of hanging service discovery indefinitely. [#19524](prometheus/prometheus#19524)
- \[BUGFIX] Discovery/AWS: Avoid a panic when discovering standalone ECS tasks with custom task groups. [#19302](prometheus/prometheus#19302)
- \[BUGFIX] Discovery: Do not panic in AWS Lightsail service discovery when an instance is missing optional fields such as availability zone, blueprint, bundle, name, state or support code. [#19324](prometheus/prometheus#19324)
- \[BUGFIX] Discovery: delete the stale `prometheus_sd_last_update_timestamp_seconds` series for a config that is removed on reload. [#19131](prometheus/prometheus#19131)
- \[BUGFIX] HTTP: Avoid truncating compressed responses when handlers set Content-Length. [#19661](prometheus/prometheus#19661)
- \[BUGFIX] IONOS SD: Do not panic when the API response omits the server, NIC or volume collections, or a server's properties. [#19438](prometheus/prometheus#19438)
- \[BUGFIX] Metadata will not affect the number of Remote Write v2 shards. [#19218](prometheus/prometheus#19218)
- \[BUGFIX] Mixins: Fix label mismatches that prevented PrometheusHAGroupNotIngestingSamples and PrometheusHAGroupCrashlooping from firing. [#19444](prometheus/prometheus#19444)
- \[BUGFIX] Native histograms: `DetectReset` no longer misses a counter reset when a populated bucket behind an empty one disappears, which could make histogram `rate()`/`increase()` undercount. [#19367](prometheus/prometheus#19367)
- \[BUGFIX] Never skip histogram buckets for histogram\_stddev and histogram\_stdvar functions. [#19521](prometheus/prometheus#19521)
- \[BUGFIX] OTLP: Do not abort an entire OTLP payload ingestion if one metric has no datapoints. [#19343](prometheus/prometheus#19343)
- \[BUGFIX] PromQL: Fix FastRegexMatcher false-positive match when a capturing group is directly adjacent to a literal (e.g. `.*\|(foo)\|.*`). [#19516](prometheus/prometheus#19516)
- \[BUGFIX] PromQL: Fix a panic in range selectors using the experimental `anchored` or `smoothed` modifier when the selected series has no samples inside the query window, for example a query evaluated inside a scrape gap. [#19431](prometheus/prometheus#19431)
- \[BUGFIX] PromQL: Fix empty results when a subquery with `@` is used as the matrix argument of a call that is not step-invariant (for example `quantile_over_time(scalar(x), metric[...:...] @ T)`). [#19187](prometheus/prometheus#19187)
- \[BUGFIX] PromQL: Make the "found duplicate series for the match group" many-to-many matching error message deterministic by sorting the two duplicate labels. [#18810](prometheus/prometheus#18810)
- \[BUGFIX] PromQL: Preserve parentheses around duration literals on Expr.String() round-trip. [#19403](prometheus/prometheus#19403)
- \[BUGFIX] PromQL: Reject duration-expression offsets and `@ start()` / `@ end()` before range selectors, matching the existing rejection of literal offsets and `@ <timestamp>`. [#19406](prometheus/prometheus#19406)
- \[BUGFIX] PromQL: Report the position of the histogram argument rather than of a scalar argument in the native histogram NaN observation annotations of `histogram_quantile` and `histogram_fraction`. [#19330](prometheus/prometheus#19330)
- \[BUGFIX] PromQL: info() now applies the @ modifier/offset when evaluating the info series, so info(v @ T) enriches as of T consistently instead of depending on the query start/eval time. [#19266](prometheus/prometheus#19266)
- \[BUGFIX] Rules: Fix a panic when a rule manager created without a logger loads a rule file containing multiple YAML documents. [#19433](prometheus/prometheus#19433)
- \[BUGFIX] Scrape: Do not append a stale marker for a series that is still exposed when the storage returns a new series reference for it. [#19328](prometheus/prometheus#19328)
- \[BUGFIX] Scrape: JSON log formatter correctly format scrape target info. [#19472](prometheus/prometheus#19472)
- \[BUGFIX] TSDB: Fix in-order chunk ID overflow by wrapping head chunk IDs modulo 2^23 so they never collide with the out-of-order flag bit. [#19450](prometheus/prometheus#19450)
- \[BUGFIX] TSDB: Fix out-of-order chunk ID overflow by wrapping `firstOOOChunkID` modulo 2^23 instead of growing unbounded. [#19216](prometheus/prometheus#19216)
- \[BUGFIX] UI: Remove an extraneous X-axis tick mark in the native histogram chart when using the "linear" display mode. [#19326](prometheus/prometheus#19326)
- \[BUGFIX] discovery/aws: Avoid a panic when an ElastiCache ARN is missing its resource ID. [#19333](prometheus/prometheus#19333)
- \[BUGFIX] discovery/aws: Do not panic on MSK clusters whose optional API fields are absent. [#19584](prometheus/prometheus#19584)
- \[BUGFIX] discovery/aws: Do not panic when the EC2 API omits optional instance fields. [#19512](prometheus/prometheus#19512)
- \[BUGFIX] discovery/aws: Don't panic on ECS tasks with absent optional fields. [#19396](prometheus/prometheus#19396)
- \[BUGFIX] discovery/aws: MSK Optional Custom Configuration Fields [#19422](prometheus/prometheus#19422). [#19422](prometheus/prometheus#19422)
- \[BUGFIX] discovery/ionos: Fix panic when the IONOS API omits optional server fields. [#19418](prometheus/prometheus#19418)
- \[BUGFIX] discovery/kubernetes: Populate `__meta_kubernetes_service_loadbalancer_ip` from `status.loadBalancer.ingress`, falling back to deprecated `spec.loadBalancerIP`. [#19404](prometheus/prometheus#19404)
- \[BUGFIX] histogram: Fix Compact moving buckets to wrong indices, and producing negative bucket counts for integer histograms, when more than one span is merged in the same pass. [#19312](prometheus/prometheus#19312)
- \[BUGFIX] promtool: Fixed `tsdb dump` silently dropping native histogram samples. [#18051](prometheus/prometheus#18051)
- \[BUGFIX] scrape: fix data race in `Manager.TargetsDroppedCounts` to avoid miscounting dropped targets. [#19304](prometheus/prometheus#19304)
- \[BUGFIX] scrape: fix nil histogram when native and classic histograms are mixed in one metric family. [#19452](prometheus/prometheus#19452)
- \[BUGFIX] TSDB: Fix WAL and GC log messages to emit human-readable duration strings instead of nanosecond integers. [#19307](prometheus/prometheus#19307)
- \[BUGFIX] TSDB: Avoid WAL corruption after a failed WAL write in Agent mode. [#19700](prometheus/prometheus#19700)
- \[BUGFIX] Agent: Ignore unknown WAL record types, to help users rolling back. [#19814](prometheus/prometheus#19814)
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Sep 26, 2026
##### [\`v3.15.0\`](https://github.com/prometheus/prometheus/releases/tag/v3.15.0)

- \[CHANGE] PromQL: A range query whose `end` was not aligned to `step` caused subqueries inside it to evaluate past the parent's last actual step, inflating `peakSamples` in the query stats and against the `query.max-samples` limit, and wasting storage I/O reading samples that were never used in the result. Add tests to prevent regression of the fix made in [#18081](prometheus/prometheus#18081). [#18598](prometheus/prometheus#18598)
- \[CHANGE] PromQL: Do not register a start timestamp reset if the start timestamp hasn't changed between subsequent samples. [#19454](prometheus/prometheus#19454)
- \[CHANGE] Logging: Deprecate `--log.level`; use `runtime.log_level` configuration to supply the default level. [#19511](prometheus/prometheus#19511)
- \[FEATURE] Configuration: Allow changing the process log level through `runtime.log_level` on configuration reload. [#19511](prometheus/prometheus#19511)
- \[FEATURE] Prometheus: Add `--auto-gomemlimit.refresh-interval` flag to periodically re-detect the container or system memory limit and update `GOMEMLIMIT` at runtime. [#18843](prometheus/prometheus#18843)
- \[FEATURE] Scraping: Add support for scraping targets via Unix Domain Sockets. [#12024](prometheus/prometheus#12024). [#18091](prometheus/prometheus#18091)
- \[FEATURE] scrape: Implement OM2.0 scrape format. [#18606](prometheus/prometheus#18606)
- \[ENHANCEMENT] Reduce TSDB head CPU utilization when initializing. [#18001](prometheus/prometheus#18001)
- \[ENHANCEMENT] Docker SD: Add labels `__meta_docker_container_image` and `__meta_docker_container_image_id`. [#19386](prometheus/prometheus#19386)
- \[ENHANCEMENT] Mixin: Add a p95/p99 remote-write send-batch latency panel to the remote-write dashboard. [#19500](prometheus/prometheus#19500)
- \[ENHANCEMENT] Mixin: Support native histograms in the remote-write send-batch latency panel. [#19522](prometheus/prometheus#19522)
- \[ENHANCEMENT] PromQL/TSDB: The `--enable-feature=st-storage` flag now automatically enables XOR2 float chunk encoding and ST-capable histogram chunk encoding, so you no longer need to pass `xor2-encoding` and `histograms-st-encoding` alongside it. [#19518](prometheus/prometheus#19518)
- \[ENHANCEMENT] Remote write / Alertmanager: upgrade sigv4 to v0.5.0, adding `session_name` and `tags` fields for STS AssumeRole sessions. The previously undocumented `service_name` field is now also documented. [#19569](prometheus/prometheus#19569)
- \[ENHANCEMENT] Scraping: Support zstd-compressed scrape responses, enabled via feature flag `zstd-scrape`. [#19502](prometheus/prometheus#19502)
- \[ENHANCEMENT] TSDB: Stabilize the XOR2 float chunk encoding. `--enable-feature=xor2-encoding` is deprecated; use `storage.tsdb.chunk_encoding.floats: xor2` instead. Check that other software reading the TSDB directly (e.g. Thanos sidecar) supports XOR2 before enabling. [#19461](prometheus/prometheus#19461)
- \[ENHANCEMENT] TSDB: add `prometheus_tsdb_head_appenders_created_total` metric. [#19411](prometheus/prometheus#19411)
- \[ENHANCEMENT] Tracing: add more spans to scrapes, API queries and rule evaluations. [#19410](prometheus/prometheus#19410)
- \[ENHANCEMENT] UI: Show the effective configuration for each scrape pool on the Targets and Service Discovery pages. [#19384](prometheus/prometheus#19384)
- \[ENHANCEMENT] scrape: Enable start time synthesis for summary `_count` and `_sum` series in scrape appender v2. [#19323](prometheus/prometheus#19323)
- \[ENHANCEMENT] scrape: stop all pools in parallel for faster shutdowns. [#19295](prometheus/prometheus#19295)
- \[ENHANCEMENT] storage/remote: Add undocumented failed\_request\_logging config field to debug log remote write V2 requests on send errors. [#19249](prometheus/prometheus#19249)
- \[ENHANCEMENT] TSDB: Add fast path for XOR chunk decompression to speed up queries. [#18049](prometheus/prometheus#18049)
- \[ENHANCEMENT] UI: Improve native histogram table formatting and add a background bar indicating the bucket count. [#19332](prometheus/prometheus#19332)
- \[ENHANCEMENT] TSDB: Add `prometheus_tsdb_head_series_pending_commit_underflow_total` to report pending-sample reservation underflows. [#19470](prometheus/prometheus#19470)
- \[PERF] AWS SD: Build RDS cluster labels once per cluster instead of once per instance. [#19504](prometheus/prometheus#19504)
- \[PERF] AWS SD: Describe RDS instances of different clusters concurrently, bounded by `request_concurrency`. [#19506](prometheus/prometheus#19506)
- \[PERF] AWS SD: Describe each ElastiCache resource once per refresh instead of twice. [#19585](prometheus/prometheus#19585)
- \[PERF] Remote read: Avoid cloning labels for sampled reads when no external labels are configured. [#19503](prometheus/prometheus#19503)
- \[PERF] Remote write: Reuse OTLP converter scratch state between requests. [#19388](prometheus/prometheus#19388)
- \[PERF] scrape: conversion from classic to native histograms should only parse start times when enabled. [#19446](prometheus/prometheus#19446)
- \[BUGFIX] PromQL: Fix `info()` enrichment for composite expressions with mixed `@`/offset references or selector-free vector branches, preventing metadata from being evaluated at an unrelated timestamp. [#19387](prometheus/prometheus#19387)
- \[BUGFIX] PromQL: Fix info() enrichment when input series use different subsets of identifying labels. [#19557](prometheus/prometheus#19557)
- \[BUGFIX] PromQL: Preserve metric-name dropping through the info function when delayed name removal is enabled. [#19413](prometheus/prometheus#19413)
- \[BUGFIX] TSDB: Don't silently drop samples when head garbage collection removes a series while it is being appended to. [#19272](prometheus/prometheus#19272)
- \[BUGFIX] TSDB: Keep series with uncommitted samples during selected- and stale-series compaction, including when appenders overlap. [#19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Do not retain head series after a synthetic start-timestamp zero sample is rejected. [#19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Prevent query panics during series eviction after WAL replay. [#19664](prometheus/prometheus#19664)
- \[BUGFIX] TSDB: fix potential deadlock between mmapSeriesChunks and gcSeries. [#19460](prometheus/prometheus#19460)
- \[BUGFIX] TSDB: fix default block reload interval for custom options. [#19368](prometheus/prometheus#19368)
- \[BUGFIX] AWS SD: Do not crash on serverless MSK clusters or MSK clusters without Open Monitoring. [#19194](prometheus/prometheus#19194)
- \[BUGFIX] AWS SD: Do not panic when the ElastiCache API omits optional fields of a serverless cache or cache cluster. [#19435](prometheus/prometheus#19435)
- \[BUGFIX] AWS SD: Reject non-positive `request_concurrency` instead of hanging service discovery indefinitely. [#19524](prometheus/prometheus#19524)
- \[BUGFIX] Discovery/AWS: Avoid a panic when discovering standalone ECS tasks with custom task groups. [#19302](prometheus/prometheus#19302)
- \[BUGFIX] Discovery: Do not panic in AWS Lightsail service discovery when an instance is missing optional fields such as availability zone, blueprint, bundle, name, state or support code. [#19324](prometheus/prometheus#19324)
- \[BUGFIX] Discovery: delete the stale `prometheus_sd_last_update_timestamp_seconds` series for a config that is removed on reload. [#19131](prometheus/prometheus#19131)
- \[BUGFIX] HTTP: Avoid truncating compressed responses when handlers set Content-Length. [#19661](prometheus/prometheus#19661)
- \[BUGFIX] IONOS SD: Do not panic when the API response omits the server, NIC or volume collections, or a server's properties. [#19438](prometheus/prometheus#19438)
- \[BUGFIX] Metadata will not affect the number of Remote Write v2 shards. [#19218](prometheus/prometheus#19218)
- \[BUGFIX] Mixins: Fix label mismatches that prevented PrometheusHAGroupNotIngestingSamples and PrometheusHAGroupCrashlooping from firing. [#19444](prometheus/prometheus#19444)
- \[BUGFIX] Native histograms: `DetectReset` no longer misses a counter reset when a populated bucket behind an empty one disappears, which could make histogram `rate()`/`increase()` undercount. [#19367](prometheus/prometheus#19367)
- \[BUGFIX] Never skip histogram buckets for histogram\_stddev and histogram\_stdvar functions. [#19521](prometheus/prometheus#19521)
- \[BUGFIX] OTLP: Do not abort an entire OTLP payload ingestion if one metric has no datapoints. [#19343](prometheus/prometheus#19343)
- \[BUGFIX] PromQL: Fix FastRegexMatcher false-positive match when a capturing group is directly adjacent to a literal (e.g. `.*\|(foo)\|.*`). [#19516](prometheus/prometheus#19516)
- \[BUGFIX] PromQL: Fix a panic in range selectors using the experimental `anchored` or `smoothed` modifier when the selected series has no samples inside the query window, for example a query evaluated inside a scrape gap. [#19431](prometheus/prometheus#19431)
- \[BUGFIX] PromQL: Fix empty results when a subquery with `@` is used as the matrix argument of a call that is not step-invariant (for example `quantile_over_time(scalar(x), metric[...:...] @ T)`). [#19187](prometheus/prometheus#19187)
- \[BUGFIX] PromQL: Make the "found duplicate series for the match group" many-to-many matching error message deterministic by sorting the two duplicate labels. [#18810](prometheus/prometheus#18810)
- \[BUGFIX] PromQL: Preserve parentheses around duration literals on Expr.String() round-trip. [#19403](prometheus/prometheus#19403)
- \[BUGFIX] PromQL: Reject duration-expression offsets and `@ start()` / `@ end()` before range selectors, matching the existing rejection of literal offsets and `@ <timestamp>`. [#19406](prometheus/prometheus#19406)
- \[BUGFIX] PromQL: Report the position of the histogram argument rather than of a scalar argument in the native histogram NaN observation annotations of `histogram_quantile` and `histogram_fraction`. [#19330](prometheus/prometheus#19330)
- \[BUGFIX] PromQL: info() now applies the @ modifier/offset when evaluating the info series, so info(v @ T) enriches as of T consistently instead of depending on the query start/eval time. [#19266](prometheus/prometheus#19266)
- \[BUGFIX] Rules: Fix a panic when a rule manager created without a logger loads a rule file containing multiple YAML documents. [#19433](prometheus/prometheus#19433)
- \[BUGFIX] Scrape: Do not append a stale marker for a series that is still exposed when the storage returns a new series reference for it. [#19328](prometheus/prometheus#19328)
- \[BUGFIX] Scrape: JSON log formatter correctly format scrape target info. [#19472](prometheus/prometheus#19472)
- \[BUGFIX] TSDB: Fix in-order chunk ID overflow by wrapping head chunk IDs modulo 2^23 so they never collide with the out-of-order flag bit. [#19450](prometheus/prometheus#19450)
- \[BUGFIX] TSDB: Fix out-of-order chunk ID overflow by wrapping `firstOOOChunkID` modulo 2^23 instead of growing unbounded. [#19216](prometheus/prometheus#19216)
- \[BUGFIX] UI: Remove an extraneous X-axis tick mark in the native histogram chart when using the "linear" display mode. [#19326](prometheus/prometheus#19326)
- \[BUGFIX] discovery/aws: Avoid a panic when an ElastiCache ARN is missing its resource ID. [#19333](prometheus/prometheus#19333)
- \[BUGFIX] discovery/aws: Do not panic on MSK clusters whose optional API fields are absent. [#19584](prometheus/prometheus#19584)
- \[BUGFIX] discovery/aws: Do not panic when the EC2 API omits optional instance fields. [#19512](prometheus/prometheus#19512)
- \[BUGFIX] discovery/aws: Don't panic on ECS tasks with absent optional fields. [#19396](prometheus/prometheus#19396)
- \[BUGFIX] discovery/aws: MSK Optional Custom Configuration Fields [#19422](prometheus/prometheus#19422). [#19422](prometheus/prometheus#19422)
- \[BUGFIX] discovery/ionos: Fix panic when the IONOS API omits optional server fields. [#19418](prometheus/prometheus#19418)
- \[BUGFIX] discovery/kubernetes: Populate `__meta_kubernetes_service_loadbalancer_ip` from `status.loadBalancer.ingress`, falling back to deprecated `spec.loadBalancerIP`. [#19404](prometheus/prometheus#19404)
- \[BUGFIX] histogram: Fix Compact moving buckets to wrong indices, and producing negative bucket counts for integer histograms, when more than one span is merged in the same pass. [#19312](prometheus/prometheus#19312)
- \[BUGFIX] promtool: Fixed `tsdb dump` silently dropping native histogram samples. [#18051](prometheus/prometheus#18051)
- \[BUGFIX] scrape: fix data race in `Manager.TargetsDroppedCounts` to avoid miscounting dropped targets. [#19304](prometheus/prometheus#19304)
- \[BUGFIX] scrape: fix nil histogram when native and classic histograms are mixed in one metric family. [#19452](prometheus/prometheus#19452)
- \[BUGFIX] TSDB: Fix WAL and GC log messages to emit human-readable duration strings instead of nanosecond integers. [#19307](prometheus/prometheus#19307)
- \[BUGFIX] TSDB: Avoid WAL corruption after a failed WAL write in Agent mode. [#19700](prometheus/prometheus#19700)
- \[BUGFIX] Agent: Ignore unknown WAL record types, to help users rolling back. [#19814](prometheus/prometheus#19814)
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Sep 26, 2026
##### [\`v3.15.0\`](https://github.com/prometheus/prometheus/releases/tag/v3.15.0)

- \[CHANGE] PromQL: A range query whose `end` was not aligned to `step` caused subqueries inside it to evaluate past the parent's last actual step, inflating `peakSamples` in the query stats and against the `query.max-samples` limit, and wasting storage I/O reading samples that were never used in the result. Add tests to prevent regression of the fix made in [#18081](prometheus/prometheus#18081). [#18598](prometheus/prometheus#18598)
- \[CHANGE] PromQL: Do not register a start timestamp reset if the start timestamp hasn't changed between subsequent samples. [#19454](prometheus/prometheus#19454)
- \[CHANGE] Logging: Deprecate `--log.level`; use `runtime.log_level` configuration to supply the default level. [#19511](prometheus/prometheus#19511)
- \[FEATURE] Configuration: Allow changing the process log level through `runtime.log_level` on configuration reload. [#19511](prometheus/prometheus#19511)
- \[FEATURE] Prometheus: Add `--auto-gomemlimit.refresh-interval` flag to periodically re-detect the container or system memory limit and update `GOMEMLIMIT` at runtime. [#18843](prometheus/prometheus#18843)
- \[FEATURE] Scraping: Add support for scraping targets via Unix Domain Sockets. [#12024](prometheus/prometheus#12024). [#18091](prometheus/prometheus#18091)
- \[FEATURE] scrape: Implement OM2.0 scrape format. [#18606](prometheus/prometheus#18606)
- \[ENHANCEMENT] Reduce TSDB head CPU utilization when initializing. [#18001](prometheus/prometheus#18001)
- \[ENHANCEMENT] Docker SD: Add labels `__meta_docker_container_image` and `__meta_docker_container_image_id`. [#19386](prometheus/prometheus#19386)
- \[ENHANCEMENT] Mixin: Add a p95/p99 remote-write send-batch latency panel to the remote-write dashboard. [#19500](prometheus/prometheus#19500)
- \[ENHANCEMENT] Mixin: Support native histograms in the remote-write send-batch latency panel. [#19522](prometheus/prometheus#19522)
- \[ENHANCEMENT] PromQL/TSDB: The `--enable-feature=st-storage` flag now automatically enables XOR2 float chunk encoding and ST-capable histogram chunk encoding, so you no longer need to pass `xor2-encoding` and `histograms-st-encoding` alongside it. [#19518](prometheus/prometheus#19518)
- \[ENHANCEMENT] Remote write / Alertmanager: upgrade sigv4 to v0.5.0, adding `session_name` and `tags` fields for STS AssumeRole sessions. The previously undocumented `service_name` field is now also documented. [#19569](prometheus/prometheus#19569)
- \[ENHANCEMENT] Scraping: Support zstd-compressed scrape responses, enabled via feature flag `zstd-scrape`. [#19502](prometheus/prometheus#19502)
- \[ENHANCEMENT] TSDB: Stabilize the XOR2 float chunk encoding. `--enable-feature=xor2-encoding` is deprecated; use `storage.tsdb.chunk_encoding.floats: xor2` instead. Check that other software reading the TSDB directly (e.g. Thanos sidecar) supports XOR2 before enabling. [#19461](prometheus/prometheus#19461)
- \[ENHANCEMENT] TSDB: add `prometheus_tsdb_head_appenders_created_total` metric. [#19411](prometheus/prometheus#19411)
- \[ENHANCEMENT] Tracing: add more spans to scrapes, API queries and rule evaluations. [#19410](prometheus/prometheus#19410)
- \[ENHANCEMENT] UI: Show the effective configuration for each scrape pool on the Targets and Service Discovery pages. [#19384](prometheus/prometheus#19384)
- \[ENHANCEMENT] scrape: Enable start time synthesis for summary `_count` and `_sum` series in scrape appender v2. [#19323](prometheus/prometheus#19323)
- \[ENHANCEMENT] scrape: stop all pools in parallel for faster shutdowns. [#19295](prometheus/prometheus#19295)
- \[ENHANCEMENT] storage/remote: Add undocumented failed\_request\_logging config field to debug log remote write V2 requests on send errors. [#19249](prometheus/prometheus#19249)
- \[ENHANCEMENT] TSDB: Add fast path for XOR chunk decompression to speed up queries. [#18049](prometheus/prometheus#18049)
- \[ENHANCEMENT] UI: Improve native histogram table formatting and add a background bar indicating the bucket count. [#19332](prometheus/prometheus#19332)
- \[ENHANCEMENT] TSDB: Add `prometheus_tsdb_head_series_pending_commit_underflow_total` to report pending-sample reservation underflows. [#19470](prometheus/prometheus#19470)
- \[PERF] AWS SD: Build RDS cluster labels once per cluster instead of once per instance. [#19504](prometheus/prometheus#19504)
- \[PERF] AWS SD: Describe RDS instances of different clusters concurrently, bounded by `request_concurrency`. [#19506](prometheus/prometheus#19506)
- \[PERF] AWS SD: Describe each ElastiCache resource once per refresh instead of twice. [#19585](prometheus/prometheus#19585)
- \[PERF] Remote read: Avoid cloning labels for sampled reads when no external labels are configured. [#19503](prometheus/prometheus#19503)
- \[PERF] Remote write: Reuse OTLP converter scratch state between requests. [#19388](prometheus/prometheus#19388)
- \[PERF] scrape: conversion from classic to native histograms should only parse start times when enabled. [#19446](prometheus/prometheus#19446)
- \[BUGFIX] PromQL: Fix `info()` enrichment for composite expressions with mixed `@`/offset references or selector-free vector branches, preventing metadata from being evaluated at an unrelated timestamp. [#19387](prometheus/prometheus#19387)
- \[BUGFIX] PromQL: Fix info() enrichment when input series use different subsets of identifying labels. [#19557](prometheus/prometheus#19557)
- \[BUGFIX] PromQL: Preserve metric-name dropping through the info function when delayed name removal is enabled. [#19413](prometheus/prometheus#19413)
- \[BUGFIX] TSDB: Don't silently drop samples when head garbage collection removes a series while it is being appended to. [#19272](prometheus/prometheus#19272)
- \[BUGFIX] TSDB: Keep series with uncommitted samples during selected- and stale-series compaction, including when appenders overlap. [#19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Do not retain head series after a synthetic start-timestamp zero sample is rejected. [#19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Prevent query panics during series eviction after WAL replay. [#19664](prometheus/prometheus#19664)
- \[BUGFIX] TSDB: fix potential deadlock between mmapSeriesChunks and gcSeries. [#19460](prometheus/prometheus#19460)
- \[BUGFIX] TSDB: fix default block reload interval for custom options. [#19368](prometheus/prometheus#19368)
- \[BUGFIX] AWS SD: Do not crash on serverless MSK clusters or MSK clusters without Open Monitoring. [#19194](prometheus/prometheus#19194)
- \[BUGFIX] AWS SD: Do not panic when the ElastiCache API omits optional fields of a serverless cache or cache cluster. [#19435](prometheus/prometheus#19435)
- \[BUGFIX] AWS SD: Reject non-positive `request_concurrency` instead of hanging service discovery indefinitely. [#19524](prometheus/prometheus#19524)
- \[BUGFIX] Discovery/AWS: Avoid a panic when discovering standalone ECS tasks with custom task groups. [#19302](prometheus/prometheus#19302)
- \[BUGFIX] Discovery: Do not panic in AWS Lightsail service discovery when an instance is missing optional fields such as availability zone, blueprint, bundle, name, state or support code. [#19324](prometheus/prometheus#19324)
- \[BUGFIX] Discovery: delete the stale `prometheus_sd_last_update_timestamp_seconds` series for a config that is removed on reload. [#19131](prometheus/prometheus#19131)
- \[BUGFIX] HTTP: Avoid truncating compressed responses when handlers set Content-Length. [#19661](prometheus/prometheus#19661)
- \[BUGFIX] IONOS SD: Do not panic when the API response omits the server, NIC or volume collections, or a server's properties. [#19438](prometheus/prometheus#19438)
- \[BUGFIX] Metadata will not affect the number of Remote Write v2 shards. [#19218](prometheus/prometheus#19218)
- \[BUGFIX] Mixins: Fix label mismatches that prevented PrometheusHAGroupNotIngestingSamples and PrometheusHAGroupCrashlooping from firing. [#19444](prometheus/prometheus#19444)
- \[BUGFIX] Native histograms: `DetectReset` no longer misses a counter reset when a populated bucket behind an empty one disappears, which could make histogram `rate()`/`increase()` undercount. [#19367](prometheus/prometheus#19367)
- \[BUGFIX] Never skip histogram buckets for histogram\_stddev and histogram\_stdvar functions. [#19521](prometheus/prometheus#19521)
- \[BUGFIX] OTLP: Do not abort an entire OTLP payload ingestion if one metric has no datapoints. [#19343](prometheus/prometheus#19343)
- \[BUGFIX] PromQL: Fix FastRegexMatcher false-positive match when a capturing group is directly adjacent to a literal (e.g. `.*\|(foo)\|.*`). [#19516](prometheus/prometheus#19516)
- \[BUGFIX] PromQL: Fix a panic in range selectors using the experimental `anchored` or `smoothed` modifier when the selected series has no samples inside the query window, for example a query evaluated inside a scrape gap. [#19431](prometheus/prometheus#19431)
- \[BUGFIX] PromQL: Fix empty results when a subquery with `@` is used as the matrix argument of a call that is not step-invariant (for example `quantile_over_time(scalar(x), metric[...:...] @ T)`). [#19187](prometheus/prometheus#19187)
- \[BUGFIX] PromQL: Make the "found duplicate series for the match group" many-to-many matching error message deterministic by sorting the two duplicate labels. [#18810](prometheus/prometheus#18810)
- \[BUGFIX] PromQL: Preserve parentheses around duration literals on Expr.String() round-trip. [#19403](prometheus/prometheus#19403)
- \[BUGFIX] PromQL: Reject duration-expression offsets and `@ start()` / `@ end()` before range selectors, matching the existing rejection of literal offsets and `@ <timestamp>`. [#19406](prometheus/prometheus#19406)
- \[BUGFIX] PromQL: Report the position of the histogram argument rather than of a scalar argument in the native histogram NaN observation annotations of `histogram_quantile` and `histogram_fraction`. [#19330](prometheus/prometheus#19330)
- \[BUGFIX] PromQL: info() now applies the @ modifier/offset when evaluating the info series, so info(v @ T) enriches as of T consistently instead of depending on the query start/eval time. [#19266](prometheus/prometheus#19266)
- \[BUGFIX] Rules: Fix a panic when a rule manager created without a logger loads a rule file containing multiple YAML documents. [#19433](prometheus/prometheus#19433)
- \[BUGFIX] Scrape: Do not append a stale marker for a series that is still exposed when the storage returns a new series reference for it. [#19328](prometheus/prometheus#19328)
- \[BUGFIX] Scrape: JSON log formatter correctly format scrape target info. [#19472](prometheus/prometheus#19472)
- \[BUGFIX] TSDB: Fix in-order chunk ID overflow by wrapping head chunk IDs modulo 2^23 so they never collide with the out-of-order flag bit. [#19450](prometheus/prometheus#19450)
- \[BUGFIX] TSDB: Fix out-of-order chunk ID overflow by wrapping `firstOOOChunkID` modulo 2^23 instead of growing unbounded. [#19216](prometheus/prometheus#19216)
- \[BUGFIX] UI: Remove an extraneous X-axis tick mark in the native histogram chart when using the "linear" display mode. [#19326](prometheus/prometheus#19326)
- \[BUGFIX] discovery/aws: Avoid a panic when an ElastiCache ARN is missing its resource ID. [#19333](prometheus/prometheus#19333)
- \[BUGFIX] discovery/aws: Do not panic on MSK clusters whose optional API fields are absent. [#19584](prometheus/prometheus#19584)
- \[BUGFIX] discovery/aws: Do not panic when the EC2 API omits optional instance fields. [#19512](prometheus/prometheus#19512)
- \[BUGFIX] discovery/aws: Don't panic on ECS tasks with absent optional fields. [#19396](prometheus/prometheus#19396)
- \[BUGFIX] discovery/aws: MSK Optional Custom Configuration Fields [#19422](prometheus/prometheus#19422). [#19422](prometheus/prometheus#19422)
- \[BUGFIX] discovery/ionos: Fix panic when the IONOS API omits optional server fields. [#19418](prometheus/prometheus#19418)
- \[BUGFIX] discovery/kubernetes: Populate `__meta_kubernetes_service_loadbalancer_ip` from `status.loadBalancer.ingress`, falling back to deprecated `spec.loadBalancerIP`. [#19404](prometheus/prometheus#19404)
- \[BUGFIX] histogram: Fix Compact moving buckets to wrong indices, and producing negative bucket counts for integer histograms, when more than one span is merged in the same pass. [#19312](prometheus/prometheus#19312)
- \[BUGFIX] promtool: Fixed `tsdb dump` silently dropping native histogram samples. [#18051](prometheus/prometheus#18051)
- \[BUGFIX] scrape: fix data race in `Manager.TargetsDroppedCounts` to avoid miscounting dropped targets. [#19304](prometheus/prometheus#19304)
- \[BUGFIX] scrape: fix nil histogram when native and classic histograms are mixed in one metric family. [#19452](prometheus/prometheus#19452)
- \[BUGFIX] TSDB: Fix WAL and GC log messages to emit human-readable duration strings instead of nanosecond integers. [#19307](prometheus/prometheus#19307)
- \[BUGFIX] TSDB: Avoid WAL corruption after a failed WAL write in Agent mode. [#19700](prometheus/prometheus#19700)
- \[BUGFIX] Agent: Ignore unknown WAL record types, to help users rolling back. [#19814](prometheus/prometheus#19814)
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Sep 26, 2026
##### [\`v3.15.0\`](https://github.com/prometheus/prometheus/releases/tag/v3.15.0)

- \[CHANGE] PromQL: A range query whose `end` was not aligned to `step` caused subqueries inside it to evaluate past the parent's last actual step, inflating `peakSamples` in the query stats and against the `query.max-samples` limit, and wasting storage I/O reading samples that were never used in the result. Add tests to prevent regression of the fix made in [#18081](prometheus/prometheus#18081). [#18598](prometheus/prometheus#18598)
- \[CHANGE] PromQL: Do not register a start timestamp reset if the start timestamp hasn't changed between subsequent samples. [#19454](prometheus/prometheus#19454)
- \[CHANGE] Logging: Deprecate `--log.level`; use `runtime.log_level` configuration to supply the default level. [#19511](prometheus/prometheus#19511)
- \[FEATURE] Configuration: Allow changing the process log level through `runtime.log_level` on configuration reload. [#19511](prometheus/prometheus#19511)
- \[FEATURE] Prometheus: Add `--auto-gomemlimit.refresh-interval` flag to periodically re-detect the container or system memory limit and update `GOMEMLIMIT` at runtime. [#18843](prometheus/prometheus#18843)
- \[FEATURE] Scraping: Add support for scraping targets via Unix Domain Sockets. [#12024](prometheus/prometheus#12024). [#18091](prometheus/prometheus#18091)
- \[FEATURE] scrape: Implement OM2.0 scrape format. [#18606](prometheus/prometheus#18606)
- \[ENHANCEMENT] Reduce TSDB head CPU utilization when initializing. [#18001](prometheus/prometheus#18001)
- \[ENHANCEMENT] Docker SD: Add labels `__meta_docker_container_image` and `__meta_docker_container_image_id`. [#19386](prometheus/prometheus#19386)
- \[ENHANCEMENT] Mixin: Add a p95/p99 remote-write send-batch latency panel to the remote-write dashboard. [#19500](prometheus/prometheus#19500)
- \[ENHANCEMENT] Mixin: Support native histograms in the remote-write send-batch latency panel. [#19522](prometheus/prometheus#19522)
- \[ENHANCEMENT] PromQL/TSDB: The `--enable-feature=st-storage` flag now automatically enables XOR2 float chunk encoding and ST-capable histogram chunk encoding, so you no longer need to pass `xor2-encoding` and `histograms-st-encoding` alongside it. [#19518](prometheus/prometheus#19518)
- \[ENHANCEMENT] Remote write / Alertmanager: upgrade sigv4 to v0.5.0, adding `session_name` and `tags` fields for STS AssumeRole sessions. The previously undocumented `service_name` field is now also documented. [#19569](prometheus/prometheus#19569)
- \[ENHANCEMENT] Scraping: Support zstd-compressed scrape responses, enabled via feature flag `zstd-scrape`. [#19502](prometheus/prometheus#19502)
- \[ENHANCEMENT] TSDB: Stabilize the XOR2 float chunk encoding. `--enable-feature=xor2-encoding` is deprecated; use `storage.tsdb.chunk_encoding.floats: xor2` instead. Check that other software reading the TSDB directly (e.g. Thanos sidecar) supports XOR2 before enabling. [#19461](prometheus/prometheus#19461)
- \[ENHANCEMENT] TSDB: add `prometheus_tsdb_head_appenders_created_total` metric. [#19411](prometheus/prometheus#19411)
- \[ENHANCEMENT] Tracing: add more spans to scrapes, API queries and rule evaluations. [#19410](prometheus/prometheus#19410)
- \[ENHANCEMENT] UI: Show the effective configuration for each scrape pool on the Targets and Service Discovery pages. [#19384](prometheus/prometheus#19384)
- \[ENHANCEMENT] scrape: Enable start time synthesis for summary `_count` and `_sum` series in scrape appender v2. [#19323](prometheus/prometheus#19323)
- \[ENHANCEMENT] scrape: stop all pools in parallel for faster shutdowns. [#19295](prometheus/prometheus#19295)
- \[ENHANCEMENT] storage/remote: Add undocumented failed\_request\_logging config field to debug log remote write V2 requests on send errors. [#19249](prometheus/prometheus#19249)
- \[ENHANCEMENT] TSDB: Add fast path for XOR chunk decompression to speed up queries. [#18049](prometheus/prometheus#18049)
- \[ENHANCEMENT] UI: Improve native histogram table formatting and add a background bar indicating the bucket count. [#19332](prometheus/prometheus#19332)
- \[ENHANCEMENT] TSDB: Add `prometheus_tsdb_head_series_pending_commit_underflow_total` to report pending-sample reservation underflows. [#19470](prometheus/prometheus#19470)
- \[PERF] AWS SD: Build RDS cluster labels once per cluster instead of once per instance. [#19504](prometheus/prometheus#19504)
- \[PERF] AWS SD: Describe RDS instances of different clusters concurrently, bounded by `request_concurrency`. [#19506](prometheus/prometheus#19506)
- \[PERF] AWS SD: Describe each ElastiCache resource once per refresh instead of twice. [#19585](prometheus/prometheus#19585)
- \[PERF] Remote read: Avoid cloning labels for sampled reads when no external labels are configured. [#19503](prometheus/prometheus#19503)
- \[PERF] Remote write: Reuse OTLP converter scratch state between requests. [#19388](prometheus/prometheus#19388)
- \[PERF] scrape: conversion from classic to native histograms should only parse start times when enabled. [#19446](prometheus/prometheus#19446)
- \[BUGFIX] PromQL: Fix `info()` enrichment for composite expressions with mixed `@`/offset references or selector-free vector branches, preventing metadata from being evaluated at an unrelated timestamp. [#19387](prometheus/prometheus#19387)
- \[BUGFIX] PromQL: Fix info() enrichment when input series use different subsets of identifying labels. [#19557](prometheus/prometheus#19557)
- \[BUGFIX] PromQL: Preserve metric-name dropping through the info function when delayed name removal is enabled. [#19413](prometheus/prometheus#19413)
- \[BUGFIX] TSDB: Don't silently drop samples when head garbage collection removes a series while it is being appended to. [#19272](prometheus/prometheus#19272)
- \[BUGFIX] TSDB: Keep series with uncommitted samples during selected- and stale-series compaction, including when appenders overlap. [#19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Do not retain head series after a synthetic start-timestamp zero sample is rejected. [#19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Prevent query panics during series eviction after WAL replay. [#19664](prometheus/prometheus#19664)
- \[BUGFIX] TSDB: fix potential deadlock between mmapSeriesChunks and gcSeries. [#19460](prometheus/prometheus#19460)
- \[BUGFIX] TSDB: fix default block reload interval for custom options. [#19368](prometheus/prometheus#19368)
- \[BUGFIX] AWS SD: Do not crash on serverless MSK clusters or MSK clusters without Open Monitoring. [#19194](prometheus/prometheus#19194)
- \[BUGFIX] AWS SD: Do not panic when the ElastiCache API omits optional fields of a serverless cache or cache cluster. [#19435](prometheus/prometheus#19435)
- \[BUGFIX] AWS SD: Reject non-positive `request_concurrency` instead of hanging service discovery indefinitely. [#19524](prometheus/prometheus#19524)
- \[BUGFIX] Discovery/AWS: Avoid a panic when discovering standalone ECS tasks with custom task groups. [#19302](prometheus/prometheus#19302)
- \[BUGFIX] Discovery: Do not panic in AWS Lightsail service discovery when an instance is missing optional fields such as availability zone, blueprint, bundle, name, state or support code. [#19324](prometheus/prometheus#19324)
- \[BUGFIX] Discovery: delete the stale `prometheus_sd_last_update_timestamp_seconds` series for a config that is removed on reload. [#19131](prometheus/prometheus#19131)
- \[BUGFIX] HTTP: Avoid truncating compressed responses when handlers set Content-Length. [#19661](prometheus/prometheus#19661)
- \[BUGFIX] IONOS SD: Do not panic when the API response omits the server, NIC or volume collections, or a server's properties. [#19438](prometheus/prometheus#19438)
- \[BUGFIX] Metadata will not affect the number of Remote Write v2 shards. [#19218](prometheus/prometheus#19218)
- \[BUGFIX] Mixins: Fix label mismatches that prevented PrometheusHAGroupNotIngestingSamples and PrometheusHAGroupCrashlooping from firing. [#19444](prometheus/prometheus#19444)
- \[BUGFIX] Native histograms: `DetectReset` no longer misses a counter reset when a populated bucket behind an empty one disappears, which could make histogram `rate()`/`increase()` undercount. [#19367](prometheus/prometheus#19367)
- \[BUGFIX] Never skip histogram buckets for histogram\_stddev and histogram\_stdvar functions. [#19521](prometheus/prometheus#19521)
- \[BUGFIX] OTLP: Do not abort an entire OTLP payload ingestion if one metric has no datapoints. [#19343](prometheus/prometheus#19343)
- \[BUGFIX] PromQL: Fix FastRegexMatcher false-positive match when a capturing group is directly adjacent to a literal (e.g. `.*\|(foo)\|.*`). [#19516](prometheus/prometheus#19516)
- \[BUGFIX] PromQL: Fix a panic in range selectors using the experimental `anchored` or `smoothed` modifier when the selected series has no samples inside the query window, for example a query evaluated inside a scrape gap. [#19431](prometheus/prometheus#19431)
- \[BUGFIX] PromQL: Fix empty results when a subquery with `@` is used as the matrix argument of a call that is not step-invariant (for example `quantile_over_time(scalar(x), metric[...:...] @ T)`). [#19187](prometheus/prometheus#19187)
- \[BUGFIX] PromQL: Make the "found duplicate series for the match group" many-to-many matching error message deterministic by sorting the two duplicate labels. [#18810](prometheus/prometheus#18810)
- \[BUGFIX] PromQL: Preserve parentheses around duration literals on Expr.String() round-trip. [#19403](prometheus/prometheus#19403)
- \[BUGFIX] PromQL: Reject duration-expression offsets and `@ start()` / `@ end()` before range selectors, matching the existing rejection of literal offsets and `@ <timestamp>`. [#19406](prometheus/prometheus#19406)
- \[BUGFIX] PromQL: Report the position of the histogram argument rather than of a scalar argument in the native histogram NaN observation annotations of `histogram_quantile` and `histogram_fraction`. [#19330](prometheus/prometheus#19330)
- \[BUGFIX] PromQL: info() now applies the @ modifier/offset when evaluating the info series, so info(v @ T) enriches as of T consistently instead of depending on the query start/eval time. [#19266](prometheus/prometheus#19266)
- \[BUGFIX] Rules: Fix a panic when a rule manager created without a logger loads a rule file containing multiple YAML documents. [#19433](prometheus/prometheus#19433)
- \[BUGFIX] Scrape: Do not append a stale marker for a series that is still exposed when the storage returns a new series reference for it. [#19328](prometheus/prometheus#19328)
- \[BUGFIX] Scrape: JSON log formatter correctly format scrape target info. [#19472](prometheus/prometheus#19472)
- \[BUGFIX] TSDB: Fix in-order chunk ID overflow by wrapping head chunk IDs modulo 2^23 so they never collide with the out-of-order flag bit. [#19450](prometheus/prometheus#19450)
- \[BUGFIX] TSDB: Fix out-of-order chunk ID overflow by wrapping `firstOOOChunkID` modulo 2^23 instead of growing unbounded. [#19216](prometheus/prometheus#19216)
- \[BUGFIX] UI: Remove an extraneous X-axis tick mark in the native histogram chart when using the "linear" display mode. [#19326](prometheus/prometheus#19326)
- \[BUGFIX] discovery/aws: Avoid a panic when an ElastiCache ARN is missing its resource ID. [#19333](prometheus/prometheus#19333)
- \[BUGFIX] discovery/aws: Do not panic on MSK clusters whose optional API fields are absent. [#19584](prometheus/prometheus#19584)
- \[BUGFIX] discovery/aws: Do not panic when the EC2 API omits optional instance fields. [#19512](prometheus/prometheus#19512)
- \[BUGFIX] discovery/aws: Don't panic on ECS tasks with absent optional fields. [#19396](prometheus/prometheus#19396)
- \[BUGFIX] discovery/aws: MSK Optional Custom Configuration Fields [#19422](prometheus/prometheus#19422). [#19422](prometheus/prometheus#19422)
- \[BUGFIX] discovery/ionos: Fix panic when the IONOS API omits optional server fields. [#19418](prometheus/prometheus#19418)
- \[BUGFIX] discovery/kubernetes: Populate `__meta_kubernetes_service_loadbalancer_ip` from `status.loadBalancer.ingress`, falling back to deprecated `spec.loadBalancerIP`. [#19404](prometheus/prometheus#19404)
- \[BUGFIX] histogram: Fix Compact moving buckets to wrong indices, and producing negative bucket counts for integer histograms, when more than one span is merged in the same pass. [#19312](prometheus/prometheus#19312)
- \[BUGFIX] promtool: Fixed `tsdb dump` silently dropping native histogram samples. [#18051](prometheus/prometheus#18051)
- \[BUGFIX] scrape: fix data race in `Manager.TargetsDroppedCounts` to avoid miscounting dropped targets. [#19304](prometheus/prometheus#19304)
- \[BUGFIX] scrape: fix nil histogram when native and classic histograms are mixed in one metric family. [#19452](prometheus/prometheus#19452)
- \[BUGFIX] TSDB: Fix WAL and GC log messages to emit human-readable duration strings instead of nanosecond integers. [#19307](prometheus/prometheus#19307)
- \[BUGFIX] TSDB: Avoid WAL corruption after a failed WAL write in Agent mode. [#19700](prometheus/prometheus#19700)
- \[BUGFIX] Agent: Ignore unknown WAL record types, to help users rolling back. [#19814](prometheus/prometheus#19814)
renovate Bot added a commit to sdwilsh/ansible-playbooks that referenced this pull request Sep 26, 2026
##### [\`v3.15.0\`](https://github.com/prometheus/prometheus/releases/tag/v3.15.0)

- \[CHANGE] PromQL: A range query whose `end` was not aligned to `step` caused subqueries inside it to evaluate past the parent's last actual step, inflating `peakSamples` in the query stats and against the `query.max-samples` limit, and wasting storage I/O reading samples that were never used in the result. Add tests to prevent regression of the fix made in [#18081](prometheus/prometheus#18081). [#18598](prometheus/prometheus#18598)
- \[CHANGE] PromQL: Do not register a start timestamp reset if the start timestamp hasn't changed between subsequent samples. [#19454](prometheus/prometheus#19454)
- \[CHANGE] Logging: Deprecate `--log.level`; use `runtime.log_level` configuration to supply the default level. [#19511](prometheus/prometheus#19511)
- \[FEATURE] Configuration: Allow changing the process log level through `runtime.log_level` on configuration reload. [#19511](prometheus/prometheus#19511)
- \[FEATURE] Prometheus: Add `--auto-gomemlimit.refresh-interval` flag to periodically re-detect the container or system memory limit and update `GOMEMLIMIT` at runtime. [#18843](prometheus/prometheus#18843)
- \[FEATURE] Scraping: Add support for scraping targets via Unix Domain Sockets. [#12024](prometheus/prometheus#12024). [#18091](prometheus/prometheus#18091)
- \[FEATURE] scrape: Implement OM2.0 scrape format. [#18606](prometheus/prometheus#18606)
- \[ENHANCEMENT] Reduce TSDB head CPU utilization when initializing. [#18001](prometheus/prometheus#18001)
- \[ENHANCEMENT] Docker SD: Add labels `__meta_docker_container_image` and `__meta_docker_container_image_id`. [#19386](prometheus/prometheus#19386)
- \[ENHANCEMENT] Mixin: Add a p95/p99 remote-write send-batch latency panel to the remote-write dashboard. [#19500](prometheus/prometheus#19500)
- \[ENHANCEMENT] Mixin: Support native histograms in the remote-write send-batch latency panel. [#19522](prometheus/prometheus#19522)
- \[ENHANCEMENT] PromQL/TSDB: The `--enable-feature=st-storage` flag now automatically enables XOR2 float chunk encoding and ST-capable histogram chunk encoding, so you no longer need to pass `xor2-encoding` and `histograms-st-encoding` alongside it. [#19518](prometheus/prometheus#19518)
- \[ENHANCEMENT] Remote write / Alertmanager: upgrade sigv4 to v0.5.0, adding `session_name` and `tags` fields for STS AssumeRole sessions. The previously undocumented `service_name` field is now also documented. [#19569](prometheus/prometheus#19569)
- \[ENHANCEMENT] Scraping: Support zstd-compressed scrape responses, enabled via feature flag `zstd-scrape`. [#19502](prometheus/prometheus#19502)
- \[ENHANCEMENT] TSDB: Stabilize the XOR2 float chunk encoding. `--enable-feature=xor2-encoding` is deprecated; use `storage.tsdb.chunk_encoding.floats: xor2` instead. Check that other software reading the TSDB directly (e.g. Thanos sidecar) supports XOR2 before enabling. [#19461](prometheus/prometheus#19461)
- \[ENHANCEMENT] TSDB: add `prometheus_tsdb_head_appenders_created_total` metric. [#19411](prometheus/prometheus#19411)
- \[ENHANCEMENT] Tracing: add more spans to scrapes, API queries and rule evaluations. [#19410](prometheus/prometheus#19410)
- \[ENHANCEMENT] UI: Show the effective configuration for each scrape pool on the Targets and Service Discovery pages. [#19384](prometheus/prometheus#19384)
- \[ENHANCEMENT] scrape: Enable start time synthesis for summary `_count` and `_sum` series in scrape appender v2. [#19323](prometheus/prometheus#19323)
- \[ENHANCEMENT] scrape: stop all pools in parallel for faster shutdowns. [#19295](prometheus/prometheus#19295)
- \[ENHANCEMENT] storage/remote: Add undocumented failed\_request\_logging config field to debug log remote write V2 requests on send errors. [#19249](prometheus/prometheus#19249)
- \[ENHANCEMENT] TSDB: Add fast path for XOR chunk decompression to speed up queries. [#18049](prometheus/prometheus#18049)
- \[ENHANCEMENT] UI: Improve native histogram table formatting and add a background bar indicating the bucket count. [#19332](prometheus/prometheus#19332)
- \[ENHANCEMENT] TSDB: Add `prometheus_tsdb_head_series_pending_commit_underflow_total` to report pending-sample reservation underflows. [#19470](prometheus/prometheus#19470)
- \[PERF] AWS SD: Build RDS cluster labels once per cluster instead of once per instance. [#19504](prometheus/prometheus#19504)
- \[PERF] AWS SD: Describe RDS instances of different clusters concurrently, bounded by `request_concurrency`. [#19506](prometheus/prometheus#19506)
- \[PERF] AWS SD: Describe each ElastiCache resource once per refresh instead of twice. [#19585](prometheus/prometheus#19585)
- \[PERF] Remote read: Avoid cloning labels for sampled reads when no external labels are configured. [#19503](prometheus/prometheus#19503)
- \[PERF] Remote write: Reuse OTLP converter scratch state between requests. [#19388](prometheus/prometheus#19388)
- \[PERF] scrape: conversion from classic to native histograms should only parse start times when enabled. [#19446](prometheus/prometheus#19446)
- \[BUGFIX] PromQL: Fix `info()` enrichment for composite expressions with mixed `@`/offset references or selector-free vector branches, preventing metadata from being evaluated at an unrelated timestamp. [#19387](prometheus/prometheus#19387)
- \[BUGFIX] PromQL: Fix info() enrichment when input series use different subsets of identifying labels. [#19557](prometheus/prometheus#19557)
- \[BUGFIX] PromQL: Preserve metric-name dropping through the info function when delayed name removal is enabled. [#19413](prometheus/prometheus#19413)
- \[BUGFIX] TSDB: Don't silently drop samples when head garbage collection removes a series while it is being appended to. [#19272](prometheus/prometheus#19272)
- \[BUGFIX] TSDB: Keep series with uncommitted samples during selected- and stale-series compaction, including when appenders overlap. [#19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Do not retain head series after a synthetic start-timestamp zero sample is rejected. [#19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Prevent query panics during series eviction after WAL replay. [#19664](prometheus/prometheus#19664)
- \[BUGFIX] TSDB: fix potential deadlock between mmapSeriesChunks and gcSeries. [#19460](prometheus/prometheus#19460)
- \[BUGFIX] TSDB: fix default block reload interval for custom options. [#19368](prometheus/prometheus#19368)
- \[BUGFIX] AWS SD: Do not crash on serverless MSK clusters or MSK clusters without Open Monitoring. [#19194](prometheus/prometheus#19194)
- \[BUGFIX] AWS SD: Do not panic when the ElastiCache API omits optional fields of a serverless cache or cache cluster. [#19435](prometheus/prometheus#19435)
- \[BUGFIX] AWS SD: Reject non-positive `request_concurrency` instead of hanging service discovery indefinitely. [#19524](prometheus/prometheus#19524)
- \[BUGFIX] Discovery/AWS: Avoid a panic when discovering standalone ECS tasks with custom task groups. [#19302](prometheus/prometheus#19302)
- \[BUGFIX] Discovery: Do not panic in AWS Lightsail service discovery when an instance is missing optional fields such as availability zone, blueprint, bundle, name, state or support code. [#19324](prometheus/prometheus#19324)
- \[BUGFIX] Discovery: delete the stale `prometheus_sd_last_update_timestamp_seconds` series for a config that is removed on reload. [#19131](prometheus/prometheus#19131)
- \[BUGFIX] HTTP: Avoid truncating compressed responses when handlers set Content-Length. [#19661](prometheus/prometheus#19661)
- \[BUGFIX] IONOS SD: Do not panic when the API response omits the server, NIC or volume collections, or a server's properties. [#19438](prometheus/prometheus#19438)
- \[BUGFIX] Metadata will not affect the number of Remote Write v2 shards. [#19218](prometheus/prometheus#19218)
- \[BUGFIX] Mixins: Fix label mismatches that prevented PrometheusHAGroupNotIngestingSamples and PrometheusHAGroupCrashlooping from firing. [#19444](prometheus/prometheus#19444)
- \[BUGFIX] Native histograms: `DetectReset` no longer misses a counter reset when a populated bucket behind an empty one disappears, which could make histogram `rate()`/`increase()` undercount. [#19367](prometheus/prometheus#19367)
- \[BUGFIX] Never skip histogram buckets for histogram\_stddev and histogram\_stdvar functions. [#19521](prometheus/prometheus#19521)
- \[BUGFIX] OTLP: Do not abort an entire OTLP payload ingestion if one metric has no datapoints. [#19343](prometheus/prometheus#19343)
- \[BUGFIX] PromQL: Fix FastRegexMatcher false-positive match when a capturing group is directly adjacent to a literal (e.g. `.*\|(foo)\|.*`). [#19516](prometheus/prometheus#19516)
- \[BUGFIX] PromQL: Fix a panic in range selectors using the experimental `anchored` or `smoothed` modifier when the selected series has no samples inside the query window, for example a query evaluated inside a scrape gap. [#19431](prometheus/prometheus#19431)
- \[BUGFIX] PromQL: Fix empty results when a subquery with `@` is used as the matrix argument of a call that is not step-invariant (for example `quantile_over_time(scalar(x), metric[...:...] @ T)`). [#19187](prometheus/prometheus#19187)
- \[BUGFIX] PromQL: Make the "found duplicate series for the match group" many-to-many matching error message deterministic by sorting the two duplicate labels. [#18810](prometheus/prometheus#18810)
- \[BUGFIX] PromQL: Preserve parentheses around duration literals on Expr.String() round-trip. [#19403](prometheus/prometheus#19403)
- \[BUGFIX] PromQL: Reject duration-expression offsets and `@ start()` / `@ end()` before range selectors, matching the existing rejection of literal offsets and `@ <timestamp>`. [#19406](prometheus/prometheus#19406)
- \[BUGFIX] PromQL: Report the position of the histogram argument rather than of a scalar argument in the native histogram NaN observation annotations of `histogram_quantile` and `histogram_fraction`. [#19330](prometheus/prometheus#19330)
- \[BUGFIX] PromQL: info() now applies the @ modifier/offset when evaluating the info series, so info(v @ T) enriches as of T consistently instead of depending on the query start/eval time. [#19266](prometheus/prometheus#19266)
- \[BUGFIX] Rules: Fix a panic when a rule manager created without a logger loads a rule file containing multiple YAML documents. [#19433](prometheus/prometheus#19433)
- \[BUGFIX] Scrape: Do not append a stale marker for a series that is still exposed when the storage returns a new series reference for it. [#19328](prometheus/prometheus#19328)
- \[BUGFIX] Scrape: JSON log formatter correctly format scrape target info. [#19472](prometheus/prometheus#19472)
- \[BUGFIX] TSDB: Fix in-order chunk ID overflow by wrapping head chunk IDs modulo 2^23 so they never collide with the out-of-order flag bit. [#19450](prometheus/prometheus#19450)
- \[BUGFIX] TSDB: Fix out-of-order chunk ID overflow by wrapping `firstOOOChunkID` modulo 2^23 instead of growing unbounded. [#19216](prometheus/prometheus#19216)
- \[BUGFIX] UI: Remove an extraneous X-axis tick mark in the native histogram chart when using the "linear" display mode. [#19326](prometheus/prometheus#19326)
- \[BUGFIX] discovery/aws: Avoid a panic when an ElastiCache ARN is missing its resource ID. [#19333](prometheus/prometheus#19333)
- \[BUGFIX] discovery/aws: Do not panic on MSK clusters whose optional API fields are absent. [#19584](prometheus/prometheus#19584)
- \[BUGFIX] discovery/aws: Do not panic when the EC2 API omits optional instance fields. [#19512](prometheus/prometheus#19512)
- \[BUGFIX] discovery/aws: Don't panic on ECS tasks with absent optional fields. [#19396](prometheus/prometheus#19396)
- \[BUGFIX] discovery/aws: MSK Optional Custom Configuration Fields [#19422](prometheus/prometheus#19422). [#19422](prometheus/prometheus#19422)
- \[BUGFIX] discovery/ionos: Fix panic when the IONOS API omits optional server fields. [#19418](prometheus/prometheus#19418)
- \[BUGFIX] discovery/kubernetes: Populate `__meta_kubernetes_service_loadbalancer_ip` from `status.loadBalancer.ingress`, falling back to deprecated `spec.loadBalancerIP`. [#19404](prometheus/prometheus#19404)
- \[BUGFIX] histogram: Fix Compact moving buckets to wrong indices, and producing negative bucket counts for integer histograms, when more than one span is merged in the same pass. [#19312](prometheus/prometheus#19312)
- \[BUGFIX] promtool: Fixed `tsdb dump` silently dropping native histogram samples. [#18051](prometheus/prometheus#18051)
- \[BUGFIX] scrape: fix data race in `Manager.TargetsDroppedCounts` to avoid miscounting dropped targets. [#19304](prometheus/prometheus#19304)
- \[BUGFIX] scrape: fix nil histogram when native and classic histograms are mixed in one metric family. [#19452](prometheus/prometheus#19452)
- \[BUGFIX] TSDB: Fix WAL and GC log messages to emit human-readable duration strings instead of nanosecond integers. [#19307](prometheus/prometheus#19307)
- \[BUGFIX] TSDB: Avoid WAL corruption after a failed WAL write in Agent mode. [#19700](prometheus/prometheus#19700)
- \[BUGFIX] Agent: Ignore unknown WAL record types, to help users rolling back. [#19814](prometheus/prometheus#19814)
hbjydev pushed a commit to hbjydev/phoebe that referenced this pull request Sep 28, 2026
…→ v3.15.0) (#769)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [quay.io/prometheus/prometheus](https://github.com/prometheus/prometheus) | minor | `v3.14.0` → `v3.15.0` |

---

### Release Notes

<details>
<summary>prometheus/prometheus (quay.io/prometheus/prometheus)</summary>

### [`v3.15.0`](https://github.com/prometheus/prometheus/releases/tag/v3.15.0): 3.15.0 / 2026-09-24

[Compare Source](prometheus/prometheus@v3.14.0...v3.15.0)

- \[CHANGE] PromQL: A range query whose `end` was not aligned to `step` caused subqueries inside it to evaluate past the parent's last actual step, inflating `peakSamples` in the query stats and against the `query.max-samples` limit, and wasting storage I/O reading samples that were never used in the result. Add tests to prevent regression of the fix made in [#&#8203;18081](prometheus/prometheus#18081). [#&#8203;18598](prometheus/prometheus#18598)
- \[CHANGE] PromQL: Do not register a start timestamp reset if the start timestamp hasn't changed between subsequent samples. [#&#8203;19454](prometheus/prometheus#19454)
- \[CHANGE] Logging: Deprecate `--log.level`; use `runtime.log_level` configuration to supply the default level. [#&#8203;19511](prometheus/prometheus#19511)
- \[FEATURE] Configuration: Allow changing the process log level through `runtime.log_level` on configuration reload. [#&#8203;19511](prometheus/prometheus#19511)
- \[FEATURE] Prometheus: Add `--auto-gomemlimit.refresh-interval` flag to periodically re-detect the container or system memory limit and update `GOMEMLIMIT` at runtime. [#&#8203;18843](prometheus/prometheus#18843)
- \[FEATURE] Scraping: Add support for scraping targets via Unix Domain Sockets. [#&#8203;12024](prometheus/prometheus#12024). [#&#8203;18091](prometheus/prometheus#18091)
- \[FEATURE] scrape: Implement OM2.0 scrape format. [#&#8203;18606](prometheus/prometheus#18606)
- \[ENHANCEMENT] Reduce TSDB head CPU utilization when initializing. [#&#8203;18001](prometheus/prometheus#18001)
- \[ENHANCEMENT] Docker SD: Add labels `__meta_docker_container_image` and `__meta_docker_container_image_id`. [#&#8203;19386](prometheus/prometheus#19386)
- \[ENHANCEMENT] Mixin: Add a p95/p99 remote-write send-batch latency panel to the remote-write dashboard. [#&#8203;19500](prometheus/prometheus#19500)
- \[ENHANCEMENT] Mixin: Support native histograms in the remote-write send-batch latency panel. [#&#8203;19522](prometheus/prometheus#19522)
- \[ENHANCEMENT] PromQL/TSDB: The `--enable-feature=st-storage` flag now automatically enables XOR2 float chunk encoding and ST-capable histogram chunk encoding, so you no longer need to pass `xor2-encoding` and `histograms-st-encoding` alongside it. [#&#8203;19518](prometheus/prometheus#19518)
- \[ENHANCEMENT] Remote write / Alertmanager: upgrade sigv4 to v0.5.0, adding `session_name` and `tags` fields for STS AssumeRole sessions. The previously undocumented `service_name` field is now also documented. [#&#8203;19569](prometheus/prometheus#19569)
- \[ENHANCEMENT] Scraping: Support zstd-compressed scrape responses, enabled via feature flag `zstd-scrape`. [#&#8203;19502](prometheus/prometheus#19502)
- \[ENHANCEMENT] TSDB: Stabilize the XOR2 float chunk encoding. `--enable-feature=xor2-encoding` is deprecated; use `storage.tsdb.chunk_encoding.floats: xor2` instead. Check that other software reading the TSDB directly (e.g. Thanos sidecar) supports XOR2 before enabling. [#&#8203;19461](prometheus/prometheus#19461)
- \[ENHANCEMENT] TSDB: add `prometheus_tsdb_head_appenders_created_total` metric. [#&#8203;19411](prometheus/prometheus#19411)
- \[ENHANCEMENT] Tracing: add more spans to scrapes, API queries and rule evaluations. [#&#8203;19410](prometheus/prometheus#19410)
- \[ENHANCEMENT] UI: Show the effective configuration for each scrape pool on the Targets and Service Discovery pages. [#&#8203;19384](prometheus/prometheus#19384)
- \[ENHANCEMENT] scrape: Enable start time synthesis for summary `_count` and `_sum` series in scrape appender v2. [#&#8203;19323](prometheus/prometheus#19323)
- \[ENHANCEMENT] scrape: stop all pools in parallel for faster shutdowns. [#&#8203;19295](prometheus/prometheus#19295)
- \[ENHANCEMENT] storage/remote: Add undocumented failed\_request\_logging config field to debug log remote write V2 requests on send errors. [#&#8203;19249](prometheus/prometheus#19249)
- \[ENHANCEMENT] TSDB: Add fast path for XOR chunk decompression to speed up queries. [#&#8203;18049](prometheus/prometheus#18049)
- \[ENHANCEMENT] UI: Improve native histogram table formatting and add a background bar indicating the bucket count. [#&#8203;19332](prometheus/prometheus#19332)
- \[ENHANCEMENT] TSDB: Add `prometheus_tsdb_head_series_pending_commit_underflow_total` to report pending-sample reservation underflows. [#&#8203;19470](prometheus/prometheus#19470)
- \[PERF] AWS SD: Build RDS cluster labels once per cluster instead of once per instance. [#&#8203;19504](prometheus/prometheus#19504)
- \[PERF] AWS SD: Describe RDS instances of different clusters concurrently, bounded by `request_concurrency`. [#&#8203;19506](prometheus/prometheus#19506)
- \[PERF] AWS SD: Describe each ElastiCache resource once per refresh instead of twice. [#&#8203;19585](prometheus/prometheus#19585)
- \[PERF] Remote read: Avoid cloning labels for sampled reads when no external labels are configured. [#&#8203;19503](prometheus/prometheus#19503)
- \[PERF] Remote write: Reuse OTLP converter scratch state between requests. [#&#8203;19388](prometheus/prometheus#19388)
- \[PERF] scrape: conversion from classic to native histograms should only parse start times when enabled. [#&#8203;19446](prometheus/prometheus#19446)
- \[BUGFIX] PromQL: Fix `info()` enrichment for composite expressions with mixed `@`/offset references or selector-free vector branches, preventing metadata from being evaluated at an unrelated timestamp. [#&#8203;19387](prometheus/prometheus#19387)
- \[BUGFIX] PromQL: Fix info() enrichment when input series use different subsets of identifying labels. [#&#8203;19557](prometheus/prometheus#19557)
- \[BUGFIX] PromQL: Preserve metric-name dropping through the info function when delayed name removal is enabled. [#&#8203;19413](prometheus/prometheus#19413)
- \[BUGFIX] TSDB: Don't silently drop samples when head garbage collection removes a series while it is being appended to. [#&#8203;19272](prometheus/prometheus#19272)
- \[BUGFIX] TSDB: Keep series with uncommitted samples during selected- and stale-series compaction, including when appenders overlap. [#&#8203;19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Do not retain head series after a synthetic start-timestamp zero sample is rejected. [#&#8203;19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Prevent query panics during series eviction after WAL replay. [#&#8203;19664](prometheus/prometheus#19664)
- \[BUGFIX] TSDB: fix potential deadlock between mmapSeriesChunks and gcSeries. [#&#8203;19460](prometheus/prometheus#19460)
- \[BUGFIX] TSDB: fix default block reload interval for custom options. [#&#8203;19368](prometheus/prometheus#19368)
- \[BUGFIX] AWS SD: Do not crash on serverless MSK clusters or MSK clusters without Open Monitoring. [#&#8203;19194](prometheus/prometheus#19194)
- \[BUGFIX] AWS SD: Do not panic when the ElastiCache API omits optional fields of a serverless cache or cache cluster. [#&#8203;19435](prometheus/prometheus#19435)
- \[BUGFIX] AWS SD: Reject non-positive `request_concurrency` instead of hanging service discovery indefinitely. [#&#8203;19524](prometheus/prometheus#19524)
- \[BUGFIX] Discovery/AWS: Avoid a panic when discovering standalone ECS tasks with custom task groups. [#&#8203;19302](prometheus/prometheus#19302)
- \[BUGFIX] Discovery: Do not panic in AWS Lightsail service discovery when an instance is missing optional fields such as availability zone, blueprint, bundle, name, state or support code. [#&#8203;19324](prometheus/prometheus#19324)
- \[BUGFIX] Discovery: delete the stale `prometheus_sd_last_update_timestamp_seconds` series for a config that is removed on reload. [#&#8203;19131](prometheus/prometheus#19131)
- \[BUGFIX] HTTP: Avoid truncating compressed responses when handlers set Content-Length. [#&#8203;19661](prometheus/prometheus#19661)
- \[BUGFIX] IONOS SD: Do not panic when the API response omits the server, NIC or volume collections, or a server's properties. [#&#8203;19438](prometheus/prometheus#19438)
- \[BUGFIX] Metadata will not affect the number of Remote Write v2 shards. [#&#8203;19218](prometheus/prometheus#19218)
- \[BUGFIX] Mixins: Fix label mismatches that prevented PrometheusHAGroupNotIngestingSamples and PrometheusHAGroupCrashlooping from firing. [#&#8203;19444](prometheus/prometheus#19444)
- \[BUGFIX] Native histograms: `DetectReset` no longer misses a counter reset when a populated bucket behind an empty one disappears, which could make histogram `rate()`/`increase()` undercount. [#&#8203;19367](prometheus/prometheus#19367)
- \[BUGFIX] Never skip histogram buckets for histogram\_stddev and histogram\_stdvar functions. [#&#8203;19521](prometheus/prometheus#19521)
- \[BUGFIX] OTLP: Do not abort an entire OTLP payload ingestion if one metric has no datapoints. [#&#8203;19343](prometheus/prometheus#19343)
- \[BUGFIX] PromQL: Fix FastRegexMatcher false-positive match when a capturing group is directly adjacent to a literal (e.g. `.*\|(foo)\|.*`). [#&#8203;19516](prometheus/prometheus#19516)
- \[BUGFIX] PromQL: Fix a panic in range selectors using the experimental `anchored` or `smoothed` modifier when the selected series has no samples inside the query window, for example a query evaluated inside a scrape gap. [#&#8203;19431](prometheus/prometheus#19431)
- \[BUGFIX] PromQL: Fix empty results when a subquery with `@` is used as the matrix argument of a call that is not step-invariant (for example `quantile_over_time(scalar(x), metric[...:...] @ T)`). [#&#8203;19187](prometheus/prometheus#19187)
- \[BUGFIX] PromQL: Make the "found duplicate series for the match group" many-to-many matching error message deterministic by sorting the two duplicate labels. [#&#8203;18810](prometheus/prometheus#18810)
- \[BUGFIX] PromQL: Preserve parentheses around duration literals on Expr.String() round-trip. [#&#8203;19403](prometheus/prometheus#19403)
- \[BUGFIX] PromQL: Reject duration-expression offsets and `@ start()` / `@ end()` before range selectors, matching the existing rejection of literal offsets and `@ <timestamp>`. [#&#8203;19406](prometheus/prometheus#19406)
- \[BUGFIX] PromQL: Report the position of the histogram argument rather than of a scalar argument in the native histogram NaN observation annotations of `histogram_quantile` and `histogram_fraction`. [#&#8203;19330](prometheus/prometheus#19330)
- \[BUGFIX] PromQL: info() now applies the @&#8203; modifier/offset when evaluating the info series, so info(v @&#8203; T) enriches as of T consistently instead of depending on the query start/eval time. [#&#8203;19266](prometheus/prometheus#19266)
- \[BUGFIX] Rules: Fix a panic when a rule manager created without a logger loads a rule file containing multiple YAML documents. [#&#8203;19433](prometheus/prometheus#19433)
- \[BUGFIX] Scrape: Do not append a stale marker for a series that is still exposed when the storage returns a new series reference for it. [#&#8203;19328](prometheus/prometheus#19328)
- \[BUGFIX] Scrape: JSON log formatter correctly format scrape target info. [#&#8203;19472](prometheus/prometheus#19472)
- \[BUGFIX] TSDB: Fix in-order chunk ID overflow by wrapping head chunk IDs modulo 2^23 so they never collide with the out-of-order flag bit. [#&#8203;19450](prometheus/prometheus#19450)
- \[BUGFIX] TSDB: Fix out-of-order chunk ID overflow by wrapping `firstOOOChunkID` modulo 2^23 instead of growing unbounded. [#&#8203;19216](prometheus/prometheus#19216)
- \[BUGFIX] UI: Remove an extraneous X-axis tick mark in the native histogram chart when using the "linear" display mode. [#&#8203;19326](prometheus/prometheus#19326)
- \[BUGFIX] discovery/aws: Avoid a panic when an ElastiCache ARN is missing its resource ID. [#&#8203;19333](prometheus/prometheus#19333)
- \[BUGFIX] discovery/aws: Do not panic on MSK clusters whose optional API fields are absent. [#&#8203;19584](prometheus/prometheus#19584)
- \[BUGFIX] discovery/aws: Do not panic when the EC2 API omits optional instance fields. [#&#8203;19512](prometheus/prometheus#19512)
- \[BUGFIX] discovery/aws: Don't panic on ECS tasks with absent optional fields. [#&#8203;19396](prometheus/prometheus#19396)
- \[BUGFIX] discovery/aws: MSK Optional Custom Configuration Fields [#&#8203;19422](prometheus/prometheus#19422). [#&#8203;19422](prometheus/prometheus#19422)
- \[BUGFIX] discovery/ionos: Fix panic when the IONOS API omits optional server fields. [#&#8203;19418](prometheus/prometheus#19418)
- \[BUGFIX] discovery/kubernetes: Populate `__meta_kubernetes_service_loadbalancer_ip` from `status.loadBalancer.ingress`, falling back to deprecated `spec.loadBalancerIP`. [#&#8203;19404](prometheus/prometheus#19404)
- \[BUGFIX] histogram: Fix Compact moving buckets to wrong indices, and producing negative bucket counts for integer histograms, when more than one span is merged in the same pass. [#&#8203;19312](prometheus/prometheus#19312)
- \[BUGFIX] promtool: Fixed `tsdb dump` silently dropping native histogram samples. [#&#8203;18051](prometheus/prometheus#18051)
- \[BUGFIX] scrape: fix data race in `Manager.TargetsDroppedCounts` to avoid miscounting dropped targets. [#&#8203;19304](prometheus/prometheus#19304)
- \[BUGFIX] scrape: fix nil histogram when native and classic histograms are mixed in one metric family. [#&#8203;19452](prometheus/prometheus#19452)
- \[BUGFIX] TSDB: Fix WAL and GC log messages to emit human-readable duration strings instead of nanosecond integers. [#&#8203;19307](prometheus/prometheus#19307)
- \[BUGFIX] TSDB: Avoid WAL corruption after a failed WAL write in Agent mode. [#&#8203;19700](prometheus/prometheus#19700)
- \[BUGFIX] Agent: Ignore unknown WAL record types, to help users rolling back. [#&#8203;19814](prometheus/prometheus#19814)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/London)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMTUuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjExNS4xMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUvY29udGFpbmVyIiwidHlwZS9taW5vciJdfQ==-->

Reviewed-on: https://git.hayden.moe/hayden/phoebe/pulls/769
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Oct 3, 2026
…➔ v3.15.0) (#2199)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [quay.io/prometheus/prometheus](https://github.com/prometheus/prometheus) | minor | `v3.14.0` → `v3.15.0` |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/567) for more information.

---

### Release Notes

<details>
<summary>prometheus/prometheus (quay.io/prometheus/prometheus)</summary>

### [`v3.15.0`](https://github.com/prometheus/prometheus/releases/tag/v3.15.0): 3.15.0 / 2026-09-24

[Compare Source](prometheus/prometheus@v3.14.0...v3.15.0)

- \[CHANGE] PromQL: A range query whose `end` was not aligned to `step` caused subqueries inside it to evaluate past the parent's last actual step, inflating `peakSamples` in the query stats and against the `query.max-samples` limit, and wasting storage I/O reading samples that were never used in the result. Add tests to prevent regression of the fix made in [#&#8203;18081](prometheus/prometheus#18081). [#&#8203;18598](prometheus/prometheus#18598)
- \[CHANGE] PromQL: Do not register a start timestamp reset if the start timestamp hasn't changed between subsequent samples. [#&#8203;19454](prometheus/prometheus#19454)
- \[CHANGE] Logging: Deprecate `--log.level`; use `runtime.log_level` configuration to supply the default level. [#&#8203;19511](prometheus/prometheus#19511)
- \[FEATURE] Configuration: Allow changing the process log level through `runtime.log_level` on configuration reload. [#&#8203;19511](prometheus/prometheus#19511)
- \[FEATURE] Prometheus: Add `--auto-gomemlimit.refresh-interval` flag to periodically re-detect the container or system memory limit and update `GOMEMLIMIT` at runtime. [#&#8203;18843](prometheus/prometheus#18843)
- \[FEATURE] Scraping: Add support for scraping targets via Unix Domain Sockets. [#&#8203;12024](prometheus/prometheus#12024). [#&#8203;18091](prometheus/prometheus#18091)
- \[FEATURE] scrape: Implement OM2.0 scrape format. [#&#8203;18606](prometheus/prometheus#18606)
- \[ENHANCEMENT] Reduce TSDB head CPU utilization when initializing. [#&#8203;18001](prometheus/prometheus#18001)
- \[ENHANCEMENT] Docker SD: Add labels `__meta_docker_container_image` and `__meta_docker_container_image_id`. [#&#8203;19386](prometheus/prometheus#19386)
- \[ENHANCEMENT] Mixin: Add a p95/p99 remote-write send-batch latency panel to the remote-write dashboard. [#&#8203;19500](prometheus/prometheus#19500)
- \[ENHANCEMENT] Mixin: Support native histograms in the remote-write send-batch latency panel. [#&#8203;19522](prometheus/prometheus#19522)
- \[ENHANCEMENT] PromQL/TSDB: The `--enable-feature=st-storage` flag now automatically enables XOR2 float chunk encoding and ST-capable histogram chunk encoding, so you no longer need to pass `xor2-encoding` and `histograms-st-encoding` alongside it. [#&#8203;19518](prometheus/prometheus#19518)
- \[ENHANCEMENT] Remote write / Alertmanager: upgrade sigv4 to v0.5.0, adding `session_name` and `tags` fields for STS AssumeRole sessions. The previously undocumented `service_name` field is now also documented. [#&#8203;19569](prometheus/prometheus#19569)
- \[ENHANCEMENT] Scraping: Support zstd-compressed scrape responses, enabled via feature flag `zstd-scrape`. [#&#8203;19502](prometheus/prometheus#19502)
- \[ENHANCEMENT] TSDB: Stabilize the XOR2 float chunk encoding. `--enable-feature=xor2-encoding` is deprecated; use `storage.tsdb.chunk_encoding.floats: xor2` instead. Check that other software reading the TSDB directly (e.g. Thanos sidecar) supports XOR2 before enabling. [#&#8203;19461](prometheus/prometheus#19461)
- \[ENHANCEMENT] TSDB: add `prometheus_tsdb_head_appenders_created_total` metric. [#&#8203;19411](prometheus/prometheus#19411)
- \[ENHANCEMENT] Tracing: add more spans to scrapes, API queries and rule evaluations. [#&#8203;19410](prometheus/prometheus#19410)
- \[ENHANCEMENT] UI: Show the effective configuration for each scrape pool on the Targets and Service Discovery pages. [#&#8203;19384](prometheus/prometheus#19384)
- \[ENHANCEMENT] scrape: Enable start time synthesis for summary `_count` and `_sum` series in scrape appender v2. [#&#8203;19323](prometheus/prometheus#19323)
- \[ENHANCEMENT] scrape: stop all pools in parallel for faster shutdowns. [#&#8203;19295](prometheus/prometheus#19295)
- \[ENHANCEMENT] storage/remote: Add undocumented failed\_request\_logging config field to debug log remote write V2 requests on send errors. [#&#8203;19249](prometheus/prometheus#19249)
- \[ENHANCEMENT] TSDB: Add fast path for XOR chunk decompression to speed up queries. [#&#8203;18049](prometheus/prometheus#18049)
- \[ENHANCEMENT] UI: Improve native histogram table formatting and add a background bar indicating the bucket count. [#&#8203;19332](prometheus/prometheus#19332)
- \[ENHANCEMENT] TSDB: Add `prometheus_tsdb_head_series_pending_commit_underflow_total` to report pending-sample reservation underflows. [#&#8203;19470](prometheus/prometheus#19470)
- \[PERF] AWS SD: Build RDS cluster labels once per cluster instead of once per instance. [#&#8203;19504](prometheus/prometheus#19504)
- \[PERF] AWS SD: Describe RDS instances of different clusters concurrently, bounded by `request_concurrency`. [#&#8203;19506](prometheus/prometheus#19506)
- \[PERF] AWS SD: Describe each ElastiCache resource once per refresh instead of twice. [#&#8203;19585](prometheus/prometheus#19585)
- \[PERF] Remote read: Avoid cloning labels for sampled reads when no external labels are configured. [#&#8203;19503](prometheus/prometheus#19503)
- \[PERF] Remote write: Reuse OTLP converter scratch state between requests. [#&#8203;19388](prometheus/prometheus#19388)
- \[PERF] scrape: conversion from classic to native histograms should only parse start times when enabled. [#&#8203;19446](prometheus/prometheus#19446)
- \[BUGFIX] PromQL: Fix `info()` enrichment for composite expressions with mixed `@`/offset references or selector-free vector branches, preventing metadata from being evaluated at an unrelated timestamp. [#&#8203;19387](prometheus/prometheus#19387)
- \[BUGFIX] PromQL: Fix info() enrichment when input series use different subsets of identifying labels. [#&#8203;19557](prometheus/prometheus#19557)
- \[BUGFIX] PromQL: Preserve metric-name dropping through the info function when delayed name removal is enabled. [#&#8203;19413](prometheus/prometheus#19413)
- \[BUGFIX] TSDB: Don't silently drop samples when head garbage collection removes a series while it is being appended to. [#&#8203;19272](prometheus/prometheus#19272)
- \[BUGFIX] TSDB: Keep series with uncommitted samples during selected- and stale-series compaction, including when appenders overlap. [#&#8203;19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Do not retain head series after a synthetic start-timestamp zero sample is rejected. [#&#8203;19470](prometheus/prometheus#19470)
- \[BUGFIX] TSDB: Prevent query panics during series eviction after WAL replay. [#&#8203;19664](prometheus/prometheus#19664)
- \[BUGFIX] TSDB: fix potential deadlock between mmapSeriesChunks and gcSeries. [#&#8203;19460](prometheus/prometheus#19460)
- \[BUGFIX] TSDB: fix default block reload interval for custom options. [#&#8203;19368](prometheus/prometheus#19368)
- \[BUGFIX] AWS SD: Do not crash on serverless MSK clusters or MSK clusters without Open Monitoring. [#&#8203;19194](prometheus/prometheus#19194)
- \[BUGFIX] AWS SD: Do not panic when the ElastiCache API omits optional fields of a serverless cache or cache cluster. [#&#8203;19435](prometheus/prometheus#19435)
- \[BUGFIX] AWS SD: Reject non-positive `request_concurrency` instead of hanging service discovery indefinitely. [#&#8203;19524](prometheus/prometheus#19524)
- \[BUGFIX] Discovery/AWS: Avoid a panic when discovering standalone ECS tasks with custom task groups. [#&#8203;19302](prometheus/prometheus#19302)
- \[BUGFIX] Discovery: Do not panic in AWS Lightsail service discovery when an instance is missing optional fields such as availability zone, blueprint, bundle, name, state or support code. [#&#8203;19324](prometheus/prometheus#19324)
- \[BUGFIX] Discovery: delete the stale `prometheus_sd_last_update_timestamp_seconds` series for a config that is removed on reload. [#&#8203;19131](prometheus/prometheus#19131)
- \[BUGFIX] HTTP: Avoid truncating compressed responses when handlers set Content-Length. [#&#8203;19661](prometheus/prometheus#19661)
- \[BUGFIX] IONOS SD: Do not panic when the API response omits the server, NIC or volume collections, or a server's properties. [#&#8203;19438](prometheus/prometheus#19438)
- \[BUGFIX] Metadata will not affect the number of Remote Write v2 shards. [#&#8203;19218](prometheus/prometheus#19218)
- \[BUGFIX] Mixins: Fix label mismatches that prevented PrometheusHAGroupNotIngestingSamples and PrometheusHAGroupCrashlooping from firing. [#&#8203;19444](prometheus/prometheus#19444)
- \[BUGFIX] Native histograms: `DetectReset` no longer misses a counter reset when a populated bucket behind an empty one disappears, which could make histogram `rate()`/`increase()` undercount. [#&#8203;19367](prometheus/prometheus#19367)
- \[BUGFIX] Never skip histogram buckets for histogram\_stddev and histogram\_stdvar functions. [#&#8203;19521](prometheus/prometheus#19521)
- \[BUGFIX] OTLP: Do not abort an entire OTLP payload ingestion if one metric has no datapoints. [#&#8203;19343](prometheus/prometheus#19343)
- \[BUGFIX] PromQL: Fix FastRegexMatcher false-positive match when a capturing group is directly adjacent to a literal (e.g. `.*\|(foo)\|.*`). [#&#8203;19516](prometheus/prometheus#19516)
- \[BUGFIX] PromQL: Fix a panic in range selectors using the experimental `anchored` or `smoothed` modifier when the selected series has no samples inside the query window, for example a query evaluated inside a scrape gap. [#&#8203;19431](prometheus/prometheus#19431)
- \[BUGFIX] PromQL: Fix empty results when a subquery with `@` is used as the matrix argument of a call that is not step-invariant (for example `quantile_over_time(scalar(x), metric[...:...] @ T)`). [#&#8203;19187](prometheus/prometheus#19187)
- \[BUGFIX] PromQL: Make the "found duplicate series for the match group" many-to-many matching error message deterministic by sorting the two duplicate labels. [#&#8203;18810](prometheus/prometheus#18810)
- \[BUGFIX] PromQL: Preserve parentheses around duration literals on Expr.String() round-trip. [#&#8203;19403](prometheus/prometheus#19403)
- \[BUGFIX] PromQL: Reject duration-expression offsets and `@ start()` / `@ end()` before range selectors, matching the existing rejection of literal offsets and `@ <timestamp>`. [#&#8203;19406](prometheus/prometheus#19406)
- \[BUGFIX] PromQL: Report the position of the histogram argument rather than of a scalar argument in the native histogram NaN observation annotations of `histogram_quantile` and `histogram_fraction`. [#&#8203;19330](prometheus/prometheus#19330)
- \[BUGFIX] PromQL: info() now applies the @&#8203; modifier/offset when evaluating the info series, so info(v @&#8203; T) enriches as of T consistently instead of depending on the query start/eval time. [#&#8203;19266](prometheus/prometheus#19266)
- \[BUGFIX] Rules: Fix a panic when a rule manager created without a logger loads a rule file containing multiple YAML documents. [#&#8203;19433](prometheus/prometheus#19433)
- \[BUGFIX] Scrape: Do not append a stale marker for a series that is still exposed when the storage returns a new series reference for it. [#&#8203;19328](prometheus/prometheus#19328)
- \[BUGFIX] Scrape: JSON log formatter correctly format scrape target info. [#&#8203;19472](prometheus/prometheus#19472)
- \[BUGFIX] TSDB: Fix in-order chunk ID overflow by wrapping head chunk IDs modulo 2^23 so they never collide with the out-of-order flag bit. [#&#8203;19450](prometheus/prometheus#19450)
- \[BUGFIX] TSDB: Fix out-of-order chunk ID overflow by wrapping `firstOOOChunkID` modulo 2^23 instead of growing unbounded. [#&#8203;19216](prometheus/prometheus#19216)
- \[BUGFIX] UI: Remove an extraneous X-axis tick mark in the native histogram chart when using the "linear" display mode. [#&#8203;19326](prometheus/prometheus#19326)
- \[BUGFIX] discovery/aws: Avoid a panic when an ElastiCache ARN is missing its resource ID. [#&#8203;19333](prometheus/prometheus#19333)
- \[BUGFIX] discovery/aws: Do not panic on MSK clusters whose optional API fields are absent. [#&#8203;19584](prometheus/prometheus#19584)
- \[BUGFIX] discovery/aws: Do not panic when the EC2 API omits optional instance fields. [#&#8203;19512](prometheus/prometheus#19512)
- \[BUGFIX] discovery/aws: Don't panic on ECS tasks with absent optional fields. [#&#8203;19396](prometheus/prometheus#19396)
- \[BUGFIX] discovery/aws: MSK Optional Custom Configuration Fields [#&#8203;19422](prometheus/prometheus#19422). [#&#8203;19422](prometheus/prometheus#19422)
- \[BUGFIX] discovery/ionos: Fix panic when the IONOS API omits optional server fields. [#&#8203;19418](prometheus/prometheus#19418)
- \[BUGFIX] discovery/kubernetes: Populate `__meta_kubernetes_service_loadbalancer_ip` from `status.loadBalancer.ingress`, falling back to deprecated `spec.loadBalancerIP`. [#&#8203;19404](prometheus/prometheus#19404)
- \[BUGFIX] histogram: Fix Compact moving buckets to wrong indices, and producing negative bucket counts for integer histograms, when more than one span is merged in the same pass. [#&#8203;19312](prometheus/prometheus#19312)
- \[BUGFIX] promtool: Fixed `tsdb dump` silently dropping native histogram samples. [#&#8203;18051](prometheus/prometheus#18051)
- \[BUGFIX] scrape: fix data race in `Manager.TargetsDroppedCounts` to avoid miscounting dropped targets. [#&#8203;19304](prometheus/prometheus#19304)
- \[BUGFIX] scrape: fix nil histogram when native and classic histograms are mixed in one metric family. [#&#8203;19452](prometheus/prometheus#19452)
- \[BUGFIX] TSDB: Fix WAL and GC log messages to emit human-readable duration strings instead of nanosecond integers. [#&#8203;19307](prometheus/prometheus#19307)
- \[BUGFIX] TSDB: Avoid WAL corruption after a failed WAL write in Agent mode. [#&#8203;19700](prometheus/prometheus#19700)
- \[BUGFIX] Agent: Ignore unknown WAL record types, to help users rolling back. [#&#8203;19814](prometheus/prometheus#19814)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Paris)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xMDQuMiIsInVwZGF0ZWRJblZlciI6IjQ0LjEwNC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/2199
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants