@@ -104,6 +104,7 @@ func NewQueryableCreatorWithOptions(
104104 ) storage.Queryable {
105105 return & queryable {
106106 logger : logger ,
107+ reg : reg ,
107108 replicaLabels : replicaLabels ,
108109 storeDebugMatchers : storeDebugMatchers ,
109110 proxy : proxy ,
@@ -125,6 +126,7 @@ func NewQueryableCreatorWithOptions(
125126
126127type queryable struct {
127128 logger log.Logger
129+ reg prometheus.Registerer
128130 replicaLabels []string
129131 storeDebugMatchers [][]* labels.Matcher
130132 proxy storepb.StoreServer
@@ -142,11 +144,12 @@ type queryable struct {
142144
143145// Querier returns a new storage querier against the underlying proxy store API.
144146func (q * queryable ) Querier (mint , maxt int64 ) (storage.Querier , error ) {
145- return newQuerierWithOpts (q .logger , mint , maxt , q .replicaLabels , q .storeDebugMatchers , q .proxy , q .deduplicate , q .maxResolutionMillis , q .partialResponse , q .skipChunks , q .gateProviderFn (), q .selectTimeout , q .shardInfo , q .seriesStatsReporter , q .opts ), nil
147+ return newQuerierWithOpts (q .logger , q . reg , mint , maxt , q .replicaLabels , q .storeDebugMatchers , q .proxy , q .deduplicate , q .maxResolutionMillis , q .partialResponse , q .skipChunks , q .gateProviderFn (), q .selectTimeout , q .shardInfo , q .seriesStatsReporter , q .opts ), nil
146148}
147149
148150type querier struct {
149151 logger log.Logger
152+ reg prometheus.Registerer
150153 mint , maxt int64
151154 deduplicationFunc string
152155 replicaLabels []string
@@ -161,17 +164,15 @@ type querier struct {
161164 shardInfo * storepb.ShardInfo
162165 seriesStatsReporter seriesStatsReporter
163166
164- enablePreAggregationLabelRewrite bool
165- aggregationStandardSuffixes []string
166- aggregationLabelName string
167- rewriteAggregationLabelTo string
167+ aggregationLabelRewriter * AggregationLabelRewriter
168168}
169169
170170// newQuerier creates implementation of storage.Querier that fetches data from the proxy
171171// store API endpoints.
172172// nolint:unparam
173173func newQuerier (
174174 logger log.Logger ,
175+ reg prometheus.Registerer ,
175176 mint ,
176177 maxt int64 ,
177178 replicaLabels []string ,
@@ -186,11 +187,12 @@ func newQuerier(
186187 shardInfo * storepb.ShardInfo ,
187188 seriesStatsReporter seriesStatsReporter ,
188189) * querier {
189- return newQuerierWithOpts (logger , mint , maxt , replicaLabels , storeDebugMatchers , proxy , deduplicate , maxResolutionMillis , partialResponse , skipChunks , selectGate , selectTimeout , shardInfo , seriesStatsReporter , Options {})
190+ return newQuerierWithOpts (logger , reg , mint , maxt , replicaLabels , storeDebugMatchers , proxy , deduplicate , maxResolutionMillis , partialResponse , skipChunks , selectGate , selectTimeout , shardInfo , seriesStatsReporter , Options {})
190191}
191192
192193func newQuerierWithOpts (
193194 logger log.Logger ,
195+ reg prometheus.Registerer ,
194196 mint ,
195197 maxt int64 ,
196198 replicaLabels []string ,
@@ -223,6 +225,7 @@ func newQuerierWithOpts(
223225 }
224226 return & querier {
225227 logger : logger ,
228+ reg : reg ,
226229 selectGate : selectGate ,
227230 selectTimeout : selectTimeout ,
228231
@@ -239,10 +242,11 @@ func newQuerierWithOpts(
239242 shardInfo : shardInfo ,
240243 seriesStatsReporter : seriesStatsReporter ,
241244
242- enablePreAggregationLabelRewrite : opts .RewriteAggregationLabelTo != "" ,
243- aggregationStandardSuffixes : []string {":aggr" , ":count" , ":sum" , ":min" , ":max" , ":avg" },
244- aggregationLabelName : "__rollup__" ,
245- rewriteAggregationLabelTo : opts .RewriteAggregationLabelTo ,
245+ aggregationLabelRewriter : NewAggregationLabelRewriter (
246+ logger ,
247+ extprom .WrapRegistererWithPrefix ("aggregation_label_rewriter_" , reg ),
248+ opts .RewriteAggregationLabelTo ,
249+ ),
246250 }
247251}
248252
@@ -376,51 +380,7 @@ func (q *querier) Select(ctx context.Context, _ bool, hints *storage.SelectHints
376380}
377381
378382func (q * querier ) selectFn (ctx context.Context , hints * storage.SelectHints , ms ... * labels.Matcher ) (storage.SeriesSet , storepb.SeriesStatsCounter , error ) {
379- if q .enablePreAggregationLabelRewrite {
380- hasNameLabel , needLabelRewrite := false , false
381- var nameLabelMatcher * labels.Matcher
382- for _ , m := range ms {
383- if m .Name == labels .MetricName {
384- hasNameLabel = true
385- if m .Type == labels .MatchEqual {
386- for _ , suffix := range q .aggregationStandardSuffixes {
387- if strings .HasSuffix (m .Value , suffix ) {
388- needLabelRewrite = true
389- nameLabelMatcher = m
390- break
391- }
392- }
393- break
394- } else {
395- level .Info (q .logger ).Log ("msg" , "Skipping aggregation label rewrite attempt" , "reason" , "non-equal name matcher" , "name_matcher" , m )
396- }
397- }
398- }
399- if ! hasNameLabel {
400- level .Info (q .logger ).Log ("msg" , "Skipping aggregation label rewrite" , "reason" , "no metric name matcher found" )
401- }
402- if needLabelRewrite {
403- hasAggregationLabel := false
404- for i , m := range ms {
405- if m .Name == q .aggregationLabelName {
406- level .Info (q .logger ).Log ("msg" , "Rewriting aggregation label" , "original_matcher" , m , "name_matcher" , nameLabelMatcher , "new_value" , q .rewriteAggregationLabelTo )
407- hasAggregationLabel = true
408- ms [i ].Type = labels .MatchEqual
409- ms [i ].Value = q .rewriteAggregationLabelTo
410- break
411- }
412- }
413- if ! hasAggregationLabel {
414- newMatcher := & labels.Matcher {
415- Name : q .aggregationLabelName ,
416- Type : labels .MatchEqual ,
417- Value : q .rewriteAggregationLabelTo ,
418- }
419- level .Info (q .logger ).Log ("msg" , "Adding aggregation label" , "new_matcher" , newMatcher , "name_matcher" , nameLabelMatcher )
420- ms = append (ms , newMatcher )
421- }
422- }
423- }
383+ ms = q .aggregationLabelRewriter .Rewrite (ms )
424384
425385 sms , err := storepb .PromMatchersToMatchers (ms ... )
426386 if err != nil {
0 commit comments