diff --git a/pkg/loki/loki.go b/pkg/loki/loki.go index 3ae9d20627bd4..744b5aaa5e07d 100644 --- a/pkg/loki/loki.go +++ b/pkg/loki/loki.go @@ -21,6 +21,7 @@ import ( "github.com/weaveworks/common/signals" "github.com/cortexproject/cortex/pkg/chunk" + cortex_tripper "github.com/cortexproject/cortex/pkg/querier/queryrange" "github.com/cortexproject/cortex/pkg/ring" "github.com/cortexproject/cortex/pkg/ring/kv/memberlist" cortex_ruler "github.com/cortexproject/cortex/pkg/ruler" @@ -148,24 +149,25 @@ type Loki struct { ModuleManager *modules.Manager serviceMap map[string]services.Service - Server *server.Server - ring *ring.Ring - overrides *validation.Overrides - tenantConfigs *runtime.TenantConfigs - distributor *distributor.Distributor - ingester *ingester.Ingester - querier *querier.Querier - ingesterQuerier *querier.IngesterQuerier - store storage.Store - tableManager *chunk.TableManager - frontend *frontend.Frontend - ruler *cortex_ruler.Ruler - RulerStorage rulestore.RuleStore - rulerAPI *cortex_ruler.API - stopper queryrange.Stopper - runtimeConfig *runtimeconfig.Manager - memberlistKV *memberlist.KVInitService - compactor *compactor.Compactor + Server *server.Server + ring *ring.Ring + overrides *validation.Overrides + tenantConfigs *runtime.TenantConfigs + distributor *distributor.Distributor + ingester *ingester.Ingester + Querier *querier.Querier + ingesterQuerier *querier.IngesterQuerier + store storage.Store + tableManager *chunk.TableManager + frontend *frontend.Frontend + ruler *cortex_ruler.Ruler + RulerStorage rulestore.RuleStore + rulerAPI *cortex_ruler.API + stopper queryrange.Stopper + runtimeConfig *runtimeconfig.Manager + memberlistKV *memberlist.KVInitService + compactor *compactor.Compactor + QueryFrontEndTripperware cortex_tripper.Tripperware HTTPAuthMiddleware middleware.Interface } diff --git a/pkg/loki/modules.go b/pkg/loki/modules.go index 7c8e57a548ec6..2b9aea076a3bc 100644 --- a/pkg/loki/modules.go +++ b/pkg/loki/modules.go @@ -193,7 +193,7 @@ func (t *Loki) initQuerier() (services.Service, error) { if t.cfg.Ingester.QueryStoreMaxLookBackPeriod != 0 { t.cfg.Querier.IngesterQueryStoreMaxLookback = t.cfg.Ingester.QueryStoreMaxLookBackPeriod } - t.querier, err = querier.New(t.cfg.Querier, t.store, t.ingesterQuerier, t.overrides) + t.Querier, err = querier.New(t.cfg.Querier, t.store, t.ingesterQuerier, t.overrides) if err != nil { return nil, err } @@ -204,21 +204,21 @@ func (t *Loki) initQuerier() (services.Service, error) { serverutil.NewPrepopulateMiddleware(), serverutil.ResponseJSONMiddleware(), ) - t.Server.HTTP.Handle("/loki/api/v1/query_range", httpMiddleware.Wrap(http.HandlerFunc(t.querier.RangeQueryHandler))) - t.Server.HTTP.Handle("/loki/api/v1/query", httpMiddleware.Wrap(http.HandlerFunc(t.querier.InstantQueryHandler))) + t.Server.HTTP.Handle("/loki/api/v1/query_range", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.RangeQueryHandler))) + t.Server.HTTP.Handle("/loki/api/v1/query", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.InstantQueryHandler))) // Prometheus compatibility requires `loki/api/v1/labels` however we already released `loki/api/v1/label` // which is a little more consistent with `/loki/api/v1/label/{name}/values` so we are going to handle both paths. - t.Server.HTTP.Handle("/loki/api/v1/label", httpMiddleware.Wrap(http.HandlerFunc(t.querier.LabelHandler))) - t.Server.HTTP.Handle("/loki/api/v1/labels", httpMiddleware.Wrap(http.HandlerFunc(t.querier.LabelHandler))) - t.Server.HTTP.Handle("/loki/api/v1/label/{name}/values", httpMiddleware.Wrap(http.HandlerFunc(t.querier.LabelHandler))) - t.Server.HTTP.Handle("/loki/api/v1/tail", httpMiddleware.Wrap(http.HandlerFunc(t.querier.TailHandler))) - t.Server.HTTP.Handle("/loki/api/v1/series", httpMiddleware.Wrap(http.HandlerFunc(t.querier.SeriesHandler))) - - t.Server.HTTP.Handle("/api/prom/query", httpMiddleware.Wrap(http.HandlerFunc(t.querier.LogQueryHandler))) - t.Server.HTTP.Handle("/api/prom/label", httpMiddleware.Wrap(http.HandlerFunc(t.querier.LabelHandler))) - t.Server.HTTP.Handle("/api/prom/label/{name}/values", httpMiddleware.Wrap(http.HandlerFunc(t.querier.LabelHandler))) - t.Server.HTTP.Handle("/api/prom/tail", httpMiddleware.Wrap(http.HandlerFunc(t.querier.TailHandler))) - t.Server.HTTP.Handle("/api/prom/series", httpMiddleware.Wrap(http.HandlerFunc(t.querier.SeriesHandler))) + t.Server.HTTP.Handle("/loki/api/v1/label", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.LabelHandler))) + t.Server.HTTP.Handle("/loki/api/v1/labels", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.LabelHandler))) + t.Server.HTTP.Handle("/loki/api/v1/label/{name}/values", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.LabelHandler))) + t.Server.HTTP.Handle("/loki/api/v1/tail", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.TailHandler))) + t.Server.HTTP.Handle("/loki/api/v1/series", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.SeriesHandler))) + + t.Server.HTTP.Handle("/api/prom/query", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.LogQueryHandler))) + t.Server.HTTP.Handle("/api/prom/label", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.LabelHandler))) + t.Server.HTTP.Handle("/api/prom/label/{name}/values", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.LabelHandler))) + t.Server.HTTP.Handle("/api/prom/tail", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.TailHandler))) + t.Server.HTTP.Handle("/api/prom/series", httpMiddleware.Wrap(http.HandlerFunc(t.Querier.SeriesHandler))) return worker, nil // ok if worker is nil here } @@ -410,6 +410,10 @@ func (t *Loki) initQueryFrontend() (_ services.Service, err error) { t.stopper = stopper roundTripper = tripperware(roundTripper) + if t.QueryFrontEndTripperware != nil { + roundTripper = t.QueryFrontEndTripperware(roundTripper) + } + frontendHandler := transport.NewHandler(t.cfg.Frontend.Handler, roundTripper, util_log.Logger, prometheus.DefaultRegisterer) if t.cfg.Frontend.CompressResponses { frontendHandler = gziphandler.GzipHandler(frontendHandler) diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 6da917a7fd67e..6ffda054830db 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -77,6 +77,10 @@ func New(cfg Config, store storage.Store, ingesterQuerier *IngesterQuerier, limi return &querier, nil } +func (q *Querier) SetQueryable(queryable logql.Querier) { + q.engine = logql.NewEngine(q.cfg.Engine, queryable, q.limits) +} + // Select Implements logql.Querier which select logs via matchers and regex filters. func (q *Querier) SelectLogs(ctx context.Context, params logql.SelectLogParams) (iter.EntryIterator, error) { err := q.validateQueryRequest(ctx, params)