From 833c65b4c9564aa9faa8347de1c74ea13d56e05a Mon Sep 17 00:00:00 2001 From: Yu Long Date: Fri, 18 Apr 2025 18:53:55 +0000 Subject: [PATCH 01/11] design v2 --- pkg/query/aggregation_label_rewriter.go | 4 ++-- pkg/query/aggregation_label_rewriter_test.go | 21 ++++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/pkg/query/aggregation_label_rewriter.go b/pkg/query/aggregation_label_rewriter.go index b856f58e42f..d5f6edeab40 100644 --- a/pkg/query/aggregation_label_rewriter.go +++ b/pkg/query/aggregation_label_rewriter.go @@ -15,7 +15,7 @@ import ( ) const ( - aggregationLabelName = "__rollup__" + aggregationLabelName = "__agg_rule_type__" ) type AggregationLabelRewriter struct { @@ -128,7 +128,7 @@ func (a *AggregationLabelRewriter) Rewrite(ms []*labels.Matcher) []*labels.Match if needsRewrite { newMatcher := &labels.Matcher{ Name: aggregationLabelName, - Type: labels.MatchEqual, + Type: labels.MatchRegexp, Value: a.desiredLabelValue, } if aggregationLabelMatcher != nil { diff --git a/pkg/query/aggregation_label_rewriter_test.go b/pkg/query/aggregation_label_rewriter_test.go index 038c3239a2e..7cdc2efec3f 100644 --- a/pkg/query/aggregation_label_rewriter_test.go +++ b/pkg/query/aggregation_label_rewriter_test.go @@ -41,20 +41,33 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { }, expectedMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), - labels.MustNewMatcher(labels.MatchEqual, "__rollup__", "5m"), + labels.MustNewMatcher(labels.MatchRegexp, aggregationLabelName, "5m"), }, expectedAddCount: 1, }, { - name: "should rewrite existing aggregation label for aggregated metric", + name: "should rewrite existing equal aggregation label for aggregated metric", desiredLabelValue: "5m", inputMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), - labels.MustNewMatcher(labels.MatchEqual, "__rollup__", "1h"), + labels.MustNewMatcher(labels.MatchEqual, aggregationLabelName, "1h"), }, expectedMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), - labels.MustNewMatcher(labels.MatchEqual, "__rollup__", "5m"), + labels.MustNewMatcher(labels.MatchRegexp, aggregationLabelName, "5m"), + }, + expectedRewriteMap: map[string]float64{"1h": 1}, + }, + { + name: "should rewrite existing regex aggregation label for aggregated metric", + desiredLabelValue: "5m", + inputMatchers: []*labels.Matcher{ + labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), + labels.MustNewMatcher(labels.MatchRegexp, aggregationLabelName, "1h"), + }, + expectedMatchers: []*labels.Matcher{ + labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), + labels.MustNewMatcher(labels.MatchRegexp, aggregationLabelName, "5m"), }, expectedRewriteMap: map[string]float64{"1h": 1}, }, From 289f48c24d233a5ebdf81a89bbad042be116e70a Mon Sep 17 00:00:00 2001 From: Yu Long Date: Fri, 18 Apr 2025 19:24:51 +0000 Subject: [PATCH 02/11] design v2 --- cmd/thanos/query.go | 10 +++++++++- pkg/query/aggregation_label_rewriter.go | 20 ++++++++++++------- pkg/query/aggregation_label_rewriter_test.go | 21 ++++++++++++++++++++ pkg/query/querier.go | 4 ++++ 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/cmd/thanos/query.go b/cmd/thanos/query.go index c67d25ccb8e..51ec042154c 100644 --- a/cmd/thanos/query.go +++ b/cmd/thanos/query.go @@ -245,7 +245,9 @@ func registerQuery(app *extkingpin.App) { enforceTenancy := cmd.Flag("query.enforce-tenancy", "Enforce tenancy on Query APIs. Responses are returned only if the label value of the configured tenant-label-name and the value of the tenant header matches.").Default("false").Bool() tenantLabel := cmd.Flag("query.tenant-label-name", "Label name to use when enforcing tenancy (if --query.enforce-tenancy is enabled).").Default(tenancy.DefaultTenantLabel).String() - rewriteAggregationLabelTo := cmd.Flag("query.aggregation-label-value-override", "The value override for __rollup__ label for aggregated metrics. If set to x, all queries on aggregated metrics will have a __rollup__=x matcher. Leave empty to disable this behavior. Default is empty.").Default("").String() + rewriteAggregationLabelName := cmd.Flag("query.aggregation-label-name", "The name for aggregation label. See query.aggregation-label-value-override for details. Default is empty.").Default("").String() + rewriteAggregationLabelTo := cmd.Flag("query.aggregation-label-value-override", "The value override for aggregation label. If set to x, all queries on aggregated metrics will have a `rewriteAggregationLabelName=x` matcher. Leave either flag empty to disable this behavior. Default is empty.").Default("").String() + rewriteAggregationInsertOnly := cmd.Flag("query.aggregation-label-insert-only", "If enabled, the above rewriter only insert missing rewriteAggregationLabelName=x and does not modify existing aggregation labels if any. Default is false.").Default("false").Bool() var storeRateLimits store.SeriesSelectLimits storeRateLimits.RegisterFlags(cmd) @@ -386,7 +388,9 @@ func registerQuery(app *extkingpin.App) { *enforceTenancy, *tenantLabel, *enableGroupReplicaPartialStrategy, + *rewriteAggregationLabelName, *rewriteAggregationLabelTo, + *rewriteAggregationInsertOnly, ) }) } @@ -471,7 +475,9 @@ func runQuery( enforceTenancy bool, tenantLabel string, groupReplicaPartialResponseStrategy bool, + rewriteAggregationLabelName string, rewriteAggregationLabelTo string, + rewriteAggregationInsertOnly bool, ) error { comp := component.Query if alertQueryURL == "" { @@ -601,6 +607,8 @@ func runQuery( opts := query.Options{ GroupReplicaPartialResponseStrategy: groupReplicaPartialResponseStrategy, DeduplicationFunc: queryDeduplicationFunc, + RewriteAggregationInsertOnly: rewriteAggregationInsertOnly, + RewriteAggregationLabelName: rewriteAggregationLabelName, RewriteAggregationLabelTo: rewriteAggregationLabelTo, } level.Info(logger).Log("msg", "databricks querier features", "opts", fmt.Sprintf("%+v", opts)) diff --git a/pkg/query/aggregation_label_rewriter.go b/pkg/query/aggregation_label_rewriter.go index d5f6edeab40..76d4659fe6c 100644 --- a/pkg/query/aggregation_label_rewriter.go +++ b/pkg/query/aggregation_label_rewriter.go @@ -14,15 +14,13 @@ import ( "github.com/prometheus/prometheus/model/labels" ) -const ( - aggregationLabelName = "__agg_rule_type__" -) - type AggregationLabelRewriter struct { logger log.Logger metrics *aggregationLabelRewriterMetrics enabled bool + insertOnly bool + labelKey string desiredLabelValue string } @@ -74,7 +72,7 @@ func NewNopAggregationLabelRewriter() *AggregationLabelRewriter { } } -func NewAggregationLabelRewriter(logger log.Logger, reg prometheus.Registerer, desiredLabelValue string) *AggregationLabelRewriter { +func NewAggregationLabelRewriter(logger log.Logger, reg prometheus.Registerer, labelKey string, desiredLabelValue string, insertOnly bool) *AggregationLabelRewriter { if logger == nil { logger = log.NewNopLogger() } @@ -82,6 +80,8 @@ func NewAggregationLabelRewriter(logger log.Logger, reg prometheus.Registerer, d enabled: desiredLabelValue != "", logger: logger, metrics: newAggregationLabelRewriterMetrics(reg, desiredLabelValue), + insertOnly: insertOnly, + labelKey: labelKey, desiredLabelValue: desiredLabelValue, } } @@ -118,16 +118,22 @@ func (a *AggregationLabelRewriter) Rewrite(ms []*labels.Matcher) []*labels.Match break } // In any case, if we see an aggregation label, we store that for later use - } else if m.Name == aggregationLabelName { + } else if m.Name == a.labelKey { aggregationLabelMatcher = m aggregationLabelIndex = i } } + + if aggregationLabelMatcher != nil && a.insertOnly { + needsRewrite = false + skipReason = "insert-only" + } + // After the for loop, if needsRewrite is false, no need to do anything // but if it is true, we either append or modify an aggregation label if needsRewrite { newMatcher := &labels.Matcher{ - Name: aggregationLabelName, + Name: a.labelKey, Type: labels.MatchRegexp, Value: a.desiredLabelValue, } diff --git a/pkg/query/aggregation_label_rewriter_test.go b/pkg/query/aggregation_label_rewriter_test.go index 7cdc2efec3f..37446e2f3ee 100644 --- a/pkg/query/aggregation_label_rewriter_test.go +++ b/pkg/query/aggregation_label_rewriter_test.go @@ -11,12 +11,17 @@ import ( "github.com/prometheus/prometheus/model/labels" ) +const ( + aggregationLabelName = "__agg_rule_type__" +) + func TestAggregationLabelRewriter_Rewrite(t *testing.T) { t.Parallel() for _, tc := range []struct { name string desiredLabelValue string // Empty means disabled + insertOnly bool inputMatchers []*labels.Matcher expectedMatchers []*labels.Matcher expectedSkipCount float64 @@ -104,13 +109,29 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { }, expectedSkipCount: 1, }, + { + name: "if insert only, should NOT rewrite existing aggregation label for aggregated metric", + desiredLabelValue: "5m", + insertOnly: true, + inputMatchers: []*labels.Matcher{ + labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), + labels.MustNewMatcher(labels.MatchEqual, aggregationLabelName, "1h"), + }, + expectedMatchers: []*labels.Matcher{ + labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), + labels.MustNewMatcher(labels.MatchEqual, aggregationLabelName, "1h"), + }, + expectedSkipCount: 1, + }, } { t.Run(tc.name, func(t *testing.T) { reg := prometheus.NewRegistry() rewriter := NewAggregationLabelRewriter( nil, reg, + aggregationLabelName, tc.desiredLabelValue, + tc.insertOnly, ) result := rewriter.Rewrite(tc.inputMatchers) diff --git a/pkg/query/querier.go b/pkg/query/querier.go index 953aa135beb..428ced4cb2f 100644 --- a/pkg/query/querier.go +++ b/pkg/query/querier.go @@ -61,7 +61,9 @@ type QueryableCreator func( type Options struct { GroupReplicaPartialResponseStrategy bool DeduplicationFunc string + RewriteAggregationLabelName string RewriteAggregationLabelTo string + RewriteAggregationInsertOnly bool } // NewQueryableCreator creates QueryableCreator. @@ -94,7 +96,9 @@ func NewQueryableCreatorWithOptions( aggregationLabelRewriter := NewAggregationLabelRewriter( logger, extprom.WrapRegistererWithPrefix("aggregation_label_rewriter_", reg), + opts.RewriteAggregationLabelName, opts.RewriteAggregationLabelTo, + opts.RewriteAggregationInsertOnly, ) return func( deduplicate bool, From 2b03e6bbce59da215ca622fc8df9a96633bdbf9f Mon Sep 17 00:00:00 2001 From: Yu Long Date: Fri, 18 Apr 2025 19:32:02 +0000 Subject: [PATCH 03/11] design v2 --- pkg/query/aggregation_label_rewriter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/query/aggregation_label_rewriter.go b/pkg/query/aggregation_label_rewriter.go index 76d4659fe6c..984862579f6 100644 --- a/pkg/query/aggregation_label_rewriter.go +++ b/pkg/query/aggregation_label_rewriter.go @@ -77,7 +77,7 @@ func NewAggregationLabelRewriter(logger log.Logger, reg prometheus.Registerer, l logger = log.NewNopLogger() } return &AggregationLabelRewriter{ - enabled: desiredLabelValue != "", + enabled: desiredLabelValue != "" || labelKey != "", logger: logger, metrics: newAggregationLabelRewriterMetrics(reg, desiredLabelValue), insertOnly: insertOnly, From 55a240a5dd52e44d6b5ae45966b3d628703138b6 Mon Sep 17 00:00:00 2001 From: Yu Long Date: Fri, 18 Apr 2025 19:33:43 +0000 Subject: [PATCH 04/11] design v2 --- pkg/query/aggregation_label_rewriter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/query/aggregation_label_rewriter.go b/pkg/query/aggregation_label_rewriter.go index 984862579f6..e0eec211e66 100644 --- a/pkg/query/aggregation_label_rewriter.go +++ b/pkg/query/aggregation_label_rewriter.go @@ -77,7 +77,7 @@ func NewAggregationLabelRewriter(logger log.Logger, reg prometheus.Registerer, l logger = log.NewNopLogger() } return &AggregationLabelRewriter{ - enabled: desiredLabelValue != "" || labelKey != "", + enabled: desiredLabelValue != "" && labelKey != "", logger: logger, metrics: newAggregationLabelRewriterMetrics(reg, desiredLabelValue), insertOnly: insertOnly, From 8821811ec6f4b90f93f6cc55b1fd07c8c42a8452 Mon Sep 17 00:00:00 2001 From: Yuchen Wang Date: Sat, 19 Apr 2025 18:35:57 -0700 Subject: [PATCH 05/11] fix coroutine leak --- pkg/store/proxy_merge.go | 4 ++-- pkg/store/storepb/inprocess.go | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/store/proxy_merge.go b/pkg/store/proxy_merge.go index 378ac789881..34749570662 100644 --- a/pkg/store/proxy_merge.go +++ b/pkg/store/proxy_merge.go @@ -558,13 +558,13 @@ func newAsyncRespSet( func (l *lazyRespSet) Close() { l.bufferedResponsesMtx.Lock() defer l.bufferedResponsesMtx.Unlock() + _ = l.cl.CloseSend() l.closeSeries() l.noMoreData = true l.dataOrFinishEvent.Signal() l.shardMatcher.Close() - _ = l.cl.CloseSend() } // eagerRespSet is a SeriesSet that blocks until all data is retrieved from @@ -750,11 +750,11 @@ func sortWithoutLabels(set []*storepb.SeriesResponse, labelsToRemove map[string] } func (l *eagerRespSet) Close() { + _ = l.cl.CloseSend() if l.closeSeries != nil { l.closeSeries() } l.shardMatcher.Close() - _ = l.cl.CloseSend() } func (l *eagerRespSet) At() *storepb.SeriesResponse { diff --git a/pkg/store/storepb/inprocess.go b/pkg/store/storepb/inprocess.go index 0c3e7641baa..76a0d245640 100644 --- a/pkg/store/storepb/inprocess.go +++ b/pkg/store/storepb/inprocess.go @@ -7,6 +7,7 @@ import ( "context" "io" "iter" + "sync" "google.golang.org/grpc" ) @@ -38,6 +39,7 @@ type inProcessClient struct { ctx context.Context next func() (*SeriesResponse, error, bool) stop func() + mu sync.Mutex } func newInProcessClient(ctx context.Context, next func() (*SeriesResponse, error, bool), stop func()) *inProcessClient { @@ -45,11 +47,14 @@ func newInProcessClient(ctx context.Context, next func() (*SeriesResponse, error ctx: ctx, next: next, stop: stop, + mu: sync.Mutex{}, } } func (c *inProcessClient) Recv() (*SeriesResponse, error) { + c.mu.Lock() resp, err, ok := c.next() + c.mu.Unlock() if err != nil { c.stop() return nil, err @@ -68,7 +73,9 @@ func (c *inProcessClient) Context() context.Context { } func (c *inProcessClient) CloseSend() error { + c.mu.Lock() c.stop() + c.mu.Unlock() return nil } From ba19b891171750d0ad0179a406ebcec5c9d52a29 Mon Sep 17 00:00:00 2001 From: Yuchen Wang Date: Sat, 19 Apr 2025 18:41:36 -0700 Subject: [PATCH 06/11] use defer to unlock --- pkg/store/storepb/inprocess.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/store/storepb/inprocess.go b/pkg/store/storepb/inprocess.go index 76a0d245640..d76301b42c2 100644 --- a/pkg/store/storepb/inprocess.go +++ b/pkg/store/storepb/inprocess.go @@ -53,8 +53,8 @@ func newInProcessClient(ctx context.Context, next func() (*SeriesResponse, error func (c *inProcessClient) Recv() (*SeriesResponse, error) { c.mu.Lock() + defer c.mu.Unlock() resp, err, ok := c.next() - c.mu.Unlock() if err != nil { c.stop() return nil, err @@ -74,8 +74,8 @@ func (c *inProcessClient) Context() context.Context { func (c *inProcessClient) CloseSend() error { c.mu.Lock() + defer c.mu.Unlock() c.stop() - c.mu.Unlock() return nil } From 865c60c182f9ab96c44258f7f58c066a9a5c1eb6 Mon Sep 17 00:00:00 2001 From: Yuchen Wang Date: Sat, 19 Apr 2025 22:20:15 -0700 Subject: [PATCH 07/11] revert close order change --- pkg/store/proxy_merge.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/store/proxy_merge.go b/pkg/store/proxy_merge.go index 34749570662..378ac789881 100644 --- a/pkg/store/proxy_merge.go +++ b/pkg/store/proxy_merge.go @@ -558,13 +558,13 @@ func newAsyncRespSet( func (l *lazyRespSet) Close() { l.bufferedResponsesMtx.Lock() defer l.bufferedResponsesMtx.Unlock() - _ = l.cl.CloseSend() l.closeSeries() l.noMoreData = true l.dataOrFinishEvent.Signal() l.shardMatcher.Close() + _ = l.cl.CloseSend() } // eagerRespSet is a SeriesSet that blocks until all data is retrieved from @@ -750,11 +750,11 @@ func sortWithoutLabels(set []*storepb.SeriesResponse, labelsToRemove map[string] } func (l *eagerRespSet) Close() { - _ = l.cl.CloseSend() if l.closeSeries != nil { l.closeSeries() } l.shardMatcher.Close() + _ = l.cl.CloseSend() } func (l *eagerRespSet) At() *storepb.SeriesResponse { From 08b1526ece8a314aa006bf8cb488f5c8bf065d0b Mon Sep 17 00:00:00 2001 From: Yu Long Date: Tue, 22 Apr 2025 20:20:25 +0000 Subject: [PATCH 08/11] address feedback --- cmd/thanos/query.go | 14 +++---- pkg/query/aggregation_label_rewriter.go | 44 +++++++++++++------- pkg/query/aggregation_label_rewriter_test.go | 29 +++++++++---- pkg/query/querier.go | 6 +-- 4 files changed, 57 insertions(+), 36 deletions(-) diff --git a/cmd/thanos/query.go b/cmd/thanos/query.go index 51ec042154c..f952138de26 100644 --- a/cmd/thanos/query.go +++ b/cmd/thanos/query.go @@ -245,9 +245,8 @@ func registerQuery(app *extkingpin.App) { enforceTenancy := cmd.Flag("query.enforce-tenancy", "Enforce tenancy on Query APIs. Responses are returned only if the label value of the configured tenant-label-name and the value of the tenant header matches.").Default("false").Bool() tenantLabel := cmd.Flag("query.tenant-label-name", "Label name to use when enforcing tenancy (if --query.enforce-tenancy is enabled).").Default(tenancy.DefaultTenantLabel).String() - rewriteAggregationLabelName := cmd.Flag("query.aggregation-label-name", "The name for aggregation label. See query.aggregation-label-value-override for details. Default is empty.").Default("").String() - rewriteAggregationLabelTo := cmd.Flag("query.aggregation-label-value-override", "The value override for aggregation label. If set to x, all queries on aggregated metrics will have a `rewriteAggregationLabelName=x` matcher. Leave either flag empty to disable this behavior. Default is empty.").Default("").String() - rewriteAggregationInsertOnly := cmd.Flag("query.aggregation-label-insert-only", "If enabled, the above rewriter only insert missing rewriteAggregationLabelName=x and does not modify existing aggregation labels if any. Default is false.").Default("false").Bool() + rewriteAggregationLabelStrategy := cmd.Flag("query.aggregation-label-strategy", "The strategy to use when rewriting aggregation labels. Used during aggregator migration only.").Default(string(query.NoopLabelRewriter)).Hidden().Enum(string(query.NoopLabelRewriter), string(query.UpsertLabelRewriter), string(query.InsertOnlyLabelRewriter)) + rewriteAggregationLabelTo := cmd.Flag("query.aggregation-label-value-override", "The value override for aggregation label. If set to x, all queries on aggregated metrics will have a `__agg_rule_type__=x` matcher. If empty, this behavior is disabled. Default is empty.").Hidden().Default("").String() var storeRateLimits store.SeriesSelectLimits storeRateLimits.RegisterFlags(cmd) @@ -388,9 +387,8 @@ func registerQuery(app *extkingpin.App) { *enforceTenancy, *tenantLabel, *enableGroupReplicaPartialStrategy, - *rewriteAggregationLabelName, + *rewriteAggregationLabelStrategy, *rewriteAggregationLabelTo, - *rewriteAggregationInsertOnly, ) }) } @@ -475,9 +473,8 @@ func runQuery( enforceTenancy bool, tenantLabel string, groupReplicaPartialResponseStrategy bool, - rewriteAggregationLabelName string, + rewriteAggregationLabelStrategy string, rewriteAggregationLabelTo string, - rewriteAggregationInsertOnly bool, ) error { comp := component.Query if alertQueryURL == "" { @@ -607,8 +604,7 @@ func runQuery( opts := query.Options{ GroupReplicaPartialResponseStrategy: groupReplicaPartialResponseStrategy, DeduplicationFunc: queryDeduplicationFunc, - RewriteAggregationInsertOnly: rewriteAggregationInsertOnly, - RewriteAggregationLabelName: rewriteAggregationLabelName, + RewriteAggregationLabelStrategy: rewriteAggregationLabelStrategy, RewriteAggregationLabelTo: rewriteAggregationLabelTo, } level.Info(logger).Log("msg", "databricks querier features", "opts", fmt.Sprintf("%+v", opts)) diff --git a/pkg/query/aggregation_label_rewriter.go b/pkg/query/aggregation_label_rewriter.go index e0eec211e66..e17d8d3915f 100644 --- a/pkg/query/aggregation_label_rewriter.go +++ b/pkg/query/aggregation_label_rewriter.go @@ -14,13 +14,26 @@ import ( "github.com/prometheus/prometheus/model/labels" ) -type AggregationLabelRewriter struct { - logger log.Logger - metrics *aggregationLabelRewriterMetrics +// RewriterStrategy defines the strategy used by the AggregationLabelRewriter. +type RewriterStrategy string + +const ( + // NoopLabelRewriter is a no-op strategy that basically disables the rewriter. + NoopLabelRewriter RewriterStrategy = "noop" + // UpsertLabelRewriter is a strategy that upserts the aggregation label. + UpsertLabelRewriter RewriterStrategy = "upsert" + // InsertOnlyLabelRewriter is a strategy that only inserts the aggregation label if it does not exist. + InsertOnlyLabelRewriter RewriterStrategy = "insert-only" +) + +const ( + aggregationLabelName = "__agg_rule_type__" +) - enabled bool - insertOnly bool - labelKey string +type AggregationLabelRewriter struct { + logger log.Logger + metrics *aggregationLabelRewriterMetrics + strategy RewriterStrategy desiredLabelValue string } @@ -68,26 +81,27 @@ func newAggregationLabelRewriterMetrics(reg prometheus.Registerer, desiredLabelV func NewNopAggregationLabelRewriter() *AggregationLabelRewriter { return &AggregationLabelRewriter{ - enabled: false, + strategy: NoopLabelRewriter, } } -func NewAggregationLabelRewriter(logger log.Logger, reg prometheus.Registerer, labelKey string, desiredLabelValue string, insertOnly bool) *AggregationLabelRewriter { +func NewAggregationLabelRewriter(logger log.Logger, reg prometheus.Registerer, strategy RewriterStrategy, desiredLabelValue string) *AggregationLabelRewriter { if logger == nil { logger = log.NewNopLogger() } + if desiredLabelValue == "" { + strategy = NoopLabelRewriter + } return &AggregationLabelRewriter{ - enabled: desiredLabelValue != "" && labelKey != "", + strategy: strategy, logger: logger, metrics: newAggregationLabelRewriterMetrics(reg, desiredLabelValue), - insertOnly: insertOnly, - labelKey: labelKey, desiredLabelValue: desiredLabelValue, } } func (a *AggregationLabelRewriter) Rewrite(ms []*labels.Matcher) []*labels.Matcher { - if !a.enabled { + if a.strategy == NoopLabelRewriter { return ms } @@ -118,13 +132,13 @@ func (a *AggregationLabelRewriter) Rewrite(ms []*labels.Matcher) []*labels.Match break } // In any case, if we see an aggregation label, we store that for later use - } else if m.Name == a.labelKey { + } else if m.Name == aggregationLabelName { aggregationLabelMatcher = m aggregationLabelIndex = i } } - if aggregationLabelMatcher != nil && a.insertOnly { + if aggregationLabelMatcher != nil && a.strategy == InsertOnlyLabelRewriter { needsRewrite = false skipReason = "insert-only" } @@ -133,7 +147,7 @@ func (a *AggregationLabelRewriter) Rewrite(ms []*labels.Matcher) []*labels.Match // but if it is true, we either append or modify an aggregation label if needsRewrite { newMatcher := &labels.Matcher{ - Name: a.labelKey, + Name: aggregationLabelName, Type: labels.MatchRegexp, Value: a.desiredLabelValue, } diff --git a/pkg/query/aggregation_label_rewriter_test.go b/pkg/query/aggregation_label_rewriter_test.go index 37446e2f3ee..d216d063e39 100644 --- a/pkg/query/aggregation_label_rewriter_test.go +++ b/pkg/query/aggregation_label_rewriter_test.go @@ -11,17 +11,13 @@ import ( "github.com/prometheus/prometheus/model/labels" ) -const ( - aggregationLabelName = "__agg_rule_type__" -) - func TestAggregationLabelRewriter_Rewrite(t *testing.T) { t.Parallel() for _, tc := range []struct { name string desiredLabelValue string // Empty means disabled - insertOnly bool + strategy RewriterStrategy inputMatchers []*labels.Matcher expectedMatchers []*labels.Matcher expectedSkipCount float64 @@ -30,7 +26,19 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { }{ { name: "disabled rewriter should not modify label matchers", + desiredLabelValue: "v1", + strategy: NoopLabelRewriter, + inputMatchers: []*labels.Matcher{ + labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), + }, + expectedMatchers: []*labels.Matcher{ + labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), + }, + }, + { + name: "no desired label value makes a disabled rewriter and should not modify label matchers", desiredLabelValue: "", + strategy: UpsertLabelRewriter, inputMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), }, @@ -41,6 +49,7 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { { name: "should add label for aggregated metric if no existing aggregation label", desiredLabelValue: "5m", + strategy: UpsertLabelRewriter, inputMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), }, @@ -53,6 +62,7 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { { name: "should rewrite existing equal aggregation label for aggregated metric", desiredLabelValue: "5m", + strategy: UpsertLabelRewriter, inputMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), labels.MustNewMatcher(labels.MatchEqual, aggregationLabelName, "1h"), @@ -66,6 +76,7 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { { name: "should rewrite existing regex aggregation label for aggregated metric", desiredLabelValue: "5m", + strategy: UpsertLabelRewriter, inputMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), labels.MustNewMatcher(labels.MatchRegexp, aggregationLabelName, "1h"), @@ -79,6 +90,7 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { { name: "should skip non-aggregated metric", desiredLabelValue: "5m", + strategy: UpsertLabelRewriter, inputMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "__name__", "test_metric"), }, @@ -90,6 +102,7 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { { name: "should skip non-equal name matcher", desiredLabelValue: "5m", + strategy: UpsertLabelRewriter, inputMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchRegexp, "__name__", "test:sum"), }, @@ -101,6 +114,7 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { { name: "should skip when no name matcher", desiredLabelValue: "5m", + strategy: UpsertLabelRewriter, inputMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "job", "prometheus"), }, @@ -112,7 +126,7 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { { name: "if insert only, should NOT rewrite existing aggregation label for aggregated metric", desiredLabelValue: "5m", - insertOnly: true, + strategy: InsertOnlyLabelRewriter, inputMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "__name__", "test:sum"), labels.MustNewMatcher(labels.MatchEqual, aggregationLabelName, "1h"), @@ -129,9 +143,8 @@ func TestAggregationLabelRewriter_Rewrite(t *testing.T) { rewriter := NewAggregationLabelRewriter( nil, reg, - aggregationLabelName, + tc.strategy, tc.desiredLabelValue, - tc.insertOnly, ) result := rewriter.Rewrite(tc.inputMatchers) diff --git a/pkg/query/querier.go b/pkg/query/querier.go index 428ced4cb2f..1d8d9cb6d3f 100644 --- a/pkg/query/querier.go +++ b/pkg/query/querier.go @@ -61,9 +61,8 @@ type QueryableCreator func( type Options struct { GroupReplicaPartialResponseStrategy bool DeduplicationFunc string - RewriteAggregationLabelName string + RewriteAggregationLabelStrategy string RewriteAggregationLabelTo string - RewriteAggregationInsertOnly bool } // NewQueryableCreator creates QueryableCreator. @@ -96,9 +95,8 @@ func NewQueryableCreatorWithOptions( aggregationLabelRewriter := NewAggregationLabelRewriter( logger, extprom.WrapRegistererWithPrefix("aggregation_label_rewriter_", reg), - opts.RewriteAggregationLabelName, + RewriterStrategy(opts.RewriteAggregationLabelStrategy), opts.RewriteAggregationLabelTo, - opts.RewriteAggregationInsertOnly, ) return func( deduplicate bool, From e89c45d8fbf7d84fe3d889814e18e7f064dd1839 Mon Sep 17 00:00:00 2001 From: Filip Petkovski Date: Thu, 28 Nov 2024 18:15:20 +0100 Subject: [PATCH 09/11] cherry pick upstream PR 7945 --- go.mod | 4 ++-- go.sum | 18 ++++++++---------- pkg/receive/writecapnp/client.go | 15 +-------------- pkg/receive/writecapnp/marshal.go | 21 +++++++++++++-------- 4 files changed, 24 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index f08a49b2abc..51c0b60f1d2 100644 --- a/go.mod +++ b/go.mod @@ -112,7 +112,7 @@ require ( ) require ( - capnproto.org/go/capnp/v3 v3.0.1-alpha.2.0.20240830165715-46ccd63a72af + capnproto.org/go/capnp/v3 v3.0.0-alpha.30 github.com/Azure/azure-sdk-for-go/sdk/storage/azdatalake v1.4.0 github.com/cortexproject/promqlsmith v0.0.0-20240506042652-6cfdd9739a5e github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 @@ -135,7 +135,6 @@ require ( github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect github.com/cilium/ebpf v0.11.0 // indirect - github.com/colega/zeropool v0.0.0-20230505084239-6fb4a4f75381 // indirect github.com/containerd/cgroups/v3 v3.0.3 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/elastic/go-licenser v0.3.1 // indirect @@ -169,6 +168,7 @@ require ( k8s.io/client-go v0.31.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + zenhack.net/go/util v0.0.0-20230414204917-531d38494cf5 // indirect ) require ( diff --git a/go.sum b/go.sum index e397c08d1dc..ef5d32d076f 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -capnproto.org/go/capnp/v3 v3.0.1-alpha.2.0.20240830165715-46ccd63a72af h1:A5wxH0ZidOtYYUGjhtBaRuB87M73bGfc06uWB8sHpg0= -capnproto.org/go/capnp/v3 v3.0.1-alpha.2.0.20240830165715-46ccd63a72af/go.mod h1:2vT5D2dtG8sJGEoEKU17e+j7shdaYp1Myl8X03B3hmc= +capnproto.org/go/capnp/v3 v3.0.0-alpha.30 h1:iABQan/YiHFCgSXym5aNj27osapnEgAk4WaWYqb4sQM= +capnproto.org/go/capnp/v3 v3.0.0-alpha.30/go.mod h1:+ysMHvOh1EWNOyorxJWs1omhRFiDoKxKkWQACp54jKM= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= @@ -1506,8 +1506,6 @@ github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/colega/zeropool v0.0.0-20230505084239-6fb4a4f75381 h1:d5EKgQfRQvO97jnISfR89AiCCCJMwMFoSxUiU0OGCRU= -github.com/colega/zeropool v0.0.0-20230505084239-6fb4a4f75381/go.mod h1:OU76gHeRo8xrzGJU3F3I1CqX1ekM8dfJw0+wPeMwnp0= github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -2116,8 +2114,8 @@ github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= +github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= @@ -2276,10 +2274,8 @@ github.com/thanos-io/promql-engine v0.0.0-20241106100125-097e6e9f425a h1:BhWU58V github.com/thanos-io/promql-engine v0.0.0-20241106100125-097e6e9f425a/go.mod h1:wx0JlRZtsB2S10JYUgeg5GqLfMxw31SzArP+28yyE00= github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab h1:7ZR3hmisBWw77ZpO1/o86g+JV3VKlk3d48jopJxzTjU= github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab/go.mod h1:eheTFp954zcWZXCU8d0AT76ftsQOTo4DTqkN/h3k1MY= -github.com/tinylib/msgp v1.1.9 h1:SHf3yoO2sGA0veCJeCBYLHuttAVFHGm2RHgNodW7wQU= -github.com/tinylib/msgp v1.1.9/go.mod h1:BCXGB54lDD8qUEPmiG0cQQUANC4IUQyB2ItS2UDlO/k= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= +github.com/tinylib/msgp v1.1.5 h1:2gXmtWueD2HefZHQe1QOy9HVzmFrLOVvsXwXBQ0ayy0= +github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= @@ -3350,3 +3346,5 @@ sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+s sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +zenhack.net/go/util v0.0.0-20230414204917-531d38494cf5 h1:yksDCGMVzyn3vlyf0GZ3huiF5FFaMGQpQ3UJvR0EoGA= +zenhack.net/go/util v0.0.0-20230414204917-531d38494cf5/go.mod h1:1LtNdPAs8WH+BTcQiZAOo2MIKD/5jyK/u7sZ9ZPe5SE= diff --git a/pkg/receive/writecapnp/client.go b/pkg/receive/writecapnp/client.go index 0a20d90d44d..3cd9f2d0820 100644 --- a/pkg/receive/writecapnp/client.go +++ b/pkg/receive/writecapnp/client.go @@ -69,22 +69,9 @@ func (r *RemoteWriteClient) writeWithReconnect(ctx context.Context, numReconnect if err := r.connect(ctx); err != nil { return nil, err } - arena := capnp.SingleSegment(nil) - defer arena.Release() result, release := r.writer.Write(ctx, func(params Writer_write_Params) error { - _, seg, err := capnp.NewMessage(arena) - if err != nil { - return err - } - wr, err := NewRootWriteRequest(seg) - if err != nil { - return err - } - if err := params.SetWr(wr); err != nil { - return err - } - wr, err = params.Wr() + wr, err := params.NewWr() if err != nil { return err } diff --git a/pkg/receive/writecapnp/marshal.go b/pkg/receive/writecapnp/marshal.go index 2d42d60b849..efc1a8ef038 100644 --- a/pkg/receive/writecapnp/marshal.go +++ b/pkg/receive/writecapnp/marshal.go @@ -6,6 +6,8 @@ package writecapnp import ( "capnproto.org/go/capnp/v3" + "github.com/pkg/errors" + "github.com/thanos-io/thanos/pkg/store/labelpb" "github.com/thanos-io/thanos/pkg/store/storepb/prompb" ) @@ -46,7 +48,7 @@ func Build(tenant string, tsreq []prompb.TimeSeries) (WriteRequest, error) { func BuildInto(wr WriteRequest, tenant string, tsreq []prompb.TimeSeries) error { if err := wr.SetTenant(tenant); err != nil { - return err + return errors.Wrap(err, "set tenant") } series, err := wr.NewTimeSeries(int32(len(tsreq))) @@ -59,27 +61,30 @@ func BuildInto(wr WriteRequest, tenant string, tsreq []prompb.TimeSeries) error lblsc, err := tsc.NewLabels(int32(len(ts.Labels))) if err != nil { - return err + return errors.Wrap(err, "new labels") } if err := marshalLabels(lblsc, ts.Labels, builder); err != nil { - return err + return errors.Wrap(err, "marshal labels") } if err := marshalSamples(tsc, ts.Samples); err != nil { - return err + return errors.Wrap(err, "marshal samples") } if err := marshalHistograms(tsc, ts.Histograms); err != nil { - return err + return errors.Wrap(err, "marshal histograms") } if err := marshalExemplars(tsc, ts.Exemplars, builder); err != nil { - return err + return errors.Wrap(err, "marshal exemplars") } } symbols, err := wr.NewSymbols() if err != nil { - return err + return errors.Wrap(err, "new symbols") } - return marshalSymbols(builder, symbols) + if err := marshalSymbols(builder, symbols); err != nil { + return errors.Wrap(err, "marshal symbols") + } + return nil } func marshalSymbols(builder *symbolsBuilder, symbols Symbols) error { From 2fb8f8ddb9005a5fab425d38b07177b8ce7b3301 Mon Sep 17 00:00:00 2001 From: Yuchen Wang Date: Thu, 24 Apr 2025 14:45:41 -0700 Subject: [PATCH 10/11] use prometheus fork --- go.mod | 3 +++ go.sum | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 51c0b60f1d2..cd1f8d888fe 100644 --- a/go.mod +++ b/go.mod @@ -289,6 +289,9 @@ replace ( // Required by Cortex https://github.com/cortexproject/cortex/pull/3051. github.com/bradfitz/gomemcache => github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab + // Use Prometheus fork to include some fixes + github.com/prometheus/prometheus => github.com/yuchen-db/prometheus v0.0.0-20250424212119-34c3b01ad3f9 + // Pin kuberesolver/v5 to support new grpc version. Need to upgrade kuberesolver version on weaveworks/common. github.com/sercand/kuberesolver/v4 => github.com/sercand/kuberesolver/v5 v5.1.1 diff --git a/go.sum b/go.sum index ef5d32d076f..688bdcd6574 100644 --- a/go.sum +++ b/go.sum @@ -2189,8 +2189,6 @@ github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0ua github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/prometheus v0.55.1-0.20241102120812-a6fd22b9d2c8 h1:hCxAh6+hxwy7dqUPE5ndnilMeCWrqQkJVjPDXtiYRVo= -github.com/prometheus/prometheus v0.55.1-0.20241102120812-a6fd22b9d2c8/go.mod h1:GGS7QlWKCqCbcEzWsVahYIfQwiGhcExkarHyLJTsv6I= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/redis/rueidis v1.0.45-alpha.1 h1:69Bu1l7gVC/qDYuGGwMwGg2rjOjSyxESol/Zila62gY= @@ -2297,6 +2295,8 @@ github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMU github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/yuchen-db/prometheus v0.0.0-20250424212119-34c3b01ad3f9 h1:hNgEopLMPL0Ol+MOif0rqebCYAtqiBeR54lmt+GyhsA= +github.com/yuchen-db/prometheus v0.0.0-20250424212119-34c3b01ad3f9/go.mod h1:GGS7QlWKCqCbcEzWsVahYIfQwiGhcExkarHyLJTsv6I= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= From 6cc08086644328240a506df94fb6168687faaef5 Mon Sep 17 00:00:00 2001 From: Yuchen Wang Date: Fri, 25 Apr 2025 15:57:48 -0700 Subject: [PATCH 11/11] add log for cuckoo --- pkg/store/tsdb.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/store/tsdb.go b/pkg/store/tsdb.go index 9d4efe5b829..ff9241e32e1 100644 --- a/pkg/store/tsdb.go +++ b/pkg/store/tsdb.go @@ -138,7 +138,7 @@ func NewTSDBStore( level.Error(logger).Log("msg", "failed to update metric names", "err", err) return } - + level.Info(logger).Log("msg", "updating metric names filter", "count", len(vals.Values)) st.storeFilter.ResetAndSet(vals.Values...) } st.close = cancel