Skip to content

Commit c124391

Browse files
committed
Add number tenants per query histogram
Signed-off-by: SungJin1212 <[email protected]>
1 parent bb59466 commit c124391

File tree

4 files changed

+135
-30
lines changed

4 files changed

+135
-30
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
* [FEATURE] Chunk Cache: Support multi level cache and add metrics. #6249
1919
* [FEATURE] Distributor: Accept multiple HA Tracker pairs in the same request. #6256
2020
* [FEATURE] Ruler: Add support for per-user external labels #6340
21+
* [ENHANCEMENT] Querier: Add a `cortex_querier_federated_tenants_per_query` histogram to track the number of tenants per query when the `-tenant-federation.enabled=true`. #6449
2122
* [ENHANCEMENT] Query Frontend: Add a number of series in the query response to the query stat log. #6423
2223
* [ENHANCEMENT] Store Gateway: Add a hedged request to reduce the tail latency. #6388
2324
* [ENHANCEMENT] Ingester: Add metrics to track succeed/failed native histograms. #6370

pkg/cortex/modules.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,13 @@ func (t *Cortex) initQueryable() (serv services.Service, err error) {
268268

269269
// Enable merge querier if multi tenant query federation is enabled
270270
func (t *Cortex) initTenantFederation() (serv services.Service, err error) {
271+
271272
if t.Cfg.TenantFederation.Enabled {
272273
// Make sure the mergeQuerier is only used for request with more than a
273274
// single tenant. This allows for a less impactful enabling of tenant
274275
// federation.
275276
byPassForSingleQuerier := true
276-
t.QuerierQueryable = querier.NewSampleAndChunkQueryable(tenantfederation.NewQueryable(t.QuerierQueryable, byPassForSingleQuerier))
277+
t.QuerierQueryable = querier.NewSampleAndChunkQueryable(tenantfederation.NewQueryable(t.QuerierQueryable, byPassForSingleQuerier, prometheus.DefaultRegisterer))
277278
}
278279
return nil, nil
279280
}

pkg/querier/tenantfederation/merge_queryable.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"strings"
88

99
"github.com/pkg/errors"
10+
"github.com/prometheus/client_golang/prometheus"
11+
"github.com/prometheus/client_golang/prometheus/promauto"
1012
"github.com/prometheus/prometheus/model/labels"
1113
"github.com/prometheus/prometheus/storage"
1214
"github.com/prometheus/prometheus/tsdb/chunkenc"
@@ -36,8 +38,8 @@ const (
3638
// If the label "__tenant_id__" is already existing, its value is overwritten
3739
// by the tenant ID and the previous value is exposed through a new label
3840
// prefixed with "original_". This behaviour is not implemented recursively.
39-
func NewQueryable(upstream storage.Queryable, byPassWithSingleQuerier bool) storage.Queryable {
40-
return NewMergeQueryable(defaultTenantLabel, tenantQuerierCallback(upstream), byPassWithSingleQuerier)
41+
func NewQueryable(upstream storage.Queryable, byPassWithSingleQuerier bool, reg prometheus.Registerer) storage.Queryable {
42+
return NewMergeQueryable(defaultTenantLabel, tenantQuerierCallback(upstream), byPassWithSingleQuerier, reg)
4143
}
4244

4345
func tenantQuerierCallback(queryable storage.Queryable) MergeQuerierCallback {
@@ -79,18 +81,26 @@ type MergeQuerierCallback func(ctx context.Context, mint int64, maxt int64) (ids
7981
// If the label `idLabelName` is already existing, its value is overwritten and
8082
// the previous value is exposed through a new label prefixed with "original_".
8183
// This behaviour is not implemented recursively.
82-
func NewMergeQueryable(idLabelName string, callback MergeQuerierCallback, byPassWithSingleQuerier bool) storage.Queryable {
84+
func NewMergeQueryable(idLabelName string, callback MergeQuerierCallback, byPassWithSingleQuerier bool, reg prometheus.Registerer) storage.Queryable {
8385
return &mergeQueryable{
8486
idLabelName: idLabelName,
8587
callback: callback,
8688
byPassWithSingleQuerier: byPassWithSingleQuerier,
89+
90+
tenantsPerQuery: promauto.With(reg).NewHistogram(prometheus.HistogramOpts{
91+
Namespace: "cortex",
92+
Name: "querier_federated_tenants_per_query",
93+
Help: "Number of tenants per query.",
94+
Buckets: []float64{1, 2, 4, 8, 16, 32, 64},
95+
}),
8796
}
8897
}
8998

9099
type mergeQueryable struct {
91100
idLabelName string
92101
byPassWithSingleQuerier bool
93102
callback MergeQuerierCallback
103+
tenantsPerQuery prometheus.Histogram
94104
}
95105

96106
// Querier returns a new mergeQuerier, which aggregates results from multiple
@@ -102,6 +112,7 @@ func (m *mergeQueryable) Querier(mint int64, maxt int64) (storage.Querier, error
102112
maxt: maxt,
103113
byPassWithSingleQuerier: m.byPassWithSingleQuerier,
104114
callback: m.callback,
115+
tenantsPerQuery: m.tenantsPerQuery,
105116
}, nil
106117
}
107118

@@ -117,6 +128,7 @@ type mergeQuerier struct {
117128
callback MergeQuerierCallback
118129

119130
byPassWithSingleQuerier bool
131+
tenantsPerQuery prometheus.Histogram
120132
}
121133

122134
// LabelValues returns all potential values for a label name. It is not safe
@@ -130,6 +142,8 @@ func (m *mergeQuerier) LabelValues(ctx context.Context, name string, hints *stor
130142
return nil, nil, err
131143
}
132144

145+
m.tenantsPerQuery.Observe(float64(len(ids)))
146+
133147
// by pass when only single querier is returned
134148
if m.byPassWithSingleQuerier && len(queriers) == 1 {
135149
return queriers[0].LabelValues(ctx, name, hints, matchers...)
@@ -169,6 +183,8 @@ func (m *mergeQuerier) LabelNames(ctx context.Context, hints *storage.LabelHints
169183
return nil, nil, err
170184
}
171185

186+
m.tenantsPerQuery.Observe(float64(len(ids)))
187+
172188
// by pass when only single querier is returned
173189
if m.byPassWithSingleQuerier && len(queriers) == 1 {
174190
return queriers[0].LabelNames(ctx, hints, matchers...)
@@ -309,6 +325,8 @@ func (m *mergeQuerier) Select(ctx context.Context, sortSeries bool, hints *stora
309325
return storage.ErrSeriesSet(err)
310326
}
311327

328+
m.tenantsPerQuery.Observe(float64(len(ids)))
329+
312330
// by pass when only single querier is returned
313331
if m.byPassWithSingleQuerier && len(queriers) == 1 {
314332
return queriers[0].Select(ctx, sortSeries, hints, matchers...)

0 commit comments

Comments
 (0)