@@ -212,10 +212,47 @@ func (t *Cortex) initQueryable() (serv services.Service, err error) {
212
212
// 2. Querier Standalone: The querier will register the internal HTTP router with the external
213
213
// HTTP router for the Prometheus API routes. Then the external HTTP server will be passed
214
214
// as a http.Handler to the frontend worker.
215
+ // Route Diagram:
216
+ // │ query
217
+ // │ request
218
+ // │
219
+ // ▼
220
+ // ┌──────────────────┐ QF to ┌──────────────────┐
221
+ // │ external HTTP │ Worker │ │
222
+ // │ router │──────────────▶│ frontend worker │
223
+ // │ │ │ │
224
+ // └──────────────────┘ └──────────────────┘
225
+ // │ │
226
+ // │
227
+ // only in │ │
228
+ // microservice ┌──────────────────┐ │
229
+ // querier │ │ internal Querier │ │
230
+ // ─ ─ ─ ─▶│ router │◀─────┘
231
+ // │ │
232
+ // └──────────────────┘
233
+ // │
234
+ // │
235
+ // /metadata & /chunk ┌─────────────────────┼─────────────────────┐
236
+ // requests │ │ │
237
+ // │ │ │
238
+ // ▼ ▼ ▼
239
+ // ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
240
+ // │ │ │ │ │ │
241
+ // │Querier Queryable │ │ /api/v1 router │ │ /api/prom router │
242
+ // │ │ │ │ │ │
243
+ // └──────────────────┘ └──────────────────┘ └──────────────────┘
244
+ // ▲ │ │
245
+ // │ └──────────┬──────────┘
246
+ // │ ▼
247
+ // │ ┌──────────────────┐
248
+ // │ │ │
249
+ // └──────────────────────│ Prometheus API │
250
+ // │ │
251
+ // └──────────────────┘
215
252
func (t * Cortex ) initQuerier () (serv services.Service , err error ) {
216
253
// Create a internal HTTP handler that is configured with the Prometheus API routes and points
217
254
// to a Prometheus API struct instantiated with the Cortex Queryable.
218
- queryHandler := api .NewQuerierHandler (
255
+ internalQuerierRouter := api .NewQuerierHandler (
219
256
t .Cfg .API ,
220
257
t .QuerierQueryable ,
221
258
t .QuerierEngine ,
@@ -230,12 +267,12 @@ func (t *Cortex) initQuerier() (serv services.Service, err error) {
230
267
// to ensure requests it processes use the default middleware instrumentation.
231
268
if ! t .Cfg .isModuleEnabled (QueryFrontend ) && ! t .Cfg .isModuleEnabled (All ) {
232
269
// First, register the internal querier handler with the external HTTP server
233
- t .API .RegisterQueryAPI (queryHandler )
270
+ t .API .RegisterQueryAPI (internalQuerierRouter )
234
271
235
272
// Second, set the http.Handler that the frontend worker will use to process requests to point to
236
273
// the external HTTP server. This will allow the querier to consolidate query metrics both external
237
274
// and internal using the default instrumentation when running as a standalone service.
238
- queryHandler = t .Server .HTTPServer .Handler
275
+ internalQuerierRouter = t .Server .HTTPServer .Handler
239
276
} else {
240
277
// Single binary mode requires a query frontend endpoint for the worker. If no frontend endpoint
241
278
// is configured, Cortex will default to using localhost on it's own GRPC listening port.
@@ -248,12 +285,12 @@ func (t *Cortex) initQuerier() (serv services.Service, err error) {
248
285
// If queries are processed using the external HTTP Server, we need wrap the internal querier with
249
286
// HTTP router with middleware to parse the tenant ID from the HTTP header and inject it into the
250
287
// request context.
251
- queryHandler = middleware .AuthenticateUser .Wrap (queryHandler )
288
+ internalQuerierRouter = middleware .AuthenticateUser .Wrap (internalQuerierRouter )
252
289
}
253
290
254
291
// Query frontend worker will only be started after all its dependencies are started, not here.
255
292
// Worker may also be nil, if not configured, which is OK.
256
- worker , err := frontend .NewWorker (t .Cfg .Worker , t .Cfg .Querier , httpgrpc_server .NewServer (queryHandler ), util .Logger )
293
+ worker , err := frontend .NewWorker (t .Cfg .Worker , t .Cfg .Querier , httpgrpc_server .NewServer (internalQuerierRouter ), util .Logger )
257
294
if err != nil {
258
295
return nil , err
259
296
}
0 commit comments