diff --git a/go.mod b/go.mod index 2443c8de78f..60d0c5d4ffc 100644 --- a/go.mod +++ b/go.mod @@ -43,15 +43,15 @@ require ( github.com/prometheus/alertmanager v0.28.1 github.com/prometheus/client_golang v1.21.1 github.com/prometheus/client_model v0.6.2 - github.com/prometheus/common v0.62.0 + github.com/prometheus/common v0.63.0 // Prometheus maps version 2.x.y to tags v0.x.y. - github.com/prometheus/prometheus v0.303.1-0.20250504095004-c3ce1f192748 + github.com/prometheus/prometheus v0.303.1 github.com/segmentio/fasthash v1.0.3 github.com/sony/gobreaker v1.0.0 github.com/spf13/afero v1.11.0 github.com/stretchr/testify v1.10.0 github.com/thanos-io/objstore v0.0.0-20250317105316-a0136a6f898d - github.com/thanos-io/promql-engine v0.0.0-20250522103302-dd83bd8fdb50 + github.com/thanos-io/promql-engine v0.0.0-20250606124720-6f637b9579dc github.com/thanos-io/thanos v0.37.3-0.20250603135757-4ad45948cd10 github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/weaveworks/common v0.0.0-20230728070032-dd9e68f319d5 @@ -310,3 +310,5 @@ replace google.golang.org/grpc => google.golang.org/grpc v1.65.0 replace github.com/thanos-io/objstore => github.com/thanos-io/objstore v0.0.0-20241111205755-d1dd89d41f97 replace github.com/prometheus/prometheus => github.com/prometheus/prometheus v0.302.1 + +replace github.com/prometheus/common => github.com/prometheus/common v0.62.1-0.20250120132612-df14882cbf97 diff --git a/go.sum b/go.sum index abe004c1355..c4e840bd864 100644 --- a/go.sum +++ b/go.sum @@ -808,14 +808,9 @@ github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alecthomas/kingpin v1.3.8-0.20210301060133-17f40c25f497/go.mod h1:b6br6/pDFSfMkBgC96TbpOji05q5pa+v5rIlS0Y6XtI= github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE= @@ -876,8 +871,6 @@ github.com/baidubce/bce-sdk-go v0.9.228/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTF github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -1028,15 +1021,11 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= @@ -1100,7 +1089,6 @@ github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= @@ -1345,15 +1333,12 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= @@ -1365,6 +1350,7 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -1380,9 +1366,7 @@ github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -1443,7 +1427,6 @@ github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6T github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos= @@ -1496,7 +1479,6 @@ github.com/mozillazg/go-httpheader v0.4.0 h1:aBn6aRXtFzyDLZ4VIRLsZbbJloagQfMnCiY github.com/mozillazg/go-httpheader v0.4.0/go.mod h1:PuT8h0pw6efvp8ZeUec1Rs7dwjK08bt6gKSReGMqtdA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= @@ -1554,7 +1536,6 @@ github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFu github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1573,35 +1554,26 @@ github.com/prometheus-community/prom-label-proxy v0.11.0 h1:IO02WiiFMfcIqvjhwMbC github.com/prometheus-community/prom-label-proxy v0.11.0/go.mod h1:lfvrG70XqsxWDrSh1843QXBG0fSg8EbIXmAo8xGsvw8= github.com/prometheus/alertmanager v0.28.1 h1:BK5pCoAtaKg01BYRUJhEDV1tqJMEtYBGzPw8QdvnnvA= github.com/prometheus/alertmanager v0.28.1/go.mod h1:0StpPUDDHi1VXeM7p2yYfeZgLVi/PPlt39vo9LQUHxM= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/common v0.62.1-0.20250120132612-df14882cbf97 h1:81SfOTpFUTViDWsDUpGCXeMvpe54PHc91sPmGhBBRo0= +github.com/prometheus/common v0.62.1-0.20250120132612-df14882cbf97/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/exporter-toolkit v0.14.0 h1:NMlswfibpcZZ+H0sZBiTjrA3/aBFHkNZqE+iCj5EmRg= github.com/prometheus/exporter-toolkit v0.14.0/go.mod h1:Gu5LnVvt7Nr/oqTBUC23WILZepW0nffNo10XdhQcwWA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/prometheus/prometheus v0.302.1 h1:xqVdrwrB4WNpdgJqxsz5loqFWNUZitsK8myqLuSZ6Ag= @@ -1621,6 +1593,7 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= @@ -1645,9 +1618,7 @@ github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+Yg github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92 h1:OfRzdxCzDhp+rsKWXuOO2I/quKMJ/+TQwVbIP/gltZg= github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92/go.mod h1:7/OT02F6S6I7v6WXb+IjhMuZEYfH/RJ5RwEWnEo5BMg= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= @@ -1695,8 +1666,8 @@ github.com/thanos-community/galaxycache v0.0.0-20211122094458-3a32041a1f1e h1:f1 github.com/thanos-community/galaxycache v0.0.0-20211122094458-3a32041a1f1e/go.mod h1:jXcofnrSln/cLI6/dhlBxPQZEEQHVPCcFaH75M+nSzM= github.com/thanos-io/objstore v0.0.0-20241111205755-d1dd89d41f97 h1:VjG0mwhN1DkncwDHFvrpd12/2TLfgYNRmEQA48ikp+0= github.com/thanos-io/objstore v0.0.0-20241111205755-d1dd89d41f97/go.mod h1:vyzFrBXgP+fGNG2FopEGWOO/zrIuoy7zt3LpLeezRsw= -github.com/thanos-io/promql-engine v0.0.0-20250522103302-dd83bd8fdb50 h1:RGdaDAyFOjrFJSjaPT2z8robLvQ3KxNiNEN3DojpLOs= -github.com/thanos-io/promql-engine v0.0.0-20250522103302-dd83bd8fdb50/go.mod h1:agUazAk1yHLYSL87MdEcRbjN12DJ9OZfSUcfFLqy+F8= +github.com/thanos-io/promql-engine v0.0.0-20250606124720-6f637b9579dc h1:Hccd/2qzk75XPvK1Oi7F8E9NvBt1kLa0AGd7ivds9nc= +github.com/thanos-io/promql-engine v0.0.0-20250606124720-6f637b9579dc/go.mod h1:JkfCTUfgCD48IDOVm0Zpm4013dHXahoYjN2mdP2lccg= github.com/thanos-io/thanos v0.37.3-0.20250603135757-4ad45948cd10 h1:mtmcivEm0EoXeHTJAgjXTthyQSTLNFWrPTzpiovau3Y= github.com/thanos-io/thanos v0.37.3-0.20250603135757-4ad45948cd10/go.mod h1:2NvA8ZJtoGcOTriumDnJQzDmbxJz1ISGPovVAGGYDbg= github.com/tjhop/slog-gokit v0.1.4 h1:uj/vbDt3HaF0Py8bHPV4ti/s0utnO0miRbO277FLBKM= @@ -1846,7 +1817,6 @@ go4.org/intern v0.0.0-20230525184215-6c62f75575cb/go.mod h1:Ycrt6raEcnF5FTsLiLKk go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6 h1:lGdhQUN/cnWdSH3291CUuxSEqc+AsGTiDxPP3r2J0l4= go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1870,6 +1840,8 @@ golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1m golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1933,10 +1905,11 @@ golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1944,7 +1917,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -2006,6 +1978,8 @@ golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2039,6 +2013,8 @@ golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2059,12 +2035,12 @@ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2082,7 +2058,6 @@ golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2097,8 +2072,6 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2168,8 +2141,12 @@ golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2186,6 +2163,8 @@ golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2207,6 +2186,8 @@ golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2284,6 +2265,7 @@ golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2574,6 +2556,8 @@ google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2593,13 +2577,10 @@ gopkg.in/telebot.v3 v3.3.8 h1:uVDGjak9l824FN9YARWUHMsiNZnlohAVwUycw21k6t8= gopkg.in/telebot.v3 v3.3.8/go.mod h1:1mlbqcLTVSfK9dx7fdp+Nb5HZsy4LLPtpZTKmwhwtzM= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/prometheus/common/config/headers.go b/vendor/github.com/prometheus/common/config/headers.go index 7276742ec90..9beaae26c20 100644 --- a/vendor/github.com/prometheus/common/config/headers.go +++ b/vendor/github.com/prometheus/common/config/headers.go @@ -24,9 +24,9 @@ import ( "strings" ) -// reservedHeaders that change the connection, are set by Prometheus, or can +// ReservedHeaders that change the connection, are set by Prometheus, or can // be changed otherwise. -var reservedHeaders = map[string]struct{}{ +var ReservedHeaders = map[string]struct{}{ "Authorization": {}, "Host": {}, "Content-Encoding": {}, @@ -72,7 +72,7 @@ func (h *Headers) SetDirectory(dir string) { // Validate validates the Headers config. func (h *Headers) Validate() error { for n := range h.Headers { - if _, ok := reservedHeaders[http.CanonicalHeaderKey(n)]; ok { + if _, ok := ReservedHeaders[http.CanonicalHeaderKey(n)]; ok { return fmt.Errorf("setting header %q is not allowed", http.CanonicalHeaderKey(n)) } } diff --git a/vendor/github.com/prometheus/common/promslog/slog.go b/vendor/github.com/prometheus/common/promslog/slog.go index 6e8fbabce5d..11c33fb666f 100644 --- a/vendor/github.com/prometheus/common/promslog/slog.go +++ b/vendor/github.com/prometheus/common/promslog/slog.go @@ -25,6 +25,7 @@ import ( "path/filepath" "strconv" "strings" + "time" ) type LogStyle string @@ -32,6 +33,8 @@ type LogStyle string const ( SlogStyle LogStyle = "slog" GoKitStyle LogStyle = "go-kit" + + reservedKeyPrefix = "logged_" ) var ( @@ -43,26 +46,51 @@ var ( goKitStyleReplaceAttrFunc = func(groups []string, a slog.Attr) slog.Attr { key := a.Key switch key { - case slog.TimeKey: - a.Key = "ts" - - // This timestamp format differs from RFC3339Nano by using .000 instead - // of .999999999 which changes the timestamp from 9 variable to 3 fixed - // decimals (.130 instead of .130987456). - t := a.Value.Time() - a.Value = slog.StringValue(t.UTC().Format("2006-01-02T15:04:05.000Z07:00")) - case slog.SourceKey: - a.Key = "caller" - src, _ := a.Value.Any().(*slog.Source) + case slog.TimeKey, "ts": + if t, ok := a.Value.Any().(time.Time); ok { + a.Key = "ts" - switch callerAddFunc { - case true: - a.Value = slog.StringValue(filepath.Base(src.File) + "(" + filepath.Base(src.Function) + "):" + strconv.Itoa(src.Line)) - default: - a.Value = slog.StringValue(filepath.Base(src.File) + ":" + strconv.Itoa(src.Line)) + // This timestamp format differs from RFC3339Nano by using .000 instead + // of .999999999 which changes the timestamp from 9 variable to 3 fixed + // decimals (.130 instead of .130987456). + a.Value = slog.StringValue(t.UTC().Format("2006-01-02T15:04:05.000Z07:00")) + } else { + // If we can't cast the any from the value to a + // time.Time, it means the caller logged + // another attribute with a key of `ts`. + // Prevent duplicate keys (necessary for proper + // JSON) by renaming the key to `logged_ts`. + a.Key = reservedKeyPrefix + key + } + case slog.SourceKey, "caller": + if src, ok := a.Value.Any().(*slog.Source); ok { + a.Key = "caller" + switch callerAddFunc { + case true: + a.Value = slog.StringValue(filepath.Base(src.File) + "(" + filepath.Base(src.Function) + "):" + strconv.Itoa(src.Line)) + default: + a.Value = slog.StringValue(filepath.Base(src.File) + ":" + strconv.Itoa(src.Line)) + } + } else { + // If we can't cast the any from the value to + // an *slog.Source, it means the caller logged + // another attribute with a key of `caller`. + // Prevent duplicate keys (necessary for proper + // JSON) by renaming the key to + // `logged_caller`. + a.Key = reservedKeyPrefix + key } case slog.LevelKey: - a.Value = slog.StringValue(strings.ToLower(a.Value.String())) + if lvl, ok := a.Value.Any().(slog.Level); ok { + a.Value = slog.StringValue(strings.ToLower(lvl.String())) + } else { + // If we can't cast the any from the value to + // an slog.Level, it means the caller logged + // another attribute with a key of `level`. + // Prevent duplicate keys (necessary for proper + // JSON) by renaming the key to `logged_level`. + a.Key = reservedKeyPrefix + key + } default: } @@ -72,11 +100,38 @@ var ( key := a.Key switch key { case slog.TimeKey: - t := a.Value.Time() - a.Value = slog.TimeValue(t.UTC()) + if t, ok := a.Value.Any().(time.Time); ok { + a.Value = slog.TimeValue(t.UTC()) + } else { + // If we can't cast the any from the value to a + // time.Time, it means the caller logged + // another attribute with a key of `time`. + // Prevent duplicate keys (necessary for proper + // JSON) by renaming the key to `logged_time`. + a.Key = reservedKeyPrefix + key + } case slog.SourceKey: - src, _ := a.Value.Any().(*slog.Source) - a.Value = slog.StringValue(filepath.Base(src.File) + ":" + strconv.Itoa(src.Line)) + if src, ok := a.Value.Any().(*slog.Source); ok { + a.Value = slog.StringValue(filepath.Base(src.File) + ":" + strconv.Itoa(src.Line)) + } else { + // If we can't cast the any from the value to + // an *slog.Source, it means the caller logged + // another attribute with a key of `source`. + // Prevent duplicate keys (necessary for proper + // JSON) by renaming the key to + // `logged_source`. + a.Key = reservedKeyPrefix + key + } + case slog.LevelKey: + if _, ok := a.Value.Any().(slog.Level); !ok { + // If we can't cast the any from the value to + // an slog.Level, it means the caller logged + // another attribute with a key of `level`. + // Prevent duplicate keys (necessary for proper + // JSON) by renaming the key to + // `logged_level`. + a.Key = reservedKeyPrefix + key + } default: } diff --git a/vendor/github.com/thanos-io/promql-engine/engine/engine.go b/vendor/github.com/thanos-io/promql-engine/engine/engine.go index f47d2dff353..c936215f19f 100644 --- a/vendor/github.com/thanos-io/promql-engine/engine/engine.go +++ b/vendor/github.com/thanos-io/promql-engine/engine/engine.go @@ -655,6 +655,10 @@ loop: }) } } + + if !q.resultSort.keepHistograms() { + vector = filterFloats(vector) + } sort.Slice(vector, q.resultSort.comparer(&vector)) if vector.ContainsSameLabelset() { return newErrResult(ret, extlabels.ErrDuplicateLabelSet) diff --git a/vendor/github.com/thanos-io/promql-engine/engine/sort.go b/vendor/github.com/thanos-io/promql-engine/engine/sort.go index 3529ffd3298..bb22a44b424 100644 --- a/vendor/github.com/thanos-io/promql-engine/engine/sort.go +++ b/vendor/github.com/thanos-io/promql-engine/engine/sort.go @@ -21,18 +21,27 @@ const ( type resultSorter interface { comparer(samples *promql.Vector) func(i, j int) bool + keepHistograms() bool } type sortFuncResultSort struct { sortOrder sortOrder } +func (s sortFuncResultSort) keepHistograms() bool { + return false +} + type sortByLabelFuncResult struct { sortingLabels []string sortOrder sortOrder } +func (s sortByLabelFuncResult) keepHistograms() bool { + return false +} + type aggregateResultSort struct { sortingLabels []string groupBy bool @@ -43,6 +52,14 @@ type aggregateResultSort struct { type noSortResultSort struct { } +func (a aggregateResultSort) keepHistograms() bool { + return true +} + +func (s noSortResultSort) keepHistograms() bool { + return true +} + func extractSortingLabels(f *parser.Call) []string { args := f.Args[1:] @@ -104,6 +121,17 @@ func valueCompare(order sortOrder, l, r float64) bool { return l > r } +// filterFloats filters out histogram samples from the vector in-place. +func filterFloats(v promql.Vector) promql.Vector { + floats := v[:0] + for _, s := range v { + if s.H == nil { + floats = append(floats, s) + } + } + return floats +} + func (s sortFuncResultSort) comparer(samples *promql.Vector) func(i, j int) bool { return func(i, j int) bool { return valueCompare(s.sortOrder, (*samples)[i].F, (*samples)[j].F) diff --git a/vendor/github.com/thanos-io/promql-engine/execution/aggregate/accumulator.go b/vendor/github.com/thanos-io/promql-engine/execution/aggregate/accumulator.go index e96f6f306ee..ffb4780bdab 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/aggregate/accumulator.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/aggregate/accumulator.go @@ -105,6 +105,9 @@ func (s *sumAcc) Add(ctx context.Context, v float64, h *histogram.FloatHistogram } func (s *sumAcc) Value() (float64, *histogram.FloatHistogram) { + if s.histSum != nil { + s.histSum.Compact(0) + } return s.value, s.histSum } @@ -451,6 +454,9 @@ func (a *avgAcc) AddVector(ctx context.Context, vs []float64, hs []*histogram.Fl } func (a *avgAcc) Value() (float64, *histogram.FloatHistogram) { + if a.histSum != nil { + a.histSum.Compact(0) + } if a.incremental { return a.avg + a.kahanC, a.histSum } diff --git a/vendor/github.com/thanos-io/promql-engine/execution/aggregate/count_values.go b/vendor/github.com/thanos-io/promql-engine/execution/aggregate/count_values.go index 8c9e121e063..609c55b4b73 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/aggregate/count_values.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/aggregate/count_values.go @@ -9,18 +9,17 @@ import ( "slices" "strconv" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" "github.com/thanos-io/promql-engine/query" + "github.com/efficientgo/core/errors" + prommodel "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/labels" ) type countValuesOperator struct { - telemetry.OperatorTelemetry - pool *model.VectorPool next model.VectorOperator param string @@ -51,9 +50,7 @@ func NewCountValues(pool *model.VectorPool, next model.VectorOperator, param str by: by, grouping: grouping, } - op.OperatorTelemetry = telemetry.NewTelemetry(op, opts) - - return op + return telemetry.NewOperator(telemetry.NewTelemetry(op, opts), op) } func (c *countValuesOperator) Explain() []model.VectorOperator { @@ -72,18 +69,12 @@ func (c *countValuesOperator) String() string { } func (c *countValuesOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { c.AddExecutionTimeTaken(time.Since(start)) }() - var err error c.once.Do(func() { err = c.initSeriesOnce(ctx) }) return c.series, err } func (c *countValuesOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { c.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() @@ -116,6 +107,10 @@ func (c *countValuesOperator) Next(ctx context.Context) ([]model.StepVector, err } func (c *countValuesOperator) initSeriesOnce(ctx context.Context) error { + if !prommodel.LabelName(c.param).IsValid() { + return errors.Newf("invalid label name %q", c.param) + } + nextSeries, err := c.next.Series(ctx) if err != nil { return err diff --git a/vendor/github.com/thanos-io/promql-engine/execution/aggregate/hashaggregate.go b/vendor/github.com/thanos-io/promql-engine/execution/aggregate/hashaggregate.go index 9155d771ee5..977944f514f 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/aggregate/hashaggregate.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/aggregate/hashaggregate.go @@ -8,7 +8,6 @@ import ( "fmt" "math" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/parse" @@ -25,8 +24,6 @@ import ( ) type aggregate struct { - telemetry.OperatorTelemetry - next model.VectorOperator paramOp model.VectorOperator // params holds the aggregate parameter for each step. @@ -74,9 +71,7 @@ func NewHashAggregate( stepsBatch: opts.StepsBatch, } - a.OperatorTelemetry = telemetry.NewTelemetry(a, opts) - - return a, nil + return telemetry.NewOperator(telemetry.NewTelemetry(a, opts), a), nil } func (a *aggregate) String() string { @@ -96,15 +91,11 @@ func (a *aggregate) Explain() (next []model.VectorOperator) { } func (a *aggregate) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { a.AddExecutionTimeTaken(time.Since(start)) }() - var err error a.once.Do(func() { err = a.initializeTables(ctx) }) if err != nil { return nil, err } - return a.series, nil } @@ -113,9 +104,6 @@ func (a *aggregate) GetPool() *model.VectorPool { } func (a *aggregate) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { a.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/aggregate/khashaggregate.go b/vendor/github.com/thanos-io/promql-engine/execution/aggregate/khashaggregate.go index e59c48e79a2..5c3120e4f57 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/aggregate/khashaggregate.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/aggregate/khashaggregate.go @@ -10,7 +10,6 @@ import ( "math" "sort" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -27,8 +26,6 @@ import ( ) type kAggregate struct { - telemetry.OperatorTelemetry - next model.VectorOperator paramOp model.VectorOperator // params holds the aggregate parameter for each step. @@ -84,15 +81,10 @@ func NewKHashAggregate( params: make([]float64, opts.StepsBatch), } - op.OperatorTelemetry = telemetry.NewTelemetry(op, opts) - - return op, nil + return telemetry.NewOperator(telemetry.NewTelemetry(op, opts), op), nil } func (a *kAggregate) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { a.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() @@ -174,15 +166,11 @@ func (a *kAggregate) Next(ctx context.Context) ([]model.StepVector, error) { } func (a *kAggregate) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { a.AddExecutionTimeTaken(time.Since(start)) }() - var err error a.once.Do(func() { err = a.init(ctx) }) if err != nil { return nil, err } - return a.series, nil } diff --git a/vendor/github.com/thanos-io/promql-engine/execution/binary/scalar.go b/vendor/github.com/thanos-io/promql-engine/execution/binary/scalar.go index 89a07a8784c..ab5a15feed8 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/binary/scalar.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/binary/scalar.go @@ -8,7 +8,6 @@ import ( "fmt" "math" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -29,8 +28,6 @@ const ( // scalarOperator evaluates expressions where one operand is a scalarOperator. type scalarOperator struct { - telemetry.OperatorTelemetry - seriesOnce sync.Once series []labels.Labels @@ -58,7 +55,7 @@ func NewScalar( scalarSide ScalarSide, returnBool bool, opts *query.Options, -) (*scalarOperator, error) { +) (model.VectorOperator, error) { binaryOperation, err := newOperation(op, scalarSide != ScalarSideBoth) if err != nil { return nil, err @@ -85,10 +82,7 @@ func NewScalar( bothScalars: scalarSide == ScalarSideBoth, } - oper.OperatorTelemetry = telemetry.NewTelemetry(op, opts) - - return oper, nil - + return telemetry.NewOperator(telemetry.NewTelemetry(op, opts), oper), nil } func (o *scalarOperator) Explain() (next []model.VectorOperator) { @@ -96,9 +90,6 @@ func (o *scalarOperator) Explain() (next []model.VectorOperator) { } func (o *scalarOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - var err error o.seriesOnce.Do(func() { err = o.loadSeries(ctx) }) if err != nil { @@ -112,9 +103,6 @@ func (o *scalarOperator) String() string { } func (o *scalarOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/binary/vector.go b/vendor/github.com/thanos-io/promql-engine/execution/binary/vector.go index aa0469794cc..813c3108d3d 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/binary/vector.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/binary/vector.go @@ -8,7 +8,6 @@ import ( "fmt" "math" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -58,8 +57,6 @@ type vectorOperator struct { // If true then 1/0 needs to be returned instead of the value. returnBool bool - - telemetry.OperatorTelemetry } func NewVectorOperator( @@ -81,9 +78,7 @@ func NewVectorOperator( sigFunc: signatureFunc(matching.On, matching.MatchingLabels...), } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - - return oper, nil + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper), nil } func (o *vectorOperator) String() string { @@ -98,9 +93,6 @@ func (o *vectorOperator) Explain() (next []model.VectorOperator) { } func (o *vectorOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - if err := o.initOnce(ctx); err != nil { return nil, err } @@ -108,9 +100,6 @@ func (o *vectorOperator) Series(ctx context.Context) ([]labels.Labels, error) { } func (o *vectorOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() @@ -308,13 +297,13 @@ func (o *vectorOperator) execBinaryUnless(lhs, rhs model.StepVector) (model.Step return step, nil } -func (o *vectorOperator) computeBinaryPairing(hval, lval float64, hlhs, hrhs *histogram.FloatHistogram, annos *annotations.Annotations) (float64, *histogram.FloatHistogram, bool, error) { +func (o *vectorOperator) computeBinaryPairing(ctx context.Context, hval, lval float64, hlhs, hrhs *histogram.FloatHistogram, annos *annotations.Annotations) (float64, *histogram.FloatHistogram, bool, error) { // operand is not commutative so we need to address potential swapping if o.matching.Card == parser.CardOneToMany { - v, h, keep, err := vectorElemBinop(o.opType, lval, hval, hlhs, hrhs, annos) + v, h, keep, err := vectorElemBinop(ctx, o.opType, lval, hval, hlhs, hrhs, annos) return v, h, keep, err } - v, h, keep, err := vectorElemBinop(o.opType, hval, lval, hlhs, hrhs, annos) + v, h, keep, err := vectorElemBinop(ctx, o.opType, hval, lval, hlhs, hrhs, annos) return v, h, keep, err } @@ -380,9 +369,9 @@ func (o *vectorOperator) execBinaryArithmetic(ctx context.Context, lhs, rhs mode jp.bts = ts if jp.histogramVal != nil { - _, h, keep, err = o.computeBinaryPairing(0, 0, hcs.Histograms[i], jp.histogramVal, &annos) + _, h, keep, err = o.computeBinaryPairing(ctx, 0, 0, hcs.Histograms[i], jp.histogramVal, &annos) } else { - _, h, keep, err = o.computeBinaryPairing(0, jp.val, hcs.Histograms[i], nil, &annos) + _, h, keep, err = o.computeBinaryPairing(ctx, 0, jp.val, hcs.Histograms[i], nil, &annos) } if countWarnings, countInfo := annos.CountWarningsAndInfo(); countWarnings > 0 || countInfo > 0 { warnings.MergeToContext(annos, ctx) @@ -423,7 +412,7 @@ func (o *vectorOperator) execBinaryArithmetic(ctx context.Context, lhs, rhs mode var val float64 if jp.histogramVal != nil { - _, h, _, err = o.computeBinaryPairing(hcs.Samples[i], 0, nil, jp.histogramVal, &annos) + _, h, _, err = o.computeBinaryPairing(ctx, hcs.Samples[i], 0, nil, jp.histogramVal, &annos) if countWarnings, countInfo := annos.CountWarningsAndInfo(); countWarnings > 0 || countInfo > 0 { warnings.MergeToContext(annos, ctx) continue @@ -433,7 +422,7 @@ func (o *vectorOperator) execBinaryArithmetic(ctx context.Context, lhs, rhs mode } step.AppendHistogram(o.pool, jp.sid, h) } else { - val, _, keep, err = o.computeBinaryPairing(hcs.Samples[i], jp.val, nil, nil, &annos) + val, _, keep, err = o.computeBinaryPairing(ctx, hcs.Samples[i], jp.val, nil, nil, &annos) if countWarnings, countInfo := annos.CountWarningsAndInfo(); countWarnings > 0 || countInfo > 0 { warnings.MergeToContext(annos, ctx) continue @@ -626,7 +615,7 @@ func signatureFunc(on bool, names ...string) func(labels.Labels) uint64 { // Lifted from: https://github.com/prometheus/prometheus/blob/v3.1.0/promql/engine.go#L2797. // nolint: unparam // vectorElemBinop evaluates a binary operation between two Vector elements. -func vectorElemBinop(op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram.FloatHistogram, annos *annotations.Annotations) (float64, *histogram.FloatHistogram, bool, error) { +func vectorElemBinop(ctx context.Context, op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram.FloatHistogram, annos *annotations.Annotations) (float64, *histogram.FloatHistogram, bool, error) { opName := parser.ItemTypeStr[op] switch { @@ -689,12 +678,26 @@ func vectorElemBinop(op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram case parser.ADD: res, err := hlhs.Copy().Add(hrhs) if err != nil { + if errors.Is(err, histogram.ErrHistogramsIncompatibleSchema) { + warnings.AddToContext(annotations.NewMixedExponentialCustomHistogramsWarning("", posrange.PositionRange{}), ctx) + return 0, nil, false, nil + } else if errors.Is(err, histogram.ErrHistogramsIncompatibleBounds) { + warnings.AddToContext(annotations.NewIncompatibleCustomBucketsHistogramsWarning("", posrange.PositionRange{}), ctx) + return 0, nil, false, nil + } return 0, nil, false, err } return 0, res.Compact(0), true, nil case parser.SUB: res, err := hlhs.Copy().Sub(hrhs) if err != nil { + if errors.Is(err, histogram.ErrHistogramsIncompatibleSchema) { + warnings.AddToContext(annotations.NewMixedExponentialCustomHistogramsWarning("", posrange.PositionRange{}), ctx) + return 0, nil, false, nil + } else if errors.Is(err, histogram.ErrHistogramsIncompatibleBounds) { + warnings.AddToContext(annotations.NewIncompatibleCustomBucketsHistogramsWarning("", posrange.PositionRange{}), ctx) + return 0, nil, false, nil + } return 0, nil, false, err } return 0, res.Compact(0), true, nil diff --git a/vendor/github.com/thanos-io/promql-engine/execution/exchange/coalesce.go b/vendor/github.com/thanos-io/promql-engine/execution/exchange/coalesce.go index 52671e03436..390cb9615a2 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/exchange/coalesce.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/exchange/coalesce.go @@ -8,7 +8,6 @@ import ( "math" "sync" "sync/atomic" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -35,8 +34,6 @@ func (c errorChan) getError() error { // coalesce guarantees that samples from different input vectors will be added to the output in the same order // as the input vectors themselves are provided in NewCoalesce. type coalesce struct { - telemetry.OperatorTelemetry - once sync.Once series []labels.Labels @@ -63,9 +60,7 @@ func NewCoalesce(pool *model.VectorPool, opts *query.Options, batchSize int64, o batchSize: batchSize, } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (c *coalesce) Explain() (next []model.VectorOperator) { @@ -81,9 +76,6 @@ func (c *coalesce) GetPool() *model.VectorPool { } func (c *coalesce) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { c.AddExecutionTimeTaken(time.Since(start)) }() - var err error c.once.Do(func() { err = c.loadSeries(ctx) }) if err != nil { @@ -93,9 +85,6 @@ func (c *coalesce) Series(ctx context.Context) ([]labels.Labels, error) { } func (c *coalesce) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { c.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/exchange/concurrent.go b/vendor/github.com/thanos-io/promql-engine/execution/exchange/concurrent.go index acf4d34e9e9..78ea488cbc8 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/exchange/concurrent.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/exchange/concurrent.go @@ -7,7 +7,6 @@ import ( "context" "fmt" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -26,7 +25,6 @@ type concurrencyOperator struct { next model.VectorOperator buffer chan maybeStepVector bufferSize int - telemetry.OperatorTelemetry } func NewConcurrent(next model.VectorOperator, bufferSize int, opts *query.Options) model.VectorOperator { @@ -36,8 +34,7 @@ func NewConcurrent(next model.VectorOperator, bufferSize int, opts *query.Option bufferSize: bufferSize, } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (c *concurrencyOperator) Explain() (next []model.VectorOperator) { @@ -49,10 +46,11 @@ func (c *concurrencyOperator) String() string { } func (c *concurrencyOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { c.AddExecutionTimeTaken(time.Since(start)) }() - - return c.next.Series(ctx) + series, err := c.next.Series(ctx) + if err != nil { + return nil, err + } + return series, nil } func (c *concurrencyOperator) GetPool() *model.VectorPool { @@ -60,9 +58,6 @@ func (c *concurrencyOperator) GetPool() *model.VectorPool { } func (c *concurrencyOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { c.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/exchange/dedup.go b/vendor/github.com/thanos-io/promql-engine/execution/exchange/dedup.go index 517ad93fe93..95c8d0e31c6 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/exchange/dedup.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/exchange/dedup.go @@ -6,7 +6,6 @@ package exchange import ( "context" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -32,8 +31,6 @@ type dedupCache []dedupSample // if multiple samples with the same ID are present in a StepVector, dedupOperator // will keep the last sample in that vector. type dedupOperator struct { - telemetry.OperatorTelemetry - once sync.Once series []labels.Labels @@ -49,15 +46,10 @@ func NewDedupOperator(pool *model.VectorPool, next model.VectorOperator, opts *q next: next, pool: pool, } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (d *dedupOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { d.AddExecutionTimeTaken(time.Since(start)) }() - var err error d.once.Do(func() { err = d.loadSeries(ctx) }) if err != nil { @@ -107,9 +99,6 @@ func (d *dedupOperator) Next(ctx context.Context) ([]model.StepVector, error) { } func (d *dedupOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { d.AddExecutionTimeTaken(time.Since(start)) }() - var err error d.once.Do(func() { err = d.loadSeries(ctx) }) if err != nil { diff --git a/vendor/github.com/thanos-io/promql-engine/execution/exchange/duplicate_label.go b/vendor/github.com/thanos-io/promql-engine/execution/exchange/duplicate_label.go index ae1d69e1ff2..c6599067fba 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/exchange/duplicate_label.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/exchange/duplicate_label.go @@ -6,7 +6,6 @@ package exchange import ( "context" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -19,8 +18,6 @@ import ( type pair struct{ a, b int } type duplicateLabelCheckOperator struct { - telemetry.OperatorTelemetry - once sync.Once next model.VectorOperator @@ -32,15 +29,10 @@ func NewDuplicateLabelCheck(next model.VectorOperator, opts *query.Options) mode oper := &duplicateLabelCheckOperator{ next: next, } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (d *duplicateLabelCheckOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { d.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() @@ -84,13 +76,14 @@ func (d *duplicateLabelCheckOperator) Next(ctx context.Context) ([]model.StepVec } func (d *duplicateLabelCheckOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { d.AddExecutionTimeTaken(time.Since(start)) }() - if err := d.init(ctx); err != nil { return nil, err } - return d.next.Series(ctx) + series, err := d.next.Series(ctx) + if err != nil { + return nil, err + } + return series, nil } func (d *duplicateLabelCheckOperator) GetPool() *model.VectorPool { diff --git a/vendor/github.com/thanos-io/promql-engine/execution/function/absent.go b/vendor/github.com/thanos-io/promql-engine/execution/function/absent.go index 8be1cc031e9..e605ab62cf3 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/function/absent.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/function/absent.go @@ -6,7 +6,6 @@ package function import ( "context" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -17,8 +16,6 @@ import ( ) type absentOperator struct { - telemetry.OperatorTelemetry - once sync.Once funcExpr *logicalplan.FunctionCall series []labels.Labels @@ -31,15 +28,13 @@ func newAbsentOperator( pool *model.VectorPool, next model.VectorOperator, opts *query.Options, -) *absentOperator { +) model.VectorOperator { oper := &absentOperator{ funcExpr: funcExpr, pool: pool, next: next, } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (o *absentOperator) String() string { @@ -51,9 +46,6 @@ func (o *absentOperator) Explain() (next []model.VectorOperator) { } func (o *absentOperator) Series(_ context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - o.loadSeries() return o.series, nil } @@ -98,9 +90,6 @@ func (o *absentOperator) GetPool() *model.VectorPool { } func (o *absentOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/function/histogram.go b/vendor/github.com/thanos-io/promql-engine/execution/function/histogram.go index f878e4c148c..050159f2aa8 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/function/histogram.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/function/histogram.go @@ -9,7 +9,6 @@ import ( "math" "strconv" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -33,7 +32,6 @@ type histogramSeries struct { // histogramOperator is a function operator that calculates percentiles. type histogramOperator struct { - telemetry.OperatorTelemetry once sync.Once series []labels.Labels @@ -60,7 +58,7 @@ func newHistogramOperator( scalarOp model.VectorOperator, vectorOp model.VectorOperator, opts *query.Options, -) *histogramOperator { +) model.VectorOperator { oper := &histogramOperator{ pool: pool, funcArgs: funcArgs, @@ -68,9 +66,7 @@ func newHistogramOperator( vectorOp: vectorOp, scalarPoints: make([]float64, opts.StepsBatch), } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (o *histogramOperator) String() string { @@ -82,15 +78,11 @@ func (o *histogramOperator) Explain() (next []model.VectorOperator) { } func (o *histogramOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - var err error o.once.Do(func() { err = o.loadSeries(ctx) }) if err != nil { return nil, err } - return o.series, nil } @@ -99,9 +91,6 @@ func (o *histogramOperator) GetPool() *model.VectorPool { } func (o *histogramOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/function/noarg.go b/vendor/github.com/thanos-io/promql-engine/execution/function/noarg.go index 9d841280861..c07a752ca73 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/function/noarg.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/function/noarg.go @@ -5,18 +5,14 @@ package function import ( "context" - "time" "github.com/thanos-io/promql-engine/execution/model" - "github.com/thanos-io/promql-engine/execution/telemetry" "github.com/thanos-io/promql-engine/logicalplan" "github.com/prometheus/prometheus/model/labels" ) type noArgFunctionOperator struct { - telemetry.OperatorTelemetry - mint int64 maxt int64 step int64 @@ -38,9 +34,6 @@ func (o *noArgFunctionOperator) String() string { } func (o *noArgFunctionOperator) Series(_ context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - return o.series, nil } @@ -49,9 +42,6 @@ func (o *noArgFunctionOperator) GetPool() *model.VectorPool { } func (o *noArgFunctionOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/function/operator.go b/vendor/github.com/thanos-io/promql-engine/execution/function/operator.go index c740a0fbf02..885567792cf 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/function/operator.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/function/operator.go @@ -8,7 +8,6 @@ import ( "fmt" "math" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/parse" @@ -67,7 +66,6 @@ func newNoArgsFunctionOperator(funcExpr *logicalplan.FunctionCall, stepsBatch in call: call, vectorPool: model.NewVectorPool(stepsBatch), } - op.OperatorTelemetry = telemetry.NewTelemetry(op, opts) switch funcExpr.Func.Name { case "pi", "time": @@ -78,13 +76,11 @@ func newNoArgsFunctionOperator(funcExpr *logicalplan.FunctionCall, stepsBatch in op.sampleIDs = []uint64{0} } - return op, nil + return telemetry.NewOperator(telemetry.NewTelemetry(op, opts), op), nil } // functionOperator returns []model.StepVector after processing input with desired function. type functionOperator struct { - telemetry.OperatorTelemetry - funcExpr *logicalplan.FunctionCall series []labels.Labels once sync.Once @@ -113,7 +109,6 @@ func newInstantVectorFunctionOperator(funcExpr *logicalplan.FunctionCall, nextOp vectorIndex: 0, scalarPoints: scalarPoints, } - f.OperatorTelemetry = telemetry.NewTelemetry(f, opts) for i := range funcExpr.Args { if funcExpr.Args[i].ReturnType() == parser.ValueTypeVector { @@ -125,7 +120,7 @@ func newInstantVectorFunctionOperator(funcExpr *logicalplan.FunctionCall, nextOp // Check selector type. switch funcExpr.Args[f.vectorIndex].ReturnType() { case parser.ValueTypeVector, parser.ValueTypeScalar: - return f, nil + return telemetry.NewOperator(telemetry.NewTelemetry(f, opts), f), nil default: return nil, errors.Wrapf(parse.ErrNotImplemented, "got %s:", funcExpr.String()) } @@ -140,13 +135,9 @@ func (o *functionOperator) String() string { } func (o *functionOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - if err := o.loadSeries(ctx); err != nil { return nil, err } - return o.series, nil } @@ -155,9 +146,6 @@ func (o *functionOperator) GetPool() *model.VectorPool { } func (o *functionOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/function/relabel.go b/vendor/github.com/thanos-io/promql-engine/execution/function/relabel.go index 81f24ffeabb..383b89c72a0 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/function/relabel.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/function/relabel.go @@ -8,7 +8,6 @@ import ( "regexp" "strings" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -21,8 +20,6 @@ import ( ) type relabelOperator struct { - telemetry.OperatorTelemetry - next model.VectorOperator funcExpr *logicalplan.FunctionCall once sync.Once @@ -33,14 +30,12 @@ func newRelabelOperator( next model.VectorOperator, funcExpr *logicalplan.FunctionCall, opts *query.Options, -) *relabelOperator { +) model.VectorOperator { oper := &relabelOperator{ next: next, funcExpr: funcExpr, } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (o *relabelOperator) String() string { @@ -52,9 +47,6 @@ func (o *relabelOperator) Explain() (next []model.VectorOperator) { } func (o *relabelOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - var err error o.once.Do(func() { err = o.loadSeries(ctx) }) return o.series, err @@ -65,9 +57,6 @@ func (o *relabelOperator) GetPool() *model.VectorPool { } func (o *relabelOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - return o.next.Next(ctx) } diff --git a/vendor/github.com/thanos-io/promql-engine/execution/function/scalar.go b/vendor/github.com/thanos-io/promql-engine/execution/function/scalar.go index 17aaadc33f6..97e56be9a4d 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/function/scalar.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/function/scalar.go @@ -6,7 +6,6 @@ package function import ( "context" "math" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -18,17 +17,15 @@ import ( type scalarOperator struct { pool *model.VectorPool next model.VectorOperator - telemetry.OperatorTelemetry } -func newScalarOperator(pool *model.VectorPool, next model.VectorOperator, opts *query.Options) *scalarOperator { +func newScalarOperator(pool *model.VectorPool, next model.VectorOperator, opts *query.Options) model.VectorOperator { oper := &scalarOperator{ pool: pool, next: next, } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (o *scalarOperator) String() string { @@ -40,9 +37,6 @@ func (o *scalarOperator) Explain() (next []model.VectorOperator) { } func (o *scalarOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - return nil, nil } @@ -51,9 +45,6 @@ func (o *scalarOperator) GetPool() *model.VectorPool { } func (o *scalarOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/function/timestamp.go b/vendor/github.com/thanos-io/promql-engine/execution/function/timestamp.go index 0926d87443d..2b80b85aa4c 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/function/timestamp.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/function/timestamp.go @@ -6,7 +6,6 @@ package function import ( "context" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -18,19 +17,16 @@ import ( type timestampOperator struct { next model.VectorOperator - telemetry.OperatorTelemetry series []labels.Labels once sync.Once } -func newTimestampOperator(next model.VectorOperator, opts *query.Options) *timestampOperator { +func newTimestampOperator(next model.VectorOperator, opts *query.Options) model.VectorOperator { oper := ×tampOperator{ next: next, } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (o *timestampOperator) Explain() (next []model.VectorOperator) { @@ -38,9 +34,6 @@ func (o *timestampOperator) Explain() (next []model.VectorOperator) { } func (o *timestampOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - if err := o.loadSeries(ctx); err != nil { return nil, err } @@ -76,9 +69,6 @@ func (o *timestampOperator) GetPool() *model.VectorPool { } func (o *timestampOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/remote/operator.go b/vendor/github.com/thanos-io/promql-engine/execution/remote/operator.go index b3726ae7e14..081046a5478 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/remote/operator.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/remote/operator.go @@ -30,10 +30,9 @@ type Execution struct { queryRangeEnd time.Time vectorSelector model.VectorOperator - telemetry.OperatorTelemetry } -func NewExecution(query promql.Query, pool *model.VectorPool, queryRangeStart, queryRangeEnd time.Time, engineLabels []labels.Labels, opts *query.Options, _ storage.SelectHints) *Execution { +func NewExecution(query promql.Query, pool *model.VectorPool, queryRangeStart, queryRangeEnd time.Time, engineLabels []labels.Labels, opts *query.Options, _ storage.SelectHints) model.VectorOperator { storage := newStorageFromQuery(query, opts, engineLabels) oper := &Execution{ storage: storage, @@ -44,18 +43,15 @@ func NewExecution(query promql.Query, pool *model.VectorPool, queryRangeStart, q vectorSelector: promstorage.NewVectorSelector(pool, storage, opts, 0, 0, false, 0, 1), } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (e *Execution) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { - e.AddExecutionTimeTaken(time.Since(start)) - }() - - return e.vectorSelector.Series(ctx) + series, err := e.vectorSelector.Series(ctx) + if err != nil { + return nil, err + } + return series, nil } func (e *Execution) String() string { @@ -63,9 +59,6 @@ func (e *Execution) String() string { } func (e *Execution) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { e.AddExecutionTimeTaken(time.Since(start)) }() - next, err := e.vectorSelector.Next(ctx) if next == nil { // Closing the storage prematurely can lead to results from the query diff --git a/vendor/github.com/thanos-io/promql-engine/execution/scan/literal_selector.go b/vendor/github.com/thanos-io/promql-engine/execution/scan/literal_selector.go index 4f8cc8c347e..f3387dc8797 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/scan/literal_selector.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/scan/literal_selector.go @@ -7,7 +7,6 @@ import ( "context" "fmt" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -29,10 +28,9 @@ type numberLiteralSelector struct { once sync.Once val float64 - telemetry.OperatorTelemetry } -func NewNumberLiteralSelector(pool *model.VectorPool, opts *query.Options, val float64) *numberLiteralSelector { +func NewNumberLiteralSelector(pool *model.VectorPool, opts *query.Options, val float64) model.VectorOperator { oper := &numberLiteralSelector{ vectorPool: pool, numSteps: opts.NumSteps(), @@ -43,8 +41,7 @@ func NewNumberLiteralSelector(pool *model.VectorPool, opts *query.Options, val f val: val, } - oper.OperatorTelemetry = telemetry.NewTelemetry(oper, opts) - return oper + return telemetry.NewOperator(telemetry.NewTelemetry(oper, opts), oper) } func (o *numberLiteralSelector) Explain() (next []model.VectorOperator) { @@ -56,9 +53,6 @@ func (o *numberLiteralSelector) String() string { } func (o *numberLiteralSelector) Series(context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - o.loadSeries() return o.series, nil } @@ -68,9 +62,6 @@ func (o *numberLiteralSelector) GetPool() *model.VectorPool { } func (o *numberLiteralSelector) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/scan/subquery.go b/vendor/github.com/thanos-io/promql-engine/execution/scan/subquery.go index e9870ed5a9e..eca1122c8a3 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/scan/subquery.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/scan/subquery.go @@ -8,7 +8,6 @@ import ( "fmt" "math" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -21,7 +20,7 @@ import ( ) type subqueryOperator struct { - telemetry.OperatorTelemetry + telemetry telemetry.OperatorTelemetry next model.VectorOperator paramOp model.VectorOperator @@ -81,9 +80,8 @@ func NewSubqueryOperator(pool *model.VectorPool, next, paramOp, paramOp2 model.V params: make([]float64, opts.StepsBatch), params2: make([]float64, opts.StepsBatch), } - o.OperatorTelemetry = telemetry.NewSubqueryTelemetry(o, opts) - - return o, nil + o.telemetry = telemetry.NewSubqueryTelemetry(o, opts) + return telemetry.NewOperator(o.telemetry, o), nil } func (o *subqueryOperator) String() string { @@ -104,9 +102,6 @@ func (o *subqueryOperator) Explain() (next []model.VectorOperator) { func (o *subqueryOperator) GetPool() *model.VectorPool { return o.pool } func (o *subqueryOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.OperatorTelemetry.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() @@ -204,12 +199,12 @@ func (o *subqueryOperator) Next(ctx context.Context) ([]model.StepVector, error) sv.AppendSample(o.pool, uint64(sampleId), f) } } - o.IncrementSamplesAtTimestamp(rangeSamples.Len(), sv.T) + o.telemetry.IncrementSamplesAtTimestamp(rangeSamples.SampleCount(), sv.T) } res = append(res, sv) - o.currentStep += o.step } + return res, nil } @@ -236,9 +231,6 @@ func (o *subqueryOperator) collect(v model.StepVector, mint int64) { } func (o *subqueryOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.OperatorTelemetry.AddExecutionTimeTaken(time.Since(start)) }() - if err := o.initSeries(ctx); err != nil { return nil, err } @@ -257,7 +249,7 @@ func (o *subqueryOperator) initSeries(ctx context.Context) error { o.series = make([]labels.Labels, len(series)) o.buffers = make([]*ringbuffer.GenericRingBuffer, len(series)) for i := range o.buffers { - o.buffers[i] = ringbuffer.New(ctx, 8, o.subQuery.Range.Milliseconds(), o.subQuery.Offset.Milliseconds(), o.call) + o.buffers[i] = ringbuffer.New(ctx, 8, o.subQuery.Range.Milliseconds(), o.subQuery.Offset.Milliseconds(), o.call, true) } var b labels.ScratchBuilder for i, s := range series { diff --git a/vendor/github.com/thanos-io/promql-engine/execution/step_invariant/step_invariant.go b/vendor/github.com/thanos-io/promql-engine/execution/step_invariant/step_invariant.go index b85406e45ac..6a1c78f3245 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/step_invariant/step_invariant.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/step_invariant/step_invariant.go @@ -6,7 +6,6 @@ package step_invariant import ( "context" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -32,7 +31,6 @@ type stepInvariantOperator struct { step int64 currentStep int64 stepsBatch int - telemetry.OperatorTelemetry } func (u *stepInvariantOperator) Explain() (next []model.VectorOperator) { @@ -60,7 +58,6 @@ func NewStepInvariantOperator( stepsBatch: opts.StepsBatch, cacheResult: true, } - u.OperatorTelemetry = telemetry.NewStepInvariantTelemetry(u, opts) if u.step == 0 { u.step = 1 } @@ -71,13 +68,10 @@ func NewStepInvariantOperator( u.cacheResult = false } - return u, nil + return telemetry.NewOperator(telemetry.NewStepInvariantTelemetry(u, opts), u), nil } func (u *stepInvariantOperator) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { u.AddExecutionTimeTaken(time.Since(start)) }() - var err error u.seriesOnce.Do(func() { u.series, err = u.next.Series(ctx) @@ -94,9 +88,6 @@ func (u *stepInvariantOperator) GetPool() *model.VectorPool { } func (u *stepInvariantOperator) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { u.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/execution/telemetry/telemetry.go b/vendor/github.com/thanos-io/promql-engine/execution/telemetry/telemetry.go index 19bdb2dc049..69966989a90 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/telemetry/telemetry.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/telemetry/telemetry.go @@ -4,6 +4,7 @@ package telemetry import ( + "context" "fmt" "time" @@ -11,14 +12,21 @@ import ( "github.com/thanos-io/promql-engine/logicalplan" "github.com/thanos-io/promql-engine/query" + "github.com/prometheus/prometheus/model/histogram" + "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/util/stats" ) type OperatorTelemetry interface { fmt.Stringer - AddExecutionTimeTaken(time.Duration) + MaxSeriesCount() int + SetMaxSeriesCount(count int) ExecutionTimeTaken() time.Duration + AddSeriesExecutionTime(time.Duration) + SeriesExecutionTime() time.Duration + AddNextExecutionTime(time.Duration) + NextExecutionTime() time.Duration IncrementSamplesAtTimestamp(samples int, t int64) Samples() *stats.QuerySamples LogicalNode() logicalplan.Node @@ -59,10 +67,26 @@ func (tm *NoopTelemetry) ExecutionTimeTaken() time.Duration { return time.Duration(0) } +func (tm *NoopTelemetry) AddSeriesExecutionTime(t time.Duration) {} + +func (tm *NoopTelemetry) SeriesExecutionTime() time.Duration { + return time.Duration(0) +} + +func (tm *NoopTelemetry) AddNextExecutionTime(t time.Duration) {} + +func (tm *NoopTelemetry) NextExecutionTime() time.Duration { + return time.Duration(0) +} + func (tm *NoopTelemetry) IncrementSamplesAtTimestamp(_ int, _ int64) {} func (tm *NoopTelemetry) Samples() *stats.QuerySamples { return nil } +func (tm *NoopTelemetry) MaxSeriesCount() int { return 0 } + +func (tm *NoopTelemetry) SetMaxSeriesCount(_ int) {} + func (tm *NoopTelemetry) LogicalNode() logicalplan.Node { return nil } @@ -70,7 +94,10 @@ func (tm *NoopTelemetry) LogicalNode() logicalplan.Node { type TrackedTelemetry struct { fmt.Stringer + Series int ExecutionTime time.Duration + SeriesTime time.Duration + NextTime time.Duration LoadedSamples *stats.QuerySamples logicalNode logicalplan.Node } @@ -98,6 +125,24 @@ func (ti *TrackedTelemetry) ExecutionTimeTaken() time.Duration { return ti.ExecutionTime } +func (ti *TrackedTelemetry) AddSeriesExecutionTime(t time.Duration) { + ti.SeriesTime += t + ti.ExecutionTime += t +} + +func (ti *TrackedTelemetry) SeriesExecutionTime() time.Duration { + return ti.SeriesTime +} + +func (ti *TrackedTelemetry) AddNextExecutionTime(t time.Duration) { + ti.NextTime += t + ti.ExecutionTime += t +} + +func (ti *TrackedTelemetry) NextExecutionTime() time.Duration { + return ti.NextTime +} + func (ti *TrackedTelemetry) IncrementSamplesAtTimestamp(samples int, t int64) { ti.updatePeak(samples) ti.LoadedSamples.IncrementSamplesAtTimestamp(t, int64(samples)) @@ -113,7 +158,63 @@ func (ti *TrackedTelemetry) updatePeak(samples int) { func (ti *TrackedTelemetry) Samples() *stats.QuerySamples { return ti.LoadedSamples } +func (ti *TrackedTelemetry) MaxSeriesCount() int { return ti.Series } + +func (ti *TrackedTelemetry) SetMaxSeriesCount(count int) { ti.Series = count } + type ObservableVectorOperator interface { model.VectorOperator OperatorTelemetry } + +// CalculateHistogramSampleCount returns the size of the FloatHistogram compared to the size of a Float. +// The total size is calculated considering the histogram timestamp (p.T - 8 bytes), +// and then a number of bytes in the histogram. +// This sum is divided by 16, as samples are 16 bytes. +// See: https://github.com/prometheus/prometheus/blob/2bf6f4c9dcbb1ad2e8fef70c6a48d8fc44a7f57c/promql/value.go#L178 +func CalculateHistogramSampleCount(h *histogram.FloatHistogram) int { + return (h.Size() + 8) / 16 +} + +func NewOperator(telemetry OperatorTelemetry, inner model.VectorOperator) model.VectorOperator { + op := &Operator{ + inner: inner, + } + op.OperatorTelemetry = telemetry + return op +} + +// Operator wraps other inner operator to track its telemetry. +type Operator struct { + OperatorTelemetry + inner model.VectorOperator +} + +func (t *Operator) Series(ctx context.Context) ([]labels.Labels, error) { + start := time.Now() + defer func() { t.OperatorTelemetry.AddSeriesExecutionTime(time.Since(start)) }() + s, err := t.inner.Series(ctx) + if err != nil { + return nil, err + } + t.OperatorTelemetry.SetMaxSeriesCount(len(s)) + return s, err +} + +func (t *Operator) Next(ctx context.Context) ([]model.StepVector, error) { + start := time.Now() + defer func() { t.OperatorTelemetry.AddNextExecutionTime(time.Since(start)) }() + return t.inner.Next(ctx) +} + +func (t *Operator) GetPool() *model.VectorPool { + return t.inner.GetPool() +} + +func (t *Operator) Explain() []model.VectorOperator { + return t.inner.Explain() +} + +func (t *Operator) String() string { + return t.inner.String() +} diff --git a/vendor/github.com/thanos-io/promql-engine/execution/unary/unary.go b/vendor/github.com/thanos-io/promql-engine/execution/unary/unary.go index a521baf7a90..30517731084 100644 --- a/vendor/github.com/thanos-io/promql-engine/execution/unary/unary.go +++ b/vendor/github.com/thanos-io/promql-engine/execution/unary/unary.go @@ -6,7 +6,6 @@ package unary import ( "context" "sync" - "time" "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" @@ -22,16 +21,13 @@ type unaryNegation struct { once sync.Once series []labels.Labels - telemetry.OperatorTelemetry } func NewUnaryNegation(next model.VectorOperator, opts *query.Options) (model.VectorOperator, error) { u := &unaryNegation{ next: next, } - u.OperatorTelemetry = telemetry.NewTelemetry(u, opts) - - return u, nil + return telemetry.NewOperator(telemetry.NewTelemetry(u, opts), u), nil } func (u *unaryNegation) Explain() (next []model.VectorOperator) { @@ -43,9 +39,6 @@ func (u *unaryNegation) String() string { } func (u *unaryNegation) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { u.AddExecutionTimeTaken(time.Since(start)) }() - if err := u.loadSeries(ctx); err != nil { return nil, err } @@ -74,9 +67,6 @@ func (u *unaryNegation) GetPool() *model.VectorPool { } func (u *unaryNegation) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { u.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() diff --git a/vendor/github.com/thanos-io/promql-engine/ringbuffer/functions.go b/vendor/github.com/thanos-io/promql-engine/ringbuffer/functions.go index 5ca1d396a14..8b60c23f25d 100644 --- a/vendor/github.com/thanos-io/promql-engine/ringbuffer/functions.go +++ b/vendor/github.com/thanos-io/promql-engine/ringbuffer/functions.go @@ -14,6 +14,7 @@ import ( "github.com/efficientgo/core/errors" "github.com/prometheus/prometheus/model/histogram" + "github.com/prometheus/prometheus/promql/parser/posrange" "github.com/prometheus/prometheus/util/annotations" "gonum.org/v1/gonum/stat" ) @@ -35,30 +36,127 @@ type FunctionArgs struct { type FunctionCall func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) -func instantValue(samples []Sample, isRate bool) (float64, bool) { - lastSample := samples[len(samples)-1] - previousSample := samples[len(samples)-2] +func instantValue(ctx context.Context, samples []Sample, isRate bool) (float64, *histogram.FloatHistogram, bool) { + var ( + ss = make([]Sample, 0, 2) + ) - var resultValue float64 - if isRate && lastSample.V.F < previousSample.V.F { - // Counter reset. - resultValue = lastSample.V.F - } else { - resultValue = lastSample.V.F - previousSample.V.F + if len(samples) < 2 { + return 0, nil, false } - sampledInterval := lastSample.T - previousSample.T + for i := 0; i < len(samples); i++ { + if samples[i].V.H != nil { + continue + } + if len(ss) == 2 { + ss[0] = ss[1] + ss[1] = samples[i] + continue + } + ss = append(ss, samples[i]) + } + + histSeen := 0 + for i := len(samples) - 1; i >= 0 && histSeen < 2; i-- { + if samples[i].V.H == nil { + continue + } + s := samples[i] + switch { + case len(ss) == 0: + ss = append(ss, s) + case len(ss) == 1: + if s.T < ss[0].T { + ss = append([]Sample{s}, ss...) + } else { + ss = append(ss, s) + } + case s.T < ss[0].T: + // s is older than 1st, so discard it. + case s.T > ss[1].T: + // s is newest, so add it as 2nd and make the old 2nd the new 1st. + ss[0] = ss[1] + ss[1] = s + default: + // In all other cases, we just make s the new 1st. + // This establishes a correct order, even in the (irregular) + // case of equal timestamps. + ss[0] = s + } + + histSeen++ + } + + sampledInterval := ss[1].T - ss[0].T if sampledInterval == 0 { // Avoid dividing by 0. - return 0, false + return 0, nil, false + } + + resultSample := ss[1] + switch { + case ss[1].V.H == nil && ss[0].V.H == nil: + if !isRate || !(ss[1].V.F < ss[0].V.F) { + // Gauge, or counter without reset, or counter with NaN value. + resultSample.V.F = ss[1].V.F - ss[0].V.F + } + + // In case of a counter reset, we leave resultSample at + // its current value, which is already ss[1]. + case ss[1].V.H != nil && ss[0].V.H != nil: + resultSample.V.H = ss[1].V.H.Copy() + // irate should only be applied to counters. + if isRate && (ss[1].V.H.CounterResetHint == histogram.GaugeType || ss[0].V.H.CounterResetHint == histogram.GaugeType) { + warnings.AddToContext(annotations.NewNativeHistogramNotCounterWarning("", posrange.PositionRange{}), ctx) + } + // idelta should only be applied to gauges. + if !isRate && (ss[1].V.H.CounterResetHint != histogram.GaugeType || ss[0].V.H.CounterResetHint != histogram.GaugeType) { + warnings.AddToContext(annotations.NewNativeHistogramNotGaugeWarning("", posrange.PositionRange{}), ctx) + } + + if !isRate || !ss[1].V.H.DetectReset(ss[0].V.H) { + _, err := resultSample.V.H.Sub(ss[0].V.H) + if errors.Is(err, histogram.ErrHistogramsIncompatibleSchema) { + warnings.AddToContext(annotations.NewMixedExponentialCustomHistogramsWarning("", posrange.PositionRange{}), ctx) + return 0, nil, false + } else if errors.Is(err, histogram.ErrHistogramsIncompatibleBounds) { + warnings.AddToContext(annotations.NewIncompatibleCustomBucketsHistogramsWarning("", posrange.PositionRange{}), ctx) + return 0, nil, false + } + } + + resultSample.V.H.CounterResetHint = histogram.GaugeType + resultSample.V.H.Compact(0) + default: + // Mix of a float and a histogram. + warnings.AddToContext(annotations.NewMixedFloatsHistogramsWarning("", posrange.PositionRange{}), ctx) + + return 0, nil, false } if isRate { // Convert to per-second. - resultValue /= float64(sampledInterval) / 1000 + if resultSample.V.H == nil { + resultSample.V.F /= float64(sampledInterval) / 1000 + } else { + resultSample.V.H.Div(float64(sampledInterval) / 1000) + } } - return resultValue, true + return resultSample.V.F, resultSample.V.H, true +} + +func handleHistogramErr(ctx context.Context, err error) error { + if errors.Is(err, histogram.ErrHistogramsIncompatibleSchema) { + warnings.AddToContext(annotations.NewMixedExponentialCustomHistogramsWarning("", posrange.PositionRange{}), ctx) + return nil + } else if errors.Is(err, histogram.ErrHistogramsIncompatibleBounds) { + warnings.AddToContext(annotations.NewIncompatibleCustomBucketsHistogramsWarning("", posrange.PositionRange{}), ctx) + return nil + } + + return err } var rangeVectorFuncs = map[string]FunctionCall{ @@ -66,6 +164,17 @@ var rangeVectorFuncs = map[string]FunctionCall{ if len(f.Samples) == 0 { return 0., nil, false, nil } + + var fd, hd bool + for _, s := range f.Samples { + hd = hd || s.V.H != nil + fd = fd || s.V.H == nil + } + if fd && hd { + warnings.AddToContext(annotations.NewMixedFloatsHistogramsWarning("", posrange.PositionRange{}), f.ctx) + return 0, nil, false, nil + } + if f.Samples[0].V.H != nil { // histogram sum := f.Samples[0].V.H.Copy() @@ -73,36 +182,51 @@ var rangeVectorFuncs = map[string]FunctionCall{ h := sample.V.H _, err := sum.Add(h) if err != nil { - return 0, sum, true, err + if err := handleHistogramErr(f.ctx, err); err != nil { + return 0, nil, false, err + } + return 0, nil, false, nil } } return 0, sum, true, nil } - return sumOverTime(f.Samples), nil, true, nil + return sumOverTime(f.ctx, f.Samples), nil, true, nil }, "mad_over_time": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { if len(f.Samples) == 0 { return 0., nil, false, nil } - return madOverTime(f.Samples), nil, true, nil + val, ok := madOverTime(f.ctx, f.Samples) + return val, nil, ok, nil }, "max_over_time": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { if len(f.Samples) == 0 { return 0., nil, false, nil } - return maxOverTime(f.Samples), nil, true, nil + v, ok := maxOverTime(f.ctx, f.Samples) + return v, nil, ok, nil }, "min_over_time": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { if len(f.Samples) == 0 { return 0., nil, false, nil } - return minOverTime(f.Samples), nil, true, nil + v, ok := minOverTime(f.ctx, f.Samples) + return v, nil, ok, nil }, "avg_over_time": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { if len(f.Samples) == 0 { return 0., nil, false, nil } + var fd, hd bool + for _, s := range f.Samples { + hd = hd || s.V.H != nil + fd = fd || s.V.H == nil + } + if fd && hd { + warnings.AddToContext(annotations.NewMixedFloatsHistogramsWarning("", posrange.PositionRange{}), f.ctx) + return 0, nil, false, nil + } if f.Samples[0].V.H != nil { // histogram count := 1 @@ -113,11 +237,17 @@ var rangeVectorFuncs = map[string]FunctionCall{ right := mean.Copy().Div(float64(count)) toAdd, err := left.Sub(right) if err != nil { - return 0, mean, true, err + if err := handleHistogramErr(f.ctx, err); err != nil { + return 0, nil, false, err + } + return 0, mean, false, nil } _, err = mean.Add(toAdd) if err != nil { - return 0, mean, true, err + if err := handleHistogramErr(f.ctx, err); err != nil { + return 0, nil, false, err + } + return 0, mean, false, nil } } return 0, mean, true, nil @@ -129,13 +259,15 @@ var rangeVectorFuncs = map[string]FunctionCall{ if len(f.Samples) == 0 { return 0., nil, false, nil } - return stddevOverTime(f.Samples), nil, true, nil + v, ok := stddevOverTime(f.ctx, f.Samples) + return v, nil, ok, nil }, "stdvar_over_time": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { if len(f.Samples) == 0 { return 0., nil, false, nil } - return stdvarOverTime(f.Samples), nil, true, nil + v, ok := stdvarOverTime(f.ctx, f.Samples) + return v, nil, ok, nil }, "count_over_time": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { if len(f.Samples) == 0 { @@ -147,10 +279,27 @@ var rangeVectorFuncs = map[string]FunctionCall{ if len(f.Samples) == 0 { return 0., nil, false, nil } - if f.Samples[0].V.H != nil { - return 0, f.Samples[len(f.Samples)-1].V.H.Copy(), true, nil + + var fi, hi int = -1, -1 + for i, s := range f.Samples { + if s.V.H != nil { + hi = i + continue + } + fi = i } - return f.Samples[len(f.Samples)-1].V.F, nil, true, nil + + if hi == -1 { + return f.Samples[len(f.Samples)-1].V.F, nil, true, nil + } + if fi == -1 { + return 0, f.Samples[hi].V.H.Copy(), true, nil + } + + if f.Samples[hi].T > f.Samples[fi].T { + return 0, f.Samples[hi].V.H.Copy(), true, nil + } + return f.Samples[fi].V.F, nil, true, nil }, "present_over_time": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { if len(f.Samples) == 0 { @@ -162,9 +311,20 @@ var rangeVectorFuncs = map[string]FunctionCall{ if len(f.Samples) == 0 { return 0., nil, false, nil } - floats := make([]float64, len(f.Samples)) - for i, sample := range f.Samples { - floats[i] = sample.V.F + floats := make([]float64, 0, len(f.Samples)) + + for _, sample := range f.Samples { + if sample.V.H != nil { + if len(floats) > 0 { + warnings.AddToContext(annotations.NewHistogramIgnoredInMixedRangeInfo("", posrange.PositionRange{}), f.ctx) + } + continue + } + floats = append(floats, sample.V.F) + } + + if len(floats) == 0 { + return 0, nil, false, nil } return aggregate.Quantile(f.ScalarPoint, floats), nil, true, nil }, @@ -184,33 +344,22 @@ var rangeVectorFuncs = map[string]FunctionCall{ if len(f.Samples) < 2 { return 0., nil, false, nil } - if f.Samples[0].V.H != nil { - // deriv should ignore histograms. - return 0, nil, false, nil - } - return deriv(f.Samples), nil, true, nil + v, ok := deriv(f.ctx, f.Samples) + return v, nil, ok, nil }, "irate": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { - f.Samples = filterFloatOnlySamples(f.Samples) - if len(f.Samples) < 2 { - return 0., nil, false, nil - } - val, ok := instantValue(f.Samples, true) + v, fh, ok := instantValue(f.ctx, f.Samples, true) if !ok { return 0., nil, false, nil } - return val, nil, true, nil + return v, fh, true, nil }, "idelta": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { - f.Samples = filterFloatOnlySamples(f.Samples) - if len(f.Samples) < 2 { - return 0., nil, false, nil - } - val, ok := instantValue(f.Samples, false) + v, fh, ok := instantValue(f.ctx, f.Samples, false) if !ok { return 0., nil, false, nil } - return val, nil, true, nil + return v, fh, true, nil }, "rate": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { if len(f.Samples) < 2 { @@ -270,33 +419,23 @@ var rangeVectorFuncs = map[string]FunctionCall{ return v, h, true, nil }, "predict_linear": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { - if len(f.Samples) < 2 { - return 0., nil, false, nil - } - v := predictLinear(f.Samples, f.ScalarPoint, f.StepTime) - return v, nil, true, nil + v, ok := predictLinear(f.ctx, f.Samples, f.ScalarPoint, f.StepTime) + return v, nil, ok, nil }, "double_exponential_smoothing": func(f FunctionArgs) (float64, *histogram.FloatHistogram, bool, error) { - if len(f.Samples) < 2 { - if len(f.Samples) == 1 && f.Samples[0].V.H != nil { - warnings.AddToContext(annotations.MixedFloatsHistogramsWarning, f.ctx) - return 0, nil, false, nil - } - return 0, nil, false, nil + floats, numHistograms := filterFloatOnlySamples(f.Samples) + if numHistograms > 0 && len(floats) > 0 { + warnings.AddToContext(annotations.NewHistogramIgnoredInMixedRangeInfo("", posrange.PositionRange{}), f.ctx) } - // Annotate mix of float and histogram. - for _, s := range f.Samples { - if s.V.H != nil { - warnings.AddToContext(annotations.MixedFloatsHistogramsWarning, f.ctx) - return 0, nil, false, nil - } + if len(floats) < 2 { + return 0, nil, false, nil } sf := f.ScalarPoint // smoothing factor or alpha tf := f.ScalarPoint2 // trend factor argument or beta - v, ok := doubleExponentialSmoothing(f.Samples, sf, tf) + v, ok := doubleExponentialSmoothing(floats, sf, tf) return v, nil, ok, nil }, } @@ -321,6 +460,16 @@ func extrapolatedRate(ctx context.Context, samples []Sample, numSamples int, isC resultHistogram *histogram.FloatHistogram ) + var fd, hd bool + for _, s := range samples { + hd = hd || s.V.H != nil + fd = fd || s.V.H == nil + } + if fd && hd { + warnings.AddToContext(annotations.NewMixedFloatsHistogramsWarning("", posrange.PositionRange{}), ctx) + return 0, nil, false, nil + } + if samples[0].V.H != nil { resultHistogram, err = histogramRate(ctx, samples, isCounter) if err != nil { @@ -504,14 +653,42 @@ func histogramRate(ctx context.Context, points []Sample, isCounter bool) (*histo if len(points) < 2 { return nil, nil } + var ( + prev = points[0].V.H + usingCustomBuckets = prev.UsesCustomBuckets() + last = points[len(points)-1].V.H + ) - prev := points[0].V.H // We already know that this is a histogram. - usingCustomBuckets := prev.UsesCustomBuckets() - last := points[len(points)-1].V.H if last == nil { warnings.AddToContext(annotations.MixedFloatsHistogramsWarning, ctx) return nil, nil // Range contains a mix of histograms and floats. } + + // We check for gauge type histograms in the loop below, but the loop + // below does not run on the first and last point, so check the first + // and last point now. + if isCounter && (prev.CounterResetHint == histogram.GaugeType || last.CounterResetHint == histogram.GaugeType) { + warnings.AddToContext(annotations.NewNativeHistogramNotCounterWarning("", posrange.PositionRange{}), ctx) + } + + // Null out the 1st sample if there is a counter reset between the 1st + // and 2nd. In this case, we want to ignore any incompatibility in the + // bucket layout of the 1st sample because we do not need to look at it. + if isCounter && len(points) > 1 { + second := points[1].V.H + if second != nil && second.DetectReset(prev) { + prev = &histogram.FloatHistogram{} + prev.Schema = second.Schema + prev.CustomValues = second.CustomValues + usingCustomBuckets = second.UsesCustomBuckets() + } + } + + if last.UsesCustomBuckets() != usingCustomBuckets { + warnings.AddToContext(annotations.NewMixedExponentialCustomHistogramsWarning("", posrange.PositionRange{}), ctx) + return nil, nil + } + minSchema := prev.Schema if last.Schema < minSchema { minSchema = last.Schema @@ -522,12 +699,6 @@ func histogramRate(ctx context.Context, points []Sample, isCounter bool) (*histo return nil, nil } - // We check for gauge type histograms in the loop below, but the loop below does not run on the first and last point, - // so check the first and last point now. - if isCounter && (prev.CounterResetHint == histogram.GaugeType || last.CounterResetHint == histogram.GaugeType) { - warnings.AddToContext(annotations.NativeHistogramNotCounterWarning, ctx) - } - // https://github.com/prometheus/prometheus/blob/ccea61c7bf1e6bce2196ba8189a209945a204c5b/promql/functions.go#L183 // First iteration to find out two things: // - What's the smallest relevant schema? @@ -556,12 +727,10 @@ func histogramRate(ctx context.Context, points []Sample, isCounter bool) (*histo h := last.CopyToSchema(minSchema) if _, err := h.Sub(prev); err != nil { - if errors.Is(err, histogram.ErrHistogramsIncompatibleSchema) { - warnings.AddToContext(annotations.MixedExponentialCustomHistogramsWarning, ctx) - } else if errors.Is(err, histogram.ErrHistogramsIncompatibleBounds) { - warnings.AddToContext(annotations.IncompatibleCustomBucketsHistogramsWarning, ctx) + if err := handleHistogramErr(ctx, err); err != nil { + return nil, err } - return nil, err + return nil, nil } if isCounter { @@ -570,12 +739,10 @@ func histogramRate(ctx context.Context, points []Sample, isCounter bool) (*histo curr := currPoint.V.H if curr.DetectReset(prev) { if _, err := h.Add(prev); err != nil { - if errors.Is(err, histogram.ErrHistogramsIncompatibleSchema) { - warnings.AddToContext(annotations.MixedExponentialCustomHistogramsWarning, ctx) - } else if errors.Is(err, histogram.ErrHistogramsIncompatibleBounds) { - warnings.AddToContext(annotations.IncompatibleCustomBucketsHistogramsWarning, ctx) + if err := handleHistogramErr(ctx, err); err != nil { + return nil, err } - return nil, err + return nil, nil } } prev = curr @@ -588,41 +755,79 @@ func histogramRate(ctx context.Context, points []Sample, isCounter bool) (*histo return h.Compact(0), nil } -func madOverTime(points []Sample) float64 { +func madOverTime(ctx context.Context, points []Sample) (float64, bool) { values := make([]float64, 0, len(points)) + var floatsDetected bool for _, f := range points { + if f.V.H != nil { + if floatsDetected { + warnings.AddToContext(annotations.NewHistogramIgnoredInMixedRangeInfo("", posrange.PositionRange{}), ctx) + } + continue + } else { + floatsDetected = true + + } values = append(values, f.V.F) } sort.Float64s(values) + if len(values) == 0 { + return 0, false + } median := stat.Quantile(0.5, stat.LinInterp, values, nil) - for i, f := range points { - values[i] = math.Abs(f.V.F - median) + for i, f := range values { + values[i] = math.Abs(f - median) } sort.Float64s(values) - return stat.Quantile(0.5, stat.LinInterp, values, nil) + return stat.Quantile(0.5, stat.LinInterp, values, nil), true } -func maxOverTime(points []Sample) float64 { +func maxOverTime(ctx context.Context, points []Sample) (float64, bool) { max := points[0].V.F + + var foundFloat bool for _, v := range points { + if v.V.H != nil { + if foundFloat { + warnings.AddToContext(annotations.NewHistogramIgnoredInMixedRangeInfo("", posrange.PositionRange{}), ctx) + } + } else { + foundFloat = true + } if v.V.F > max || math.IsNaN(max) { max = v.V.F } } - return max + + if !foundFloat { + return 0, false + } + return max, true } -func minOverTime(points []Sample) float64 { +func minOverTime(ctx context.Context, points []Sample) (float64, bool) { min := points[0].V.F + var foundFloat bool for _, v := range points { + if v.V.H != nil { + if foundFloat { + warnings.AddToContext(annotations.NewHistogramIgnoredInMixedRangeInfo("", posrange.PositionRange{}), ctx) + } + } else { + foundFloat = true + } if v.V.F < min || math.IsNaN(min) { min = v.V.F } } - return min + + if !foundFloat { + return 0, false + } + return min, true } func countOverTime(points []Sample) float64 { @@ -679,9 +884,12 @@ func avgOverTime(points []Sample) float64 { return (sum + kahanC) / count } -func sumOverTime(points []Sample) float64 { +func sumOverTime(ctx context.Context, points []Sample) float64 { var sum, c float64 for _, v := range points { + if v.V.H != nil { + warnings.AddToContext(annotations.NewHistogramIgnoredInMixedRangeInfo("", posrange.PositionRange{}), ctx) + } sum, c = kahanSumInc(v.V.F, sum, c) } if math.IsInf(sum, 0) { @@ -690,30 +898,54 @@ func sumOverTime(points []Sample) float64 { return sum + c } -func stddevOverTime(points []Sample) float64 { +func stddevOverTime(ctx context.Context, points []Sample) (float64, bool) { var count float64 var mean, cMean float64 var aux, cAux float64 + + var foundFloat bool for _, v := range points { + if v.V.H == nil { + foundFloat = true + } else if foundFloat && v.V.H != nil { + warnings.AddToContext(annotations.NewHistogramIgnoredInMixedRangeInfo("", posrange.PositionRange{}), ctx) + continue + } count++ delta := v.V.F - (mean + cMean) mean, cMean = kahanSumInc(delta/count, mean, cMean) aux, cAux = kahanSumInc(delta*(v.V.F-(mean+cMean)), aux, cAux) } - return math.Sqrt((aux + cAux) / count) + + if !foundFloat { + return 0, false + } + return math.Sqrt((aux + cAux) / count), true } -func stdvarOverTime(points []Sample) float64 { +func stdvarOverTime(ctx context.Context, points []Sample) (float64, bool) { var count float64 var mean, cMean float64 var aux, cAux float64 + + var foundFloat bool for _, v := range points { + if v.V.H == nil { + foundFloat = true + } else if foundFloat && v.V.H != nil { + warnings.AddToContext(annotations.NewHistogramIgnoredInMixedRangeInfo("", posrange.PositionRange{}), ctx) + continue + } count++ delta := v.V.F - (mean + cMean) mean, cMean = kahanSumInc(delta/count, mean, cMean) aux, cAux = kahanSumInc(delta*(v.V.F-(mean+cMean)), aux, cAux) } - return (aux + cAux) / count + + if !foundFloat { + return 0, false + } + return ((aux + cAux) / count), true } func changes(points []Sample) float64 { @@ -738,17 +970,62 @@ func changes(points []Sample) float64 { return count } -func deriv(points []Sample) float64 { +func deriv(ctx context.Context, points []Sample) (float64, bool) { + var floats int + + for _, p := range points { + if p.V.H == nil { + floats++ + } + + if floats > 0 && p.V.H != nil { + warnings.AddToContext(annotations.NewHistogramIgnoredInMixedRangeInfo("", posrange.PositionRange{}), ctx) + } + } + + if floats < 2 { + return 0, false + } + + fp := make([]Sample, 0, floats) + for _, p := range points { + if p.V.H == nil { + fp = append(fp, p) + } + } // We pass in an arbitrary timestamp that is near the values in use // to avoid floating point accuracy issues, see // https://github.com/prometheus/prometheus/issues/2674 - slope, _ := linearRegression(points, points[0].T) - return slope + slope, _ := linearRegression(fp, fp[0].T) + + return slope, true } -func predictLinear(points []Sample, duration float64, stepTime int64) float64 { - slope, intercept := linearRegression(points, stepTime) - return slope*duration + intercept +func predictLinear(ctx context.Context, points []Sample, duration float64, stepTime int64) (float64, bool) { + var floats int + + for _, p := range points { + if p.V.H == nil { + floats++ + } + + if floats > 0 && p.V.H != nil { + warnings.AddToContext(annotations.NewHistogramIgnoredInMixedRangeInfo("", posrange.PositionRange{}), ctx) + } + } + + if floats < 2 { + return 0, false + } + + fp := make([]Sample, 0, floats) + for _, p := range points { + if p.V.H == nil { + fp = append(fp, p) + } + } + slope, intercept := linearRegression(fp, stepTime) + return slope*duration + intercept, true } // Based on https://github.com/prometheus/prometheus/blob/8baad1a73e471bd3cf3175a1608199e27484f179/promql/functions.go#L438 @@ -907,16 +1184,19 @@ func linearRegression(Samples []Sample, interceptTime int64) (slope, intercept f return slope, intercept } -func filterFloatOnlySamples(samples []Sample) []Sample { +func filterFloatOnlySamples(samples []Sample) ([]Sample, int) { i := 0 + histograms := 0 for _, sample := range samples { if sample.V.H == nil { samples[i] = sample i++ + } else { + histograms++ } } samples = samples[:i] - return samples + return samples, histograms } func kahanSumInc(inc, sum, c float64) (newSum, newC float64) { diff --git a/vendor/github.com/thanos-io/promql-engine/ringbuffer/generic.go b/vendor/github.com/thanos-io/promql-engine/ringbuffer/generic.go index 00c7f2efe93..ef2e00cf035 100644 --- a/vendor/github.com/thanos-io/promql-engine/ringbuffer/generic.go +++ b/vendor/github.com/thanos-io/promql-engine/ringbuffer/generic.go @@ -7,6 +7,8 @@ import ( "context" "math" + "github.com/thanos-io/promql-engine/execution/telemetry" + "github.com/prometheus/prometheus/model/histogram" ) @@ -21,9 +23,10 @@ type Sample struct { } type GenericRingBuffer struct { - ctx context.Context - items []Sample - tail []Sample + ctx context.Context + items []Sample + tail []Sample + subquery bool currentStep int64 offset int64 @@ -32,11 +35,11 @@ type GenericRingBuffer struct { call FunctionCall } -func New(ctx context.Context, size int, selectRange, offset int64, call FunctionCall) *GenericRingBuffer { - return NewWithExtLookback(ctx, size, selectRange, offset, 0, call) +func New(ctx context.Context, size int, selectRange, offset int64, call FunctionCall, subquery bool) *GenericRingBuffer { + return NewWithExtLookback(ctx, size, selectRange, offset, 0, call, subquery) } -func NewWithExtLookback(ctx context.Context, size int, selectRange, offset, extLookback int64, call FunctionCall) *GenericRingBuffer { +func NewWithExtLookback(ctx context.Context, size int, selectRange, offset, extLookback int64, call FunctionCall, subquery bool) *GenericRingBuffer { return &GenericRingBuffer{ ctx: ctx, items: make([]Sample, 0, size), @@ -44,11 +47,24 @@ func NewWithExtLookback(ctx context.Context, size int, selectRange, offset, extL offset: offset, extLookback: extLookback, call: call, + subquery: subquery, } } func (r *GenericRingBuffer) Len() int { return len(r.items) } +func (r *GenericRingBuffer) SampleCount() int { + c := 0 + for _, s := range r.items { + if s.V.H != nil { + c += telemetry.CalculateHistogramSampleCount(s.V.H) + continue + } + c++ + } + return c +} + // MaxT returns the maximum timestamp of the ring buffer. // If the ring buffer is empty, it returns math.MinInt64. func (r *GenericRingBuffer) MaxT() int64 { @@ -76,7 +92,29 @@ func (r *GenericRingBuffer) Push(t int64, v Value) { r.items[n].V.F = v.F if v.H != nil { if r.items[n].V.H == nil { - r.items[n].V.H = v.H.Copy() + h := v.H.Copy() + if r.subquery { + // Set any "NotCounterReset" and "CounterReset" hints in native + // histograms to "UnknownCounterReset" because we might + // otherwise miss a counter reset happening in samples not + // returned by the subquery, or we might over-detect counter + // resets if the sample with a counter reset is returned + // multiple times by a high-res subquery. This intentionally + // does not attempt to be clever (like detecting if we are + // really missing underlying samples or returning underlying + // samples multiple times) because subqueries on counters are + // inherently problematic WRT counter reset handling, so we + // cannot really solve the problem for good. We only want to + // avoid problems that happen due to the explicitly set counter + // reset hints and go back to the behavior we already know from + // float samples. + switch h.CounterResetHint { + case histogram.NotCounterReset, histogram.CounterReset: + h.CounterResetHint = histogram.UnknownCounterReset + } + } + r.items[n].V.H = h + } else { v.H.CopyTo(r.items[n].V.H) } diff --git a/vendor/github.com/thanos-io/promql-engine/ringbuffer/rate.go b/vendor/github.com/thanos-io/promql-engine/ringbuffer/rate.go index 0a137ceeee2..33a01f87979 100644 --- a/vendor/github.com/thanos-io/promql-engine/ringbuffer/rate.go +++ b/vendor/github.com/thanos-io/promql-engine/ringbuffer/rate.go @@ -8,6 +8,7 @@ import ( "math" "slices" + "github.com/thanos-io/promql-engine/execution/telemetry" "github.com/thanos-io/promql-engine/query" "github.com/prometheus/prometheus/model/histogram" @@ -20,6 +21,7 @@ type Buffer interface { Reset(mint int64, evalt int64) Eval(ctx context.Context, _, _ float64, _ *int64) (float64, *histogram.FloatHistogram, bool, error) ReadIntoLast(f func(*Sample)) + SampleCount() int } // RateBuffer is a Buffer which can calculate rate, increase and delta for a @@ -50,9 +52,10 @@ type RateBuffer struct { } type stepRange struct { - mint int64 - maxt int64 - numSamples int + mint int64 + maxt int64 + numSamples int + sampleCount int } // NewRateBuffer creates a new RateBuffer. @@ -94,6 +97,10 @@ func NewRateBuffer(ctx context.Context, opts query.Options, isCounter, isRate bo func (r *RateBuffer) Len() int { return r.stepRanges[0].numSamples } +func (r *RateBuffer) SampleCount() int { + return r.stepRanges[0].sampleCount +} + func (r *RateBuffer) MaxT() int64 { return r.last.T } func (r *RateBuffer) Push(t int64, v Value) { @@ -130,6 +137,11 @@ func (r *RateBuffer) Push(t int64, v Value) { // Set the first sample for each evaluation step where the currently read sample is used. for i := 0; i < len(r.stepRanges) && t > r.stepRanges[i].mint && t <= r.stepRanges[i].maxt; i++ { r.stepRanges[i].numSamples++ + if v.H != nil { + r.stepRanges[i].sampleCount += telemetry.CalculateHistogramSampleCount(v.H) + } else { + r.stepRanges[i].sampleCount++ + } sample := &r.firstSamples[i] if t >= sample.T { continue diff --git a/vendor/github.com/thanos-io/promql-engine/storage/prometheus/matrix_selector.go b/vendor/github.com/thanos-io/promql-engine/storage/prometheus/matrix_selector.go index 381b19671ae..c4d8432832c 100644 --- a/vendor/github.com/thanos-io/promql-engine/storage/prometheus/matrix_selector.go +++ b/vendor/github.com/thanos-io/promql-engine/storage/prometheus/matrix_selector.go @@ -39,7 +39,7 @@ type matrixScanner struct { } type matrixSelector struct { - telemetry.OperatorTelemetry + telemetry telemetry.OperatorTelemetry vectorPool *model.VectorPool storage SeriesSelector @@ -120,7 +120,6 @@ func NewMatrixSelector( extLookbackDelta: opts.ExtLookbackDelta.Milliseconds(), } - m.OperatorTelemetry = telemetry.NewTelemetry(m, opts) // For instant queries, set the step to a positive value // so that the operator can terminate. @@ -128,7 +127,8 @@ func NewMatrixSelector( m.step = 1 } - return m, nil + m.telemetry = telemetry.NewTelemetry(m, opts) + return telemetry.NewOperator(m.telemetry, m), nil } func (o *matrixSelector) Explain() []model.VectorOperator { @@ -136,9 +136,6 @@ func (o *matrixSelector) Explain() []model.VectorOperator { } func (o *matrixSelector) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - if err := o.loadSeries(ctx); err != nil { return nil, err } @@ -150,9 +147,6 @@ func (o *matrixSelector) GetPool() *model.VectorPool { } func (o *matrixSelector) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() @@ -210,7 +204,7 @@ func (o *matrixSelector) Next(ctx context.Context) ([]model.StepVector, error) { o.hasFloats = true } } - o.IncrementSamplesAtTimestamp(scanner.buffer.Len(), seriesTs) + o.telemetry.IncrementSamplesAtTimestamp(scanner.buffer.SampleCount(), seriesTs) seriesTs += o.step } } @@ -287,9 +281,9 @@ func (o *matrixSelector) newBuffer(ctx context.Context) ringbuffer.Buffer { } if o.isExtFunction { - return ringbuffer.NewWithExtLookback(ctx, 8, o.selectRange, o.offset, o.opts.ExtLookbackDelta.Milliseconds()-1, o.call) + return ringbuffer.NewWithExtLookback(ctx, 8, o.selectRange, o.offset, o.opts.ExtLookbackDelta.Milliseconds()-1, o.call, false) } - return ringbuffer.New(ctx, 8, o.selectRange, o.offset, o.call) + return ringbuffer.New(ctx, 8, o.selectRange, o.offset, o.call, false) } diff --git a/vendor/github.com/thanos-io/promql-engine/storage/prometheus/vector_selector.go b/vendor/github.com/thanos-io/promql-engine/storage/prometheus/vector_selector.go index 769fc6d2299..19fd0809d99 100644 --- a/vendor/github.com/thanos-io/promql-engine/storage/prometheus/vector_selector.go +++ b/vendor/github.com/thanos-io/promql-engine/storage/prometheus/vector_selector.go @@ -28,7 +28,7 @@ type vectorScanner struct { } type vectorSelector struct { - telemetry.OperatorTelemetry + telemetry telemetry.OperatorTelemetry storage SeriesSelector scanners []vectorScanner @@ -82,7 +82,6 @@ func NewVectorSelector( selectTimestamp: selectTimestamp, } - o.OperatorTelemetry = telemetry.NewTelemetry(o, queryOpts) // For instant queries, set the step to a positive value // so that the operator can terminate. @@ -90,7 +89,8 @@ func NewVectorSelector( o.step = 1 } - return o + o.telemetry = telemetry.NewTelemetry(o, queryOpts) + return telemetry.NewOperator(o.telemetry, o) } func (o *vectorSelector) String() string { @@ -102,9 +102,6 @@ func (o *vectorSelector) Explain() (next []model.VectorOperator) { } func (o *vectorSelector) Series(ctx context.Context) ([]labels.Labels, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - if err := o.loadSeries(ctx); err != nil { return nil, err } @@ -116,9 +113,6 @@ func (o *vectorSelector) GetPool() *model.VectorPool { } func (o *vectorSelector) Next(ctx context.Context) ([]model.StepVector, error) { - start := time.Now() - defer func() { o.AddExecutionTimeTaken(time.Since(start)) }() - select { case <-ctx.Done(): return nil, ctx.Err() @@ -139,7 +133,7 @@ func (o *vectorSelector) Next(ctx context.Context) ([]model.StepVector, error) { ts += o.step } - var currStepSamples uint64 + var currStepSamples int // Reset the current timestamp. ts = o.currentStep fromSeries := o.currentSeries @@ -160,12 +154,13 @@ func (o *vectorSelector) Next(ctx context.Context) ([]model.StepVector, error) { if ok { if h != nil && !o.selectTimestamp { vectors[currStep].AppendHistogram(o.vectorPool, series.signature, h) + currStepSamples += telemetry.CalculateHistogramSampleCount(h) } else { vectors[currStep].AppendSample(o.vectorPool, series.signature, v) + currStepSamples++ } - currStepSamples++ } - o.IncrementSamplesAtTimestamp(int(currStepSamples), seriesTs) + o.telemetry.IncrementSamplesAtTimestamp(currStepSamples, seriesTs) seriesTs += o.step } } diff --git a/vendor/modules.txt b/vendor/modules.txt index 52e75854745..f4c6d4ceba1 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -940,7 +940,7 @@ github.com/prometheus/client_golang/prometheus/testutil/promlint/validations # github.com/prometheus/client_model v0.6.2 ## explicit; go 1.22.0 github.com/prometheus/client_model/go -# github.com/prometheus/common v0.62.0 +# github.com/prometheus/common v0.63.0 => github.com/prometheus/common v0.62.1-0.20250120132612-df14882cbf97 ## explicit; go 1.21 github.com/prometheus/common/config github.com/prometheus/common/expfmt @@ -957,7 +957,7 @@ github.com/prometheus/exporter-toolkit/web github.com/prometheus/procfs github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/util -# github.com/prometheus/prometheus v0.303.1-0.20250504095004-c3ce1f192748 => github.com/prometheus/prometheus v0.302.1 +# github.com/prometheus/prometheus v0.303.1 => github.com/prometheus/prometheus v0.302.1 ## explicit; go 1.22.7 github.com/prometheus/prometheus/config github.com/prometheus/prometheus/discovery @@ -1090,7 +1090,7 @@ github.com/thanos-io/objstore/providers/gcs github.com/thanos-io/objstore/providers/s3 github.com/thanos-io/objstore/providers/swift github.com/thanos-io/objstore/tracing/opentracing -# github.com/thanos-io/promql-engine v0.0.0-20250522103302-dd83bd8fdb50 +# github.com/thanos-io/promql-engine v0.0.0-20250606124720-6f637b9579dc ## explicit; go 1.24.0 github.com/thanos-io/promql-engine/api github.com/thanos-io/promql-engine/engine @@ -1765,3 +1765,4 @@ k8s.io/utils/clock # google.golang.org/grpc => google.golang.org/grpc v1.65.0 # github.com/thanos-io/objstore => github.com/thanos-io/objstore v0.0.0-20241111205755-d1dd89d41f97 # github.com/prometheus/prometheus => github.com/prometheus/prometheus v0.302.1 +# github.com/prometheus/common => github.com/prometheus/common v0.62.1-0.20250120132612-df14882cbf97