From f34dfb1f31dd4e5e3347c37ef74d15f9690c5dac Mon Sep 17 00:00:00 2001 From: Charlie Le Date: Wed, 19 Aug 2026 14:26:42 -0700 Subject: [PATCH] Refresh the Thanos and promql-engine pins and document why they are pinned to main Both dependencies track main rather than a tag. Refresh them once here, ahead of the release-1.22 cut, and record in go.mod what each pin is actually needed for so the next shepherd does not have to re-derive it: - promql-engine has never cut a tag, so a pseudo-version is the only option. - The newest Thanos tag (v0.42.4) sits on a release branch that was never merged back to main, so it is behind what promql-engine needs to compile against. After this lands, no dependency bumps go to release-1.22 except security fixes. Signed-off-by: Charlie Le --- CHANGELOG.md | 2 +- go.mod | 12 +- go.sum | 12 +- .../thanos-io/promql-engine/api/remote.go | 56 ++++++++ .../promql-engine/execution/binary/scalar.go | 5 +- .../execution/function/histogram.go | 3 +- .../execution/function/operator.go | 5 +- .../execution/function/timestamp.go | 5 +- .../promql-engine/execution/scan/subquery.go | 5 +- .../promql-engine/execution/unary/unary.go | 5 +- .../storage/prometheus/matrix_selector.go | 7 +- .../thanos-io/thanos/pkg/clientconfig/http.go | 2 +- .../thanos/pkg/promclient/promclient.go | 9 +- .../thanos/pkg/status/statuspb/custom.go | 4 +- .../thanos-io/thanos/pkg/store/bucket.go | 23 +-- .../thanos-io/thanos/pkg/store/limiter.go | 19 ++- .../thanos-io/thanos/pkg/store/proxy.go | 30 +--- .../thanos-io/thanos/pkg/store/proxy_merge.go | 41 +----- .../thanos-io/thanos/pkg/store/tsdb.go | 3 + vendor/github.com/tjhop/slog-gokit/handler.go | 132 +++++++++++++----- vendor/github.com/tjhop/slog-gokit/level.go | 44 +++--- vendor/modules.txt | 6 +- 22 files changed, 250 insertions(+), 180 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c2517bef4f..7dc33644895 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,7 +63,7 @@ * [ENHANCEMENT] Ingester: Add `cortex_ingester_tsdb_head_max_timestamp` metric that re-exports the TSDB head max timestamp (`prometheus_tsdb_head_max_time`) per user, to help investigate ingestion issues like out-of-bounds (too old sample) errors. #7694 * [ENHANCEMENT] Ingester: Include the TSDB head max time in the `out of bounds` and `too old sample` error messages, so that users can see how far behind the accepted time range a rejected sample is. #7695 * [ENHANCEMENT] Compactor: Reduce object storage GET calls when updating the bucket index by skipping re-reading parquet converter markers for blocks that already have a valid-version parquet entry in the previous index. #7669 -* [ENHANCEMENT] Upgrade Thanos and promql-engine to latest. #7740 +* [ENHANCEMENT] Upgrade Thanos and promql-engine to latest. #7740 #7788 * [ENHANCEMENT] Ruler: Adjust ruler frontend decoder to not wrap query error messages with execution prefix, this makes error responses consistent between internal and external ruler paths. #7741 * [ENHANCEMENT] Distributor: Deduplicate metric metadata when converting PRW 2.0 requests. PRW 2.0 attaches metadata to every series, so a metric family was previously expanded into one `MetricMetadata` per series. #7760 * [ENHANCEMENT] Update build image and Go version to 1.27.0. #7814 diff --git a/go.mod b/go.mod index 48af58b8b3d..65c205f1a0d 100644 --- a/go.mod +++ b/go.mod @@ -66,9 +66,15 @@ require ( github.com/spf13/afero v1.15.0 github.com/stretchr/testify v1.11.1 github.com/thanos-io/objstore v0.0.0-20250804093838-71d60dfee488 - github.com/thanos-io/promql-engine v0.0.0-20260729073658-f8bd3f940687 - github.com/thanos-io/thanos v0.42.1-0.20260727122508-92397939e4cc - github.com/tjhop/slog-gokit v0.2.0 + // Pinned to main: promql-engine has never cut a tag, so a pseudo-version is the only + // option. We need thanosengine.Opts.SelectorBatchSize (-querier.selector-batch-size, + // #7763) and the logicalplan API that pkg/distributed_execution builds on. + github.com/thanos-io/promql-engine v0.0.0-20260817205454-68fb2c2c5d9b + // Pinned to main: the v0.42.x patch tags live on a release branch that was never merged + // back, so the newest tag is behind main by everything the promql-engine pin above needs + // to compile against (pkg/store/storepb, pkg/query). Downgrading to v0.42.4 would revert it. + github.com/thanos-io/thanos v0.42.5-0.20260817064418-8908023d563b + github.com/tjhop/slog-gokit v0.2.2 github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/weaveworks/common v0.0.0-20230728070032-dd9e68f319d5 go.etcd.io/etcd/api/v3 v3.5.17 diff --git a/go.sum b/go.sum index 14aded077a1..b2bc42c070b 100644 --- a/go.sum +++ b/go.sum @@ -1001,14 +1001,14 @@ 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-20250804093838-71d60dfee488 h1:khBsQLLRoF1KzXgTlwFZa6mC32bwYUUAu/AeP49V7UM= github.com/thanos-io/objstore v0.0.0-20250804093838-71d60dfee488/go.mod h1:uDHLkMKOGDAnlN75EAz8VrRzob1+VbgYSuUleatWuF0= -github.com/thanos-io/promql-engine v0.0.0-20260729073658-f8bd3f940687 h1:r9VYttKGve+nctb6dGlQ9mhusOzdpt5DWM3q7secn2Q= -github.com/thanos-io/promql-engine v0.0.0-20260729073658-f8bd3f940687/go.mod h1:uzn40oZHPXvfdP498h+MiRL2fN7RF519gNaV3LyhChc= -github.com/thanos-io/thanos v0.42.1-0.20260727122508-92397939e4cc h1:Sx5AfjHy6OspiLdJTFUO8DsfndpMNM8mbkMBMXtVFqc= -github.com/thanos-io/thanos v0.42.1-0.20260727122508-92397939e4cc/go.mod h1:GH7XiOiHgMLvIST9qgcy/UuhtV22umoBCXAceOFMzCA= +github.com/thanos-io/promql-engine v0.0.0-20260817205454-68fb2c2c5d9b h1:LuoTi193m3MJx1/bjydfVHvq9A2bJ6nqWmdaXGSl0j8= +github.com/thanos-io/promql-engine v0.0.0-20260817205454-68fb2c2c5d9b/go.mod h1:uzn40oZHPXvfdP498h+MiRL2fN7RF519gNaV3LyhChc= +github.com/thanos-io/thanos v0.42.5-0.20260817064418-8908023d563b h1:30lUqQ2HfZ2ni0Ogq3TO0kW45K3iEVhinYDkA0npfXw= +github.com/thanos-io/thanos v0.42.5-0.20260817064418-8908023d563b/go.mod h1:zGTlIYCS4Nwn64QbcLQKWAzafbuf370q0UMU5nSraDo= github.com/tinylib/msgp v1.6.1 h1:ESRv8eL3u+DNHUoSAAQRE50Hm162zqAnBoGv9PzScPY= github.com/tinylib/msgp v1.6.1/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA= -github.com/tjhop/slog-gokit v0.2.0 h1:tUNkuukDjpswQ2abhsugEobRRxN1aHEW8h4rvwdHMqU= -github.com/tjhop/slog-gokit v0.2.0/go.mod h1:yA48zAHvV+Sg4z4VRyeFyFUNNXd3JY5Zg84u3USICq0= +github.com/tjhop/slog-gokit v0.2.2 h1:ev90r/tMq5cx7q6lMuhJ6v7fjsr1bDho7W2BLAFVwtI= +github.com/tjhop/slog-gokit v0.2.2/go.mod h1:yA48zAHvV+Sg4z4VRyeFyFUNNXd3JY5Zg84u3USICq0= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twmb/franz-go v1.21.2 h1:WrvV/spF48JzcRylqDQy02Vm6V6W4lhtD9Y4BOYNMu4= github.com/twmb/franz-go v1.21.2/go.mod h1:rfoMTnVk7107fhTGxfEKIHP/e7tPe6oyij/ywzO0czk= diff --git a/vendor/github.com/thanos-io/promql-engine/api/remote.go b/vendor/github.com/thanos-io/promql-engine/api/remote.go index 21b7c27245d..afd8e5a1400 100644 --- a/vendor/github.com/thanos-io/promql-engine/api/remote.go +++ b/vendor/github.com/thanos-io/promql-engine/api/remote.go @@ -6,6 +6,7 @@ package api import ( "context" "fmt" + "slices" "sync" "time" @@ -49,6 +50,61 @@ type RemoteEngine interface { NewRangeQuery(ctx context.Context, opts promql.QueryOpts, plan RemoteQuery, start, end time.Time, interval time.Duration) (promql.Query, error) } +type memoizedRemoteEngine struct { + RemoteEngine + mint int64 + maxt int64 + labelSets []labels.Labels + partitionLabelSets []labels.Labels +} + +func (e memoizedRemoteEngine) MinT() int64 { + return e.mint +} + +func (e memoizedRemoteEngine) MaxT() int64 { + return e.maxt +} + +func (e memoizedRemoteEngine) LabelSets() []labels.Labels { + return e.labelSets +} + +func (e memoizedRemoteEngine) PartitionLabelSets() []labels.Labels { + return e.partitionLabelSets +} + +// NewMemoizedRemoteEngine returns an engine with a stable snapshot of the +// supplied engine's metadata. Query creation is delegated to the supplied engine. +func NewMemoizedRemoteEngine(engine RemoteEngine) RemoteEngine { + return &memoizedRemoteEngine{ + RemoteEngine: engine, + mint: engine.MinT(), + maxt: engine.MaxT(), + labelSets: slices.Clone(engine.LabelSets()), + partitionLabelSets: slices.Clone(engine.PartitionLabelSets()), + } +} + +type memoizedEndpoints struct { + endpoints RemoteEndpoints +} + +func (m memoizedEndpoints) Engines(mint, maxt int64) []RemoteEngine { + remoteEngines := m.endpoints.Engines(mint, maxt) + engines := make([]RemoteEngine, 0, len(remoteEngines)) + for _, engine := range remoteEngines { + engines = append(engines, NewMemoizedRemoteEngine(engine)) + } + return engines +} + +// NewMemoizedEndpoints returns endpoints that provide a fresh, stable metadata +// snapshot of each remote engine on every Engines call. +func NewMemoizedEndpoints(endpoints RemoteEndpoints) RemoteEndpoints { + return &memoizedEndpoints{endpoints: endpoints} +} + type staticEndpoints struct { engines []RemoteEngine } 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 7ab8301d138..02ebf7b7e70 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 @@ -10,7 +10,6 @@ import ( "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" - "github.com/thanos-io/promql-engine/extlabels" "github.com/thanos-io/promql-engine/query" "github.com/thanos-io/promql-engine/warnings" @@ -18,6 +17,7 @@ import ( "github.com/prometheus/prometheus/model/histogram" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/promql/parser" + "github.com/prometheus/prometheus/schema" ) // scalarOperator evaluates expressions where one operand is a scalarOperator. @@ -143,12 +143,11 @@ func (o *scalarOperator) loadSeries(ctx context.Context) error { } series := make([]labels.Labels, len(vectorSeries)) - var b labels.ScratchBuilder for i := range vectorSeries { if !vectorSeries[i].IsEmpty() { lbls := vectorSeries[i] if shouldDropMetricName(o.opType, o.returnBool) { - lbls = extlabels.DropReserved(lbls, b) + lbls = lbls.DropReserved(schema.IsMetadataLabel) } series[i] = lbls } else { 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 b59345643d2..1c859804089 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 @@ -21,6 +21,7 @@ import ( "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/promql" "github.com/prometheus/prometheus/promql/parser/posrange" + "github.com/prometheus/prometheus/schema" "github.com/prometheus/prometheus/util/annotations" ) @@ -338,7 +339,7 @@ func (o *histogramOperator) loadSeries(ctx context.Context) error { // We check for duplicate series after dropped labels when // showing the result of the query. Series that are equal after // dropping name should not hash to the same bucket here. - lbls = extlabels.DropReserved(lbls, b) + lbls = lbls.DropReserved(schema.IsMetadataLabel) seriesHash := hasher.Sum64() seriesID, ok := seriesHashes[seriesHash] 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 d5d0641b9c9..1a142dbb361 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 @@ -12,13 +12,13 @@ import ( "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/parse" "github.com/thanos-io/promql-engine/execution/telemetry" - "github.com/thanos-io/promql-engine/extlabels" "github.com/thanos-io/promql-engine/logicalplan" "github.com/thanos-io/promql-engine/query" "github.com/efficientgo/core/errors" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/promql/parser" + "github.com/prometheus/prometheus/schema" ) func NewFunctionOperator(funcExpr *logicalplan.FunctionCall, nextOps []model.VectorOperator, stepsBatch int, opts *query.Options) (model.VectorOperator, error) { @@ -234,9 +234,8 @@ func (o *functionOperator) loadSeries(ctx context.Context) error { } o.series = make([]labels.Labels, len(series)) - var b labels.ScratchBuilder for i, s := range series { - lbls := extlabels.DropReserved(s, b) + lbls := s.DropReserved(schema.IsMetadataLabel) o.series[i] = lbls } }) 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 514cfadb49c..ef8e2f45a93 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 @@ -9,10 +9,10 @@ import ( "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" - "github.com/thanos-io/promql-engine/extlabels" "github.com/thanos-io/promql-engine/query" "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/schema" ) type timestampOperator struct { @@ -54,9 +54,8 @@ func (o *timestampOperator) loadSeries(ctx context.Context) error { } o.series = make([]labels.Labels, len(series)) - var b labels.ScratchBuilder for i, s := range series { - lbls := extlabels.DropReserved(s, b) + lbls := s.DropReserved(schema.IsMetadataLabel) o.series[i] = lbls } }) 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 3090e314eba..105d9529092 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 @@ -11,13 +11,13 @@ import ( "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" - "github.com/thanos-io/promql-engine/extlabels" "github.com/thanos-io/promql-engine/logicalplan" "github.com/thanos-io/promql-engine/query" "github.com/thanos-io/promql-engine/ringbuffer" "github.com/prometheus/prometheus/model/histogram" "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/schema" ) const sampleLimitCheckPercentage = 0.05 @@ -316,11 +316,10 @@ func (o *subqueryOperator) initSeries(ctx context.Context) error { for i := range o.buffers { o.buffers[i] = ringbuffer.New(ctx, 8, o.subQuery.Range.Milliseconds(), o.subQuery.Offset.Milliseconds(), o.call) } - var b labels.ScratchBuilder for i, s := range series { lbls := s if o.funcExpr.Func.Name != "last_over_time" { - lbls = extlabels.DropReserved(s, b) + lbls = s.DropReserved(schema.IsMetadataLabel) } o.series[i] = lbls } 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 29e9736448f..68374edc106 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 @@ -9,11 +9,11 @@ import ( "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/telemetry" - "github.com/thanos-io/promql-engine/extlabels" "github.com/thanos-io/promql-engine/query" "github.com/prometheus/prometheus/model/histogram" "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/schema" "gonum.org/v1/gonum/floats" ) @@ -55,9 +55,8 @@ func (u *unaryNegation) loadSeries(ctx context.Context) error { return } u.series = make([]labels.Labels, len(series)) - var b labels.ScratchBuilder for i := range series { - lbls := extlabels.DropReserved(series[i], b) + lbls := series[i].DropReserved(schema.IsMetadataLabel) u.series[i] = lbls } }) 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 967ece950a7..e776c985dea 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 @@ -14,7 +14,6 @@ import ( "github.com/thanos-io/promql-engine/execution/model" "github.com/thanos-io/promql-engine/execution/parse" "github.com/thanos-io/promql-engine/execution/telemetry" - "github.com/thanos-io/promql-engine/extlabels" "github.com/thanos-io/promql-engine/query" "github.com/thanos-io/promql-engine/ringbuffer" "github.com/thanos-io/promql-engine/warnings" @@ -23,6 +22,7 @@ import ( "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/model/value" "github.com/prometheus/prometheus/promql/parser/posrange" + "github.com/prometheus/prometheus/schema" "github.com/prometheus/prometheus/tsdb/chunkenc" "github.com/prometheus/prometheus/util/annotations" ) @@ -71,7 +71,7 @@ type matrixSelector struct { hasFloats bool } -const sampleLimitCheckInterval = 500 +const sampleLimitCheckInterval = 1 // NewMatrixSelector creates operator which selects vector of series over time. func NewMatrixSelector( @@ -269,13 +269,12 @@ func (o *matrixSelector) loadSeries(ctx context.Context) error { o.scanners = make([]matrixScanner, len(series)) o.series = make([]labels.Labels, len(series)) - var b labels.ScratchBuilder for i, s := range series { origLbls := s.Labels() lbls := origLbls if o.functionName != "last_over_time" && o.functionName != "first_over_time" { - lbls = extlabels.DropReserved(lbls, b) + lbls = lbls.DropReserved(schema.IsMetadataLabel) } o.scanners[i] = matrixScanner{ labels: lbls, diff --git a/vendor/github.com/thanos-io/thanos/pkg/clientconfig/http.go b/vendor/github.com/thanos-io/thanos/pkg/clientconfig/http.go index 5c3f4038064..93e81905874 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/clientconfig/http.go +++ b/vendor/github.com/thanos-io/thanos/pkg/clientconfig/http.go @@ -202,7 +202,7 @@ func NewRoundTripperFromConfig(cfg config_util.HTTPClientConfig, transportConfig } rtConfig := config_util.TLSRoundTripperSettings{ - Cert: config_util.NewFileSecret(cfg.TLSConfig.CAFile), + CA: config_util.NewFileSecret(cfg.TLSConfig.CAFile), } if len(cfg.TLSConfig.CertFile) > 0 { rtConfig.Cert = config_util.NewFileSecret(cfg.TLSConfig.CertFile) diff --git a/vendor/github.com/thanos-io/thanos/pkg/promclient/promclient.go b/vendor/github.com/thanos-io/thanos/pkg/promclient/promclient.go index 9de3e9b5ca7..3e5a1827d15 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/promclient/promclient.go +++ b/vendor/github.com/thanos-io/thanos/pkg/promclient/promclient.go @@ -975,5 +975,12 @@ func (c *Client) TSDBStatusInGRPC(ctx context.Context, base *url.URL, limit int, var v struct { Data *statuspb.TSDBStatisticsEntry `json:"data"` } - return v.Data, c.get2xxResultWithGRPCErrors(ctx, "/prom_status_tsdb HTTP[client]", &u, &v) + if err := c.get2xxResultWithGRPCErrors(ctx, "/prom_status_tsdb HTTP[client]", &u, &v); err != nil { + return nil, err + } + + if v.Data == nil { + return nil, errors.New("empty data field in TSDB status response") + } + return v.Data, nil } diff --git a/vendor/github.com/thanos-io/thanos/pkg/status/statuspb/custom.go b/vendor/github.com/thanos-io/thanos/pkg/status/statuspb/custom.go index 706bedb042f..70b5f7ad78a 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/status/statuspb/custom.go +++ b/vendor/github.com/thanos-io/thanos/pkg/status/statuspb/custom.go @@ -113,13 +113,15 @@ func (tse *TSDBStatisticsEntry) ToTSDBStats(limit int) tsdb.Stats { if len(tse.SeriesCountByMetricName) > 0 || len(tse.LabelValueCountByLabelName) > 0 || + len(tse.MemoryInBytesByLabelName) > 0 || len(tse.SeriesCountByLabelValuePair) > 0 || tse.HeadStatistics.NumLabelPairs > 0 { stats.IndexPostingStats = &index.PostingsStats{ NumLabelPairs: int(tse.HeadStatistics.NumLabelPairs), + CardinalityLabelStats: convertToIndexStats(tse.LabelValueCountByLabelName, limit), + LabelValueStats: convertToIndexStats(tse.MemoryInBytesByLabelName, limit), CardinalityMetricsStats: convertToIndexStats(tse.SeriesCountByMetricName, limit), - LabelValueStats: convertToIndexStats(tse.LabelValueCountByLabelName, limit), LabelValuePairsStats: convertToIndexStats(tse.SeriesCountByLabelValuePair, limit), } } diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go b/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go index 09f2e2492c2..bcc90f47908 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/bucket.go @@ -1577,7 +1577,7 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, seriesSrv storepb.Store stats = &queryStats{} respSets []respSet mtx sync.Mutex - g, gctx = errgroup.WithContext(ctx) + g, _ = errgroup.WithContext(ctx) resHints = &hintspb.SeriesResponseHints{} reqBlockMatchers []*labels.Matcher @@ -1628,7 +1628,6 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, seriesSrv storepb.Store for _, b := range blocks { blk := b - gctx := gctx if s.enableSeriesResponseHints { // Keep track of queried blocks. @@ -1666,14 +1665,6 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, seriesSrv storepb.Store defer blockClient.Close() g.Go(func() error { - - span, _ := tracing.StartSpan(gctx, "bucket_store_block_series", tracing.Tags{ - "block.id": blk.meta.ULID, - "block.mint": blk.meta.MinTime, - "block.maxt": blk.meta.MaxTime, - "block.resolution": blk.meta.Thanos.Downsample.Resolution, - }) - onClose := func() { mtx.Lock() stats = blockClient.MergeStats(stats) @@ -1685,14 +1676,12 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, seriesSrv storepb.Store seriesLimiter, ); err != nil { onClose() - span.Finish() return errors.Wrapf(err, "fetch postings for block %s", blk.meta.ULID) } var resp respSet if s.sortingStrategy == sortingStrategyStore { resp = newEagerRespSet( - span, 10*time.Minute, blk.meta.ULID.String(), []labels.Labels{blk.extLset}, @@ -1706,7 +1695,6 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, seriesSrv storepb.Store ) } else { resp = newLazyRespSet( - span, 10*time.Minute, blk.meta.ULID.String(), []labels.Labels{blk.extLset}, @@ -2157,13 +2145,6 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR indexr := b.indexReader(blockLogger) g.Go(func() error { - span, newCtx := tracing.StartSpan(gctx, "bucket_store_block_label_values", tracing.Tags{ - "block.id": b.meta.ULID, - "block.mint": b.meta.MinTime, - "block.maxt": b.meta.MaxTime, - "block.resolution": b.meta.Thanos.Downsample.Resolution, - }) - defer span.Finish() defer runutil.CloseWithLogOnErr(blockLogger, indexr, "label values") var result []string @@ -2187,7 +2168,7 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR WithoutReplicaLabels: req.WithoutReplicaLabels, } blockClient := newBlockSeriesClient( - newCtx, + gctx, blockLogger, b, seriesReq, diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/limiter.go b/vendor/github.com/thanos-io/thanos/pkg/store/limiter.go index 993330cc852..3b27a66d42c 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/limiter.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/limiter.go @@ -167,15 +167,26 @@ func newLimitedServer(upstream storepb.Store_SeriesServer, seriesLimiter SeriesL } func (i *limitedServer) Send(response *storepb.SeriesResponse) error { - series := response.GetSeries() - if series == nil { + var seriesCount, chunksCount uint64 + if series := response.GetSeries(); series != nil { + seriesCount = 1 + chunksCount = uint64(len(series.Chunks)) + } else if batch := response.GetBatch(); batch != nil { + for _, series := range batch.Series { + if series == nil { + continue + } + seriesCount++ + chunksCount += uint64(len(series.Chunks)) + } + } else { return i.Store_SeriesServer.Send(response) } - if err := i.seriesLimiter.Reserve(1); err != nil { + if err := i.seriesLimiter.Reserve(seriesCount); err != nil { return errors.Wrapf(err, "failed to send series") } - if err := i.samplesLimiter.Reserve(uint64(len(series.Chunks) * MaxSamplesPerChunk)); err != nil { + if err := i.samplesLimiter.Reserve(chunksCount * MaxSamplesPerChunk); err != nil { return errors.Wrapf(err, "failed to send samples") } diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/proxy.go b/vendor/github.com/thanos-io/thanos/pkg/store/proxy.go index 3a5fa414f60..c23181a9e73 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/proxy.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/proxy.go @@ -33,7 +33,6 @@ import ( "github.com/thanos-io/thanos/pkg/store/storepb" "github.com/thanos-io/thanos/pkg/strutil" "github.com/thanos-io/thanos/pkg/tenancy" - "github.com/thanos-io/thanos/pkg/tracing" ) type ctxKey int @@ -352,7 +351,7 @@ func (s *ProxyStore) Series(originalRequest *storepb.SeriesRequest, seriesSrv st var reporter statsReporter if tracker != nil && opIDOK { - _, storeAddr, _ := storeInfo(st) + _, storeAddr := storeInfo(st) reporter = func(rs RespSetStats) { tracker.AddStore(opID, fanout.StoreFanout{ EndpointAddr: storeAddr, @@ -468,16 +467,8 @@ func (s *ProxyStore) LabelNames(ctx context.Context, originalRequest *storepb.La g, gctx = errgroup.WithContext(ctx) ) for _, st := range stores { - - storeID, storeAddr, isLocalStore := storeInfo(st) g.Go(func() error { - span, spanCtx := tracing.StartSpan(gctx, "proxy.label_names", tracing.Tags{ - "store.id": storeID, - "store.addr": storeAddr, - "store.is_local": isLocalStore, - }) - defer span.Finish() - resp, err := st.LabelNames(spanCtx, r) + resp, err := st.LabelNames(gctx, r) if err != nil { err = errors.Wrapf(err, "fetch label names from store %s", st) if r.PartialResponseDisabled || r.PartialResponseStrategy == storepb.PartialResponseStrategy_ABORT { @@ -572,17 +563,8 @@ func (s *ProxyStore) LabelValues(ctx context.Context, originalRequest *storepb.L g, gctx = errgroup.WithContext(ctx) ) for _, st := range stores { - - storeID, storeAddr, isLocalStore := storeInfo(st) g.Go(func() error { - span, spanCtx := tracing.StartSpan(gctx, "proxy.label_values", tracing.Tags{ - "store.id": storeID, - "store.addr": storeAddr, - "store.is_local": isLocalStore, - }) - defer span.Finish() - - resp, err := st.LabelValues(spanCtx, r) + resp, err := st.LabelValues(gctx, r) if err != nil { err = errors.Wrapf(err, "fetch label values from store %s", st) if r.PartialResponseDisabled || r.PartialResponseStrategy == storepb.PartialResponseStrategy_ABORT { @@ -617,13 +599,13 @@ func (s *ProxyStore) LabelValues(ctx context.Context, originalRequest *storepb.L }, nil } -func storeInfo(st Client) (storeID string, storeAddr string, isLocalStore bool) { - storeAddr, isLocalStore = st.Addr() +func storeInfo(st Client) (storeID string, storeAddr string) { + storeAddr, _ = st.Addr() storeID = labelpb.PromLabelSetsToString(st.LabelSets()) if storeID == "" { storeID = "Store Gateway" } - return storeID, storeAddr, isLocalStore + return storeID, storeAddr } // storesForTSDBSelector returns stores that match the TSDBSelector filtering criteria. diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/proxy_merge.go b/vendor/github.com/thanos-io/thanos/pkg/store/proxy_merge.go index 3ff1a563e8e..9bc5e30ace9 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/proxy_merge.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/proxy_merge.go @@ -26,7 +26,6 @@ import ( "github.com/thanos-io/thanos/pkg/losertree" "github.com/thanos-io/thanos/pkg/store/labelpb" "github.com/thanos-io/thanos/pkg/store/storepb" - "github.com/thanos-io/thanos/pkg/tracing" ) type seriesStream interface { @@ -309,7 +308,6 @@ func (rb *ringBuffer) isFull() bool { // NB: It is not thread-safe, so its metholds must be called from the same goroutine. type lazyRespSet struct { // Generic parameters. - span opentracing.Span cl storepb.Store_SeriesClient closeSeries context.CancelFunc storeName string @@ -407,7 +405,6 @@ func (l *lazyRespSet) Close() { } func newLazyRespSet( - span opentracing.Span, frameTimeout time.Duration, storeName string, storeLabelSets []labels.Labels, @@ -427,7 +424,6 @@ func newLazyRespSet( storeLabelSets: storeLabelSets, cl: cl, closeSeries: closeSeries, - span: span, dataOrFinishEvent: sync.NewCond(bufferedResponsesMtx), bufferedResponsesMtx: bufferedResponsesMtx, rb: newRingBuffer(fixedBufferSize, bufferedResponsesMtx), @@ -451,12 +447,6 @@ func newLazyRespSet( numResponses := 0 defer func() { - l.span.SetTag("processed.series", seriesStats.Series) - l.span.SetTag("processed.chunks", seriesStats.Chunks) - l.span.SetTag("processed.samples", seriesStats.Samples) - l.span.SetTag("processed.bytes", bytesProcessed) - l.span.Finish() - reportStats(reportStatsFn, RespSetStats{ Duration: time.Since(startTime), BytesProcessed: int64(bytesProcessed), @@ -500,8 +490,6 @@ func newLazyRespSet( } else { rerr = errors.Wrapf(err, "receive series from %s", st) } - l.span.SetTag("err", rerr.Error()) - l.bufferedResponsesMtx.Lock() l.rb.append(storepb.NewWarnSeriesResponse(rerr)) l.noMoreData = true @@ -593,21 +581,12 @@ func newAsyncRespSet( reportStatsFn statsReporter, ) (respSet, error) { - var ( - span opentracing.Span - cancel context.CancelFunc - ) + var cancel context.CancelFunc - storeID, storeAddr, isLocalStore := storeInfo(st) + storeID, storeAddr := storeInfo(st) seriesCtx := grpc_opentracing.ClientAddContextTags(ctx, opentracing.Tags{ "target": storeAddr, }) - span, seriesCtx = tracing.StartSpan(seriesCtx, "proxy.series", tracing.Tags{ - "store.id": storeID, - "store.is_local": isLocalStore, - "store.addr": storeAddr, - "retrieval_strategy": retrievalStrategy, - }) seriesCtx, cancel = context.WithCancel(seriesCtx) @@ -621,9 +600,6 @@ func newAsyncRespSet( cl, err := st.Series(seriesCtx, req) if err != nil { err = errors.Wrapf(err, "fetch series for %s %s", storeID, st) - - span.SetTag("err", err.Error()) - span.Finish() cancel() return nil, err } @@ -648,7 +624,6 @@ func newAsyncRespSet( } return newLazyRespSet( - span, frameTimeout, st.String(), st.LabelSets(), @@ -662,7 +637,6 @@ func newAsyncRespSet( ), nil case EagerRetrieval: return newEagerRespSet( - span, frameTimeout, st.String(), st.LabelSets(), @@ -684,8 +658,6 @@ func newAsyncRespSet( // NOTE(bwplotka): It also resorts the series (and emits warning) if the client.SupportsWithoutReplicaLabels() is false. type eagerRespSet struct { // Generic parameters. - span opentracing.Span - cl storepb.Store_SeriesClient closeSeries context.CancelFunc frameTimeout time.Duration @@ -704,7 +676,6 @@ type eagerRespSet struct { } func newEagerRespSet( - span opentracing.Span, frameTimeout time.Duration, storeName string, storeLabelSets []labels.Labels, @@ -717,7 +688,6 @@ func newEagerRespSet( reportStatsFn statsReporter, ) respSet { ret := &eagerRespSet{ - span: span, cl: cl, closeSeries: closeSeries, frameTimeout: frameTimeout, @@ -745,12 +715,6 @@ func newEagerRespSet( numResponses := 0 defer func() { - l.span.SetTag("processed.series", seriesStats.Series) - l.span.SetTag("processed.chunks", seriesStats.Chunks) - l.span.SetTag("processed.samples", seriesStats.Samples) - l.span.SetTag("processed.bytes", bytesProcessed) - l.span.Finish() - reportStats(reportStatsFn, RespSetStats{ Duration: time.Since(startTime), BytesProcessed: int64(bytesProcessed), @@ -794,7 +758,6 @@ func newEagerRespSet( } l.bufferedResponses = append(l.bufferedResponses, storepb.NewWarnSeriesResponse(rerr)) - l.span.SetTag("err", rerr.Error()) return false } diff --git a/vendor/github.com/thanos-io/thanos/pkg/store/tsdb.go b/vendor/github.com/thanos-io/thanos/pkg/store/tsdb.go index c48abd373d8..31ae77d7c8f 100644 --- a/vendor/github.com/thanos-io/thanos/pkg/store/tsdb.go +++ b/vendor/github.com/thanos-io/thanos/pkg/store/tsdb.go @@ -482,6 +482,9 @@ func (s *TSDBStore) LabelValues(ctx context.Context, r *storepb.LabelValuesReque for set.Next() { return &storepb.LabelValuesResponse{Values: []string{val}}, nil } + if err := set.Err(); err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } return &storepb.LabelValuesResponse{}, nil } diff --git a/vendor/github.com/tjhop/slog-gokit/handler.go b/vendor/github.com/tjhop/slog-gokit/handler.go index 4743e301e0e..61d45d34fc5 100644 --- a/vendor/github.com/tjhop/slog-gokit/handler.go +++ b/vendor/github.com/tjhop/slog-gokit/handler.go @@ -4,6 +4,10 @@ import ( "context" "log/slog" "os" + "runtime" + "strconv" + "strings" + "sync" "github.com/go-kit/log" ) @@ -12,19 +16,32 @@ var _ slog.Handler = (*GoKitHandler)(nil) var defaultGoKitLogger = log.NewLogfmtLogger(os.Stderr) -// Pay boxing cost once at package init, save 2 heap escapes per Handle() call. +// Pay boxing cost once at package init, save 3 heap escapes per Handle() call. var ( - timeKey any = slog.TimeKey - msgKey any = slog.MessageKey + timeKey any = slog.TimeKey + msgKey any = slog.MessageKey + callerKey any = "caller" ) +// callerCache memoizes resolved caller strings keyed by record PC. A PC's +// file:line mapping is fixed for the process lifetime and log call sites are +// static, so the cache is write-once, read-many and bounded by the number of +// distinct call sites. +// +// Kubernetes's klog does something similar to cache per-call-site verbosity +// levels by PC (`vmap` in +// https://github.com/kubernetes/klog/blob/main/klog.go). +// +// Values are stored pre-boxed as `any` so cache hits append into the pairs +// slice with zero allocations, and no need to walk the call stack. +var callerCache sync.Map // map[uintptr]any, values are `file:line` strings. + // GoKitHandler implements the slog.Handler interface. It holds an internal // go-kit logger that is used to perform the true logging. type GoKitHandler struct { level slog.Leveler logger log.Logger - levelLoggers *levelLoggerCache // pre-built leveled loggers - preformatted []any // pre-flattened key-value pairs, ready to pass directly to logger.Log() + preformatted []any // pre-flattened key-value pairs, ready to pass directly to logger.Log() group string } @@ -32,23 +49,23 @@ type GoKitHandler struct { // logger. Calls to the slog logger are chained to the handler's internal // go-kit logger. If provided a level, it will be used to filter log events in // the handler's Enabled() method. +// +// The handler adds a `caller` key to each record, resolved from the program +// counter that slog captured at the log call site. Records handled directly +// (without going through an slog.Logger) have no PC set, and thus omit the +// caller. func NewGoKitHandler(logger log.Logger, level slog.Leveler) slog.Handler { if logger == nil { logger = defaultGoKitLogger } - // Adjust runtime call depth to compensate for the adapter and point to - // the appropriate source line. - logger = log.With(logger, "caller", log.Caller(6)) - if level == nil { level = &slog.LevelVar{} // Info level by default. } return &GoKitHandler{ - logger: logger, - level: level, - levelLoggers: newLevelCache(logger), + logger: logger, + level: level, } } @@ -63,21 +80,51 @@ func (h *GoKitHandler) Enabled(_ context.Context, level slog.Level) bool { // are formatted and added to the log call as individual key/value pairs. It // implements slog.Handler. func (h *GoKitHandler) Handle(_ context.Context, record slog.Record) error { - logger := h.levelLoggers.get(record.Level) - - // Pre-compute slice capacity. h.preformatted is already flattened to []any - // key-value pairs at WithAttrs time, so len(h.preformatted) is the exact - // item count -- no expansion buffer needed for that portion. Record attrs - // may contain groups that expand beyond 2 items per attr, so include a 50% - // buffer for that portion's estimated capacity only. - // - // We know we need: + // Pre-compute slice capacity, sized exactly for records with flat attrs + // (the common shape): + // - 2 for level (key + value) + // - 2 for caller (key + value) // - 2 for timestamp (key + value) // - 2 for message (key + value) - // - len(h.preformatted) exact items (pre-flattened, no expansion) - // - 2 * record.NumAttrs() for record attrs, +50% buffer for group expansion - capacity := 4 + len(h.preformatted) + (3 * record.NumAttrs()) + // - len(h.preformatted) exact items (pre-flattened at WithAttrs time) + // - 2 * record.NumAttrs() for record attrs + // + // Group attrs expand beyond 2 items per attr (a group with n items + // counts as one attr but flattens to 2n entries), so they'll need to + // be grown anyway. + numAttrs := record.NumAttrs() + capacity := 8 + len(h.preformatted) + (2 * numAttrs) pairs := make([]any, 0, capacity) + + // Append the level directly as the first pair. Matches how the log + // message is constructed through level.Info()/level.Debug()/etc + // wrappers, but without the extra allocation/copy per call. + pairs = append(pairs, levelKey, gokitLevelValue(record.Level)) + + // Resolve the log call site from the PC that slog captured when the + // record was created. Cheaper and more accurate to do it here since + // it's already captured, vs relying on setting `log.Caller()` depth + // and hoping it unwinds correctly. + if record.PC != 0 { + if caller, ok := callerCache.Load(record.PC); ok { + pairs = append(pairs, callerKey, caller) + } else { + fs := runtime.CallersFrames([]uintptr{record.PC}) + f, _ := fs.Next() + if f.File != "" { + // Trim to basename:line with the same logic as + // go-kit's log.Caller: + // https://github.com/go-kit/log/blob/v0.2.1/value.go#L84-L93 + // + // path.Base() would work, opting for direct compatibility. + idx := strings.LastIndexByte(f.File, '/') + caller := any(f.File[idx+1:] + ":" + strconv.Itoa(f.Line)) + callerCache.Store(record.PC, caller) + pairs = append(pairs, callerKey, caller) + } + } + } + if !record.Time.IsZero() { pairs = append(pairs, timeKey, record.Time) } @@ -87,17 +134,25 @@ func (h *GoKitHandler) Handle(_ context.Context, record slog.Record) error { // WithAttrs() call. pairs = append(pairs, h.preformatted...) - record.Attrs(func(a slog.Attr) bool { - pairs = appendPair(pairs, h.group, a) - return true - }) + // Skip the Attrs() call entirely when there are no attrs. + if numAttrs > 0 { + record.Attrs(func(a slog.Attr) bool { + pairs = appendPair(pairs, h.group, a) + return true + }) + } - return logger.Log(pairs...) + return h.logger.Log(pairs...) } // WithAttrs formats the provided attributes and caches them in the handler to // attach to all future log calls. It implements slog.Handler. func (h *GoKitHandler) WithAttrs(attrs []slog.Attr) slog.Handler { + // No attrs, return it untouched. + if len(attrs) == 0 { + return h + } + // Make a defensive copy of preformatted attrs to avoid race conditions // when multiple goroutines call WithAttrs concurrently on the same handler. // Attrs are pre-flattened to []any key-value pairs here so that Handle() @@ -115,7 +170,6 @@ func (h *GoKitHandler) WithAttrs(attrs []slog.Attr) slog.Handler { return &GoKitHandler{ logger: h.logger, level: h.level, - levelLoggers: h.levelLoggers, preformatted: pairs, group: h.group, } @@ -136,13 +190,20 @@ func (h *GoKitHandler) WithGroup(name string) slog.Handler { return &GoKitHandler{ logger: h.logger, level: h.level, - levelLoggers: h.levelLoggers, preformatted: h.preformatted, group: g, } } func appendPair(pairs []any, groupPrefix string, attr slog.Attr) []any { + // Resolve LogValuers before the kind switch so value that resolves to + // a group is expanded into individual pairs. Aligns with how the + // stdlib handlers resolve before expanding, and also avoids the + // defer/recover that `Resolve()` incurs. + if attr.Value.Kind() == slog.KindLogValuer { + attr.Value = attr.Value.Resolve() + } + if attr.Equal(slog.Attr{}) { return pairs } @@ -175,7 +236,14 @@ func appendPair(pairs []any, groupPrefix string, attr slog.Attr) []any { key = groupPrefix + "." + key } - pairs = append(pairs, key, attr.Value.Resolve()) + // Append string values as raw strings rather than boxed + // slog.Values, lean on string path optimizations in slog and + // go-kit/log. + if attr.Value.Kind() == slog.KindString { + pairs = append(pairs, key, attr.Value.String()) + } else { + pairs = append(pairs, key, attr.Value) + } } return pairs diff --git a/vendor/github.com/tjhop/slog-gokit/level.go b/vendor/github.com/tjhop/slog-gokit/level.go index 58b0b58ade8..29c10d0d9f2 100644 --- a/vendor/github.com/tjhop/slog-gokit/level.go +++ b/vendor/github.com/tjhop/slog-gokit/level.go @@ -3,38 +3,34 @@ package sloggokit import ( "log/slog" - "github.com/go-kit/log" "github.com/go-kit/log/level" ) -// levelLoggerCache holds pre-built leveled loggers so that Handle() can -// retrieve an existing leveled logger rather than creating a new one each -// time. -type levelLoggerCache struct { - debugLogger log.Logger - infoLogger log.Logger - warnLogger log.Logger - errorLogger log.Logger -} - -func newLevelCache(logger log.Logger) *levelLoggerCache { - return &levelLoggerCache{ - debugLogger: level.Debug(logger), - infoLogger: level.Info(logger), - warnLogger: level.Warn(logger), - errorLogger: level.Error(logger), - } -} +// go-kit/log hoists these into package level variables to pre-pay boxing cost +// once, same that we do for slog keys in the handler: +// https://github.com/go-kit/log/blob/v0.2.1/level/level.go#L229-L239 +// +// Re-hoist them here for the same reasons so they can be appended right into +// the log's kv pairs. +var ( + levelKey any = level.Key() + debugLevelValue any = level.DebugValue() + infoLevelValue any = level.InfoValue() + warnLevelValue any = level.WarnValue() + errorLevelValue any = level.ErrorValue() +) -func (c *levelLoggerCache) get(lvl slog.Level) log.Logger { +// gokitLevelValue maps an slog.Level to the boxed go-kit level value. +// Unnamed levels bucket to the highest named level at or below them. +func gokitLevelValue(lvl slog.Level) any { switch { case lvl >= slog.LevelError: - return c.errorLogger + return errorLevelValue case lvl >= slog.LevelWarn: - return c.warnLogger + return warnLevelValue case lvl >= slog.LevelInfo: - return c.infoLogger + return infoLevelValue default: - return c.debugLogger + return debugLevelValue } } diff --git a/vendor/modules.txt b/vendor/modules.txt index 0d87a6c6f28..2b7c63658bb 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1291,7 +1291,7 @@ github.com/thanos-io/objstore/providers/oss 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-20260729073658-f8bd3f940687 +# github.com/thanos-io/promql-engine v0.0.0-20260817205454-68fb2c2c5d9b ## explicit; go 1.24.0 github.com/thanos-io/promql-engine/api github.com/thanos-io/promql-engine/compute @@ -1316,7 +1316,7 @@ github.com/thanos-io/promql-engine/ringbuffer github.com/thanos-io/promql-engine/storage github.com/thanos-io/promql-engine/storage/prometheus github.com/thanos-io/promql-engine/warnings -# github.com/thanos-io/thanos v0.42.1-0.20260727122508-92397939e4cc +# github.com/thanos-io/thanos v0.42.5-0.20260817064418-8908023d563b ## explicit; go 1.26.0 github.com/thanos-io/thanos/pkg/api/query/querypb github.com/thanos-io/thanos/pkg/block @@ -1381,7 +1381,7 @@ github.com/thanos-io/thanos/pkg/tracing/util/metautils ## explicit; go 1.24 github.com/tinylib/msgp/msgp github.com/tinylib/msgp/msgp/setof -# github.com/tjhop/slog-gokit v0.2.0 +# github.com/tjhop/slog-gokit v0.2.2 ## explicit; go 1.21 github.com/tjhop/slog-gokit # github.com/twmb/franz-go v1.21.2