Skip to content

Commit bfdbdd3

Browse files
committed
replace request source implementation on qfe when ruler calls qfe to unify experience across services
Signed-off-by: Erlan Zholdubai uulu <[email protected]>
1 parent 8bb3d4f commit bfdbdd3

File tree

10 files changed

+45
-54
lines changed

10 files changed

+45
-54
lines changed

pkg/api/middlewares.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func (h HTTPHeaderMiddleware) injectRequestContext(r *http.Request) *http.Reques
3737
reqId = uuid.NewString()
3838
}
3939
requestContextMap[requestmeta.RequestIdKey] = reqId
40-
requestContextMap[requestmeta.RequestSourceKey] = requestmeta.SourceApi
40+
requestContextMap[requestmeta.RequestSourceKey] = requestmeta.SourceAPI
4141

4242
ctx := requestmeta.ContextWithRequestMetadataMap(r.Context(), requestContextMap)
4343
return r.WithContext(ctx)

pkg/frontend/transport/handler.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
util_api "github.com/cortexproject/cortex/pkg/util/api"
3131
"github.com/cortexproject/cortex/pkg/util/limiter"
3232
util_log "github.com/cortexproject/cortex/pkg/util/log"
33+
"github.com/cortexproject/cortex/pkg/util/requestmeta"
3334
)
3435

3536
const (
@@ -245,11 +246,11 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
245246
}
246247

247248
userID := tenant.JoinTenantIDs(tenantIDs)
249+
source := tripperware.GetSource(r)
248250

249251
if f.tenantFederationCfg.Enabled {
250252
maxTenant := f.tenantFederationCfg.MaxTenant
251253
if maxTenant > 0 && len(tenantIDs) > maxTenant {
252-
source := tripperware.GetSource(r.Header.Get("User-Agent"))
253254
if f.cfg.QueryStatsEnabled {
254255
f.rejectedQueries.WithLabelValues(reasonTooManyTenants, source, userID).Inc()
255256
}
@@ -289,15 +290,13 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
289290
}
290291
http.Error(w, err.Error(), statusCode)
291292
if f.cfg.QueryStatsEnabled && util.IsRequestBodyTooLarge(err) {
292-
source := tripperware.GetSource(r.Header.Get("User-Agent"))
293293
f.rejectedQueries.WithLabelValues(reasonRequestBodySizeExceeded, source, userID).Inc()
294294
}
295295
return
296296
}
297297
r.Body = io.NopCloser(&buf)
298298
}
299299

300-
source := tripperware.GetSource(r.Header.Get("User-Agent"))
301300
// Log request
302301
if f.cfg.QueryStatsEnabled {
303302
queryString = f.parseRequestQueryString(r, buf)
@@ -401,7 +400,7 @@ func (f *Handler) logQueryRequest(r *http.Request, queryString url.Values, sourc
401400
logMessage = append(logMessage, "accept_encoding", acceptEncoding)
402401
}
403402

404-
shouldLog := source == tripperware.SourceAPI || (f.cfg.EnabledRulerQueryStatsLog && source == tripperware.SourceRuler)
403+
shouldLog := source == requestmeta.SourceAPI || (f.cfg.EnabledRulerQueryStatsLog && source == requestmeta.SourceRuler)
405404
if shouldLog {
406405
logMessage = append(logMessage, formatQueryString(queryString)...)
407406
level.Info(util_log.WithContext(r.Context(), f.log)).Log(logMessage...)
@@ -531,7 +530,7 @@ func (f *Handler) reportQueryStats(r *http.Request, source, userID string, query
531530
}
532531
}
533532

534-
shouldLog := source == tripperware.SourceAPI || (f.cfg.EnabledRulerQueryStatsLog && source == tripperware.SourceRuler)
533+
shouldLog := source == requestmeta.SourceAPI || (f.cfg.EnabledRulerQueryStatsLog && source == requestmeta.SourceRuler)
535534
if shouldLog {
536535
logMessage = append(logMessage, formatQueryString(queryString)...)
537536
if error != nil {

pkg/frontend/transport/handler_test.go

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ import (
2626

2727
querier_stats "github.com/cortexproject/cortex/pkg/querier/stats"
2828
"github.com/cortexproject/cortex/pkg/querier/tenantfederation"
29-
"github.com/cortexproject/cortex/pkg/querier/tripperware"
3029
"github.com/cortexproject/cortex/pkg/tenant"
3130
util_api "github.com/cortexproject/cortex/pkg/util/api"
3231
"github.com/cortexproject/cortex/pkg/util/limiter"
3332
util_log "github.com/cortexproject/cortex/pkg/util/log"
33+
"github.com/cortexproject/cortex/pkg/util/requestmeta"
3434
)
3535

3636
type roundTripperFunc func(*http.Request) (*http.Response, error)
@@ -216,7 +216,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
216216
}, nil
217217
}),
218218
additionalMetricsCheckFunc: func(h *Handler) {
219-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonResponseBodySizeExceeded, tripperware.SourceAPI, userID))
219+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonResponseBodySizeExceeded, requestmeta.SourceAPI, userID))
220220
assert.Equal(t, float64(1), v)
221221
},
222222
expectedStatusCode: http.StatusRequestEntityTooLarge,
@@ -232,7 +232,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
232232
}, nil
233233
}),
234234
additionalMetricsCheckFunc: func(h *Handler) {
235-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonTooManyRequests, tripperware.SourceAPI, userID))
235+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonTooManyRequests, requestmeta.SourceAPI, userID))
236236
assert.Equal(t, float64(1), v)
237237
},
238238
expectedStatusCode: http.StatusTooManyRequests,
@@ -248,7 +248,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
248248
}, nil
249249
}),
250250
additionalMetricsCheckFunc: func(h *Handler) {
251-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonTooManySamples, tripperware.SourceAPI, userID))
251+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonTooManySamples, requestmeta.SourceAPI, userID))
252252
assert.Equal(t, float64(1), v)
253253
},
254254
expectedStatusCode: http.StatusUnprocessableEntity,
@@ -264,7 +264,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
264264
}, nil
265265
}),
266266
additionalMetricsCheckFunc: func(h *Handler) {
267-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonTimeRangeExceeded, tripperware.SourceAPI, userID))
267+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonTimeRangeExceeded, requestmeta.SourceAPI, userID))
268268
assert.Equal(t, float64(1), v)
269269
},
270270
expectedStatusCode: http.StatusUnprocessableEntity,
@@ -280,7 +280,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
280280
}, nil
281281
}),
282282
additionalMetricsCheckFunc: func(h *Handler) {
283-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonSeriesFetched, tripperware.SourceAPI, userID))
283+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonSeriesFetched, requestmeta.SourceAPI, userID))
284284
assert.Equal(t, float64(1), v)
285285
},
286286
expectedStatusCode: http.StatusUnprocessableEntity,
@@ -296,7 +296,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
296296
}, nil
297297
}),
298298
additionalMetricsCheckFunc: func(h *Handler) {
299-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonChunksFetched, tripperware.SourceAPI, userID))
299+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonChunksFetched, requestmeta.SourceAPI, userID))
300300
assert.Equal(t, float64(1), v)
301301
},
302302
expectedStatusCode: http.StatusUnprocessableEntity,
@@ -312,7 +312,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
312312
}, nil
313313
}),
314314
additionalMetricsCheckFunc: func(h *Handler) {
315-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonChunkBytesFetched, tripperware.SourceAPI, userID))
315+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonChunkBytesFetched, requestmeta.SourceAPI, userID))
316316
assert.Equal(t, float64(1), v)
317317
},
318318
expectedStatusCode: http.StatusUnprocessableEntity,
@@ -328,7 +328,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
328328
}, nil
329329
}),
330330
additionalMetricsCheckFunc: func(h *Handler) {
331-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonDataBytesFetched, tripperware.SourceAPI, userID))
331+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonDataBytesFetched, requestmeta.SourceAPI, userID))
332332
assert.Equal(t, float64(1), v)
333333
},
334334
expectedStatusCode: http.StatusUnprocessableEntity,
@@ -344,7 +344,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
344344
}, nil
345345
}),
346346
additionalMetricsCheckFunc: func(h *Handler) {
347-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonSeriesLimitStoreGateway, tripperware.SourceAPI, userID))
347+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonSeriesLimitStoreGateway, requestmeta.SourceAPI, userID))
348348
assert.Equal(t, float64(1), v)
349349
},
350350
expectedStatusCode: http.StatusUnprocessableEntity,
@@ -360,7 +360,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
360360
}, nil
361361
}),
362362
additionalMetricsCheckFunc: func(h *Handler) {
363-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonChunksLimitStoreGateway, tripperware.SourceAPI, userID))
363+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonChunksLimitStoreGateway, requestmeta.SourceAPI, userID))
364364
assert.Equal(t, float64(1), v)
365365
},
366366
expectedStatusCode: http.StatusUnprocessableEntity,
@@ -376,7 +376,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
376376
}, nil
377377
}),
378378
additionalMetricsCheckFunc: func(h *Handler) {
379-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonBytesLimitStoreGateway, tripperware.SourceAPI, userID))
379+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonBytesLimitStoreGateway, requestmeta.SourceAPI, userID))
380380
assert.Equal(t, float64(1), v)
381381
},
382382
expectedStatusCode: http.StatusUnprocessableEntity,
@@ -393,7 +393,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
393393
}, nil
394394
}),
395395
additionalMetricsCheckFunc: func(h *Handler) {
396-
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonResourceExhausted, tripperware.SourceAPI, userID))
396+
v := promtest.ToFloat64(h.rejectedQueries.WithLabelValues(reasonResourceExhausted, requestmeta.SourceAPI, userID))
397397
assert.Equal(t, float64(1), v)
398398
},
399399
expectedStatusCode: http.StatusUnprocessableEntity,
@@ -410,7 +410,7 @@ func TestHandler_ServeHTTP(t *testing.T) {
410410
}, nil
411411
}),
412412
additionalMetricsCheckFunc: func(h *Handler) {
413-
v := promtest.ToFloat64(h.slowQueries.WithLabelValues(tripperware.SourceAPI, userID))
413+
v := promtest.ToFloat64(h.slowQueries.WithLabelValues(requestmeta.SourceAPI, userID))
414414
assert.Equal(t, float64(1), v)
415415
},
416416
expectedStatusCode: http.StatusOK,
@@ -472,12 +472,12 @@ func TestReportQueryStatsFormat(t *testing.T) {
472472
tests := map[string]testCase{
473473
"should not include query and header details if empty": {
474474
expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0`,
475-
source: tripperware.SourceAPI,
475+
source: requestmeta.SourceAPI,
476476
},
477477
"should include query length and string at the end": {
478478
queryString: url.Values(map[string][]string{"query": {"up"}}),
479479
expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0 query_length=2 param_query=up`,
480-
source: tripperware.SourceAPI,
480+
source: requestmeta.SourceAPI,
481481
},
482482
"should include query stats": {
483483
queryStats: &querier_stats.QueryStats{
@@ -494,17 +494,17 @@ func TestReportQueryStatsFormat(t *testing.T) {
494494
},
495495
},
496496
expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=3 response_series_count=100 fetched_series_count=100 fetched_chunks_count=200 fetched_samples_count=300 fetched_chunks_bytes=1024 fetched_data_bytes=2048 split_queries=10 status_code=200 response_size=1000 samples_scanned=0 query_storage_wall_time_seconds=6000`,
497-
source: tripperware.SourceAPI,
497+
source: requestmeta.SourceAPI,
498498
},
499499
"should include user agent": {
500500
header: http.Header{"User-Agent": []string{"Grafana"}},
501501
expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0 user_agent=Grafana`,
502-
source: tripperware.SourceAPI,
502+
source: requestmeta.SourceAPI,
503503
},
504504
"should include response error": {
505505
responseErr: errors.New("foo_err"),
506506
expectedLog: `level=error msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0 error=foo_err`,
507-
source: tripperware.SourceAPI,
507+
source: requestmeta.SourceAPI,
508508
},
509509
"should include query priority": {
510510
queryString: url.Values(map[string][]string{"query": {"up"}}),
@@ -513,7 +513,7 @@ func TestReportQueryStatsFormat(t *testing.T) {
513513
PriorityAssigned: true,
514514
},
515515
expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0 query_length=2 priority=99 param_query=up`,
516-
source: tripperware.SourceAPI,
516+
source: requestmeta.SourceAPI,
517517
},
518518
"should include data fetch min and max time": {
519519
queryString: url.Values(map[string][]string{"query": {"up"}}),
@@ -522,7 +522,7 @@ func TestReportQueryStatsFormat(t *testing.T) {
522522
DataSelectMinTime: 1704067200000,
523523
},
524524
expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0 data_select_max_time=1704153600 data_select_min_time=1704067200 query_length=2 param_query=up`,
525-
source: tripperware.SourceAPI,
525+
source: requestmeta.SourceAPI,
526526
},
527527
"should include query stats with store gateway stats": {
528528
queryStats: &querier_stats.QueryStats{
@@ -541,16 +541,16 @@ func TestReportQueryStatsFormat(t *testing.T) {
541541
},
542542
},
543543
expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=3 response_series_count=100 fetched_series_count=100 fetched_chunks_count=200 fetched_samples_count=300 fetched_chunks_bytes=1024 fetched_data_bytes=2048 split_queries=10 status_code=200 response_size=1000 samples_scanned=0 store_gateway_touched_postings_count=20 store_gateway_touched_posting_bytes=200 query_storage_wall_time_seconds=6000`,
544-
source: tripperware.SourceAPI,
544+
source: requestmeta.SourceAPI,
545545
},
546546
"should not report a log": {
547547
expectedLog: ``,
548-
source: tripperware.SourceRuler,
548+
source: requestmeta.SourceRuler,
549549
enabledRulerQueryStatsLog: false,
550550
},
551551
"should report a log": {
552552
expectedLog: `level=info msg="query stats" component=query-frontend method=GET path=/prometheus/api/v1/query response_time=1s query_wall_time_seconds=0 response_series_count=0 fetched_series_count=0 fetched_chunks_count=0 fetched_samples_count=0 fetched_chunks_bytes=0 fetched_data_bytes=0 split_queries=0 status_code=200 response_size=1000 samples_scanned=0`,
553-
source: tripperware.SourceRuler,
553+
source: requestmeta.SourceRuler,
554554
enabledRulerQueryStatsLog: true,
555555
},
556556
}
@@ -559,6 +559,7 @@ func TestReportQueryStatsFormat(t *testing.T) {
559559
t.Run(testName, func(t *testing.T) {
560560
handler := NewHandler(HandlerConfig{QueryStatsEnabled: true, EnabledRulerQueryStatsLog: testData.enabledRulerQueryStatsLog}, tenantfederation.Config{}, http.DefaultTransport, logger, nil)
561561
req.Header = testData.header
562+
req = req.WithContext(requestmeta.ContextWithRequestSource(context.Background(), testData.source))
562563
handler.reportQueryStats(req, testData.source, userID, testData.queryString, responseTime, testData.queryStats, testData.responseErr, statusCode, resp)
563564
data, err := io.ReadAll(outputBuf)
564565
require.NoError(t, err)
@@ -706,7 +707,7 @@ func Test_TenantFederation_MaxTenant(t *testing.T) {
706707
require.Contains(t, string(body), test.expectedErrMsg)
707708

708709
if strings.Contains(test.expectedErrMsg, "too many tenants") {
709-
v := promtest.ToFloat64(handler.rejectedQueries.WithLabelValues(reasonTooManyTenants, tripperware.SourceAPI, test.orgId))
710+
v := promtest.ToFloat64(handler.rejectedQueries.WithLabelValues(reasonTooManyTenants, requestmeta.SourceAPI, test.orgId))
710711
assert.Equal(t, float64(1), v)
711712
}
712713
}

pkg/ingester/ingester_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3228,7 +3228,7 @@ func Test_Ingester_Query_ResourceThresholdBreached(t *testing.T) {
32283228
}
32293229

32303230
rreq := &client.QueryRequest{}
3231-
ctx = requestmeta.ContextWithRequestSource(ctx, requestmeta.SourceApi)
3231+
ctx = requestmeta.ContextWithRequestSource(ctx, requestmeta.SourceAPI)
32323232
s := &mockQueryStreamServer{ctx: ctx}
32333233
err = i.QueryStream(rreq, s)
32343234
require.Error(t, err)

pkg/querier/tripperware/instantquery/instant_query.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/cortexproject/cortex/pkg/querier/tripperware"
2323
"github.com/cortexproject/cortex/pkg/util"
2424
"github.com/cortexproject/cortex/pkg/util/limiter"
25+
"github.com/cortexproject/cortex/pkg/util/requestmeta"
2526
"github.com/cortexproject/cortex/pkg/util/spanlogger"
2627

2728
"github.com/thanos-io/promql-engine/logicalplan"
@@ -82,8 +83,7 @@ func (c instantQueryCodec) DecodeRequest(_ context.Context, r *http.Request, for
8283
result.Stats = r.FormValue("stats")
8384
result.Path = r.URL.Path
8485

85-
isSourceRuler := strings.Contains(r.Header.Get("User-Agent"), tripperware.RulerUserAgent)
86-
if isSourceRuler {
86+
if tripperware.GetSource(r) == requestmeta.SourceRuler {
8787
// When the source is the Ruler, then forward whole headers
8888
result.Headers = r.Header
8989
} else {
@@ -210,7 +210,7 @@ func (c instantQueryCodec) EncodeRequest(ctx context.Context, r tripperware.Requ
210210

211211
h.Add("Content-Type", "application/x-www-form-urlencoded")
212212

213-
isSourceRuler := strings.Contains(h.Get("User-Agent"), tripperware.RulerUserAgent)
213+
isSourceRuler := strings.Contains(h.Get("User-Agent"), tripperware.RulerUserAgent) || requestmeta.RequestFromRuler(ctx)
214214
if !isSourceRuler {
215215
// When the source is the Ruler, skip set header
216216
tripperware.SetRequestHeaders(h, c.defaultCodecType, c.compression)

pkg/querier/tripperware/query.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ const (
5757
QueryResponseCortexMIMEType = "application/" + QueryResponseCortexMIMESubType
5858
QueryResponseCortexMIMESubType = "x-cortex-query+proto"
5959
RulerUserAgent = "CortexRuler"
60-
61-
SourceRuler = "ruler"
62-
SourceAPI = "api"
6360
)
6461

6562
// Codec is used to encode/decode query range requests and responses so they can be passed down to middlewares.

pkg/querier/tripperware/roundtrip.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ func NewQueryTripperware(
183183
now := time.Now()
184184
userStr := tenant.JoinTenantIDs(tenantIDs)
185185
activeUsers.UpdateUserTimestamp(userStr, now)
186-
source := GetSource(r.Header.Get("User-Agent"))
186+
source := GetSource(r)
187187
queriesPerTenant.WithLabelValues(op, source, userStr).Inc()
188188

189189
if maxSubQuerySteps > 0 && (isQuery || isQueryRange) {
@@ -279,11 +279,13 @@ func (q roundTripper) Do(ctx context.Context, r Request) (Response, error) {
279279
return q.codec.DecodeResponse(ctx, response, r)
280280
}
281281

282-
func GetSource(userAgent string) string {
283-
if strings.Contains(userAgent, RulerUserAgent) {
282+
func GetSource(r *http.Request) string {
283+
// check it for backwards compatibility
284+
userAgent := r.Header.Get("User-Agent")
285+
if strings.Contains(userAgent, RulerUserAgent) || requestmeta.RequestFromRuler(r.Context()) {
284286
// caller is ruler
285-
return SourceRuler
287+
return requestmeta.SourceRuler
286288
}
287289

288-
return SourceAPI
290+
return requestmeta.SourceAPI
289291
}

0 commit comments

Comments
 (0)