diff --git a/pkg/loki/loki.go b/pkg/loki/loki.go index 840f953538..7f69677417 100644 --- a/pkg/loki/loki.go +++ b/pkg/loki/loki.go @@ -179,6 +179,9 @@ func (c *Config) Validate() error { if err := c.QueryRange.Validate(); err != nil { return errors.Wrap(err, "invalid queryrange config") } + if err := c.Querier.Validate(); err != nil { + return errors.Wrap(err, "invalid querier config") + } if err := c.TableManager.Validate(); err != nil { return errors.Wrap(err, "invalid tablemanager config") } diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index 215426d631..d0778fca0e 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -12,6 +12,7 @@ import ( cortex_validation "github.com/cortexproject/cortex/pkg/util/validation" "github.com/go-kit/log/level" + "github.com/pkg/errors" "github.com/grafana/loki/pkg/util/spanlogger" @@ -49,6 +50,7 @@ type Config struct { Engine logql.EngineOpts `yaml:"engine,omitempty"` MaxConcurrent int `yaml:"max_concurrent"` QueryStoreOnly bool `yaml:"query_store_only"` + QueryIngesterOnly bool `yaml:"query_ingester_only"` } // RegisterFlags register flags. @@ -60,6 +62,15 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.DurationVar(&cfg.QueryIngestersWithin, "querier.query-ingesters-within", 3*time.Hour, "Maximum lookback beyond which queries are not sent to ingester. 0 means all queries are sent to ingester.") f.IntVar(&cfg.MaxConcurrent, "querier.max-concurrent", 10, "The maximum number of concurrent queries.") f.BoolVar(&cfg.QueryStoreOnly, "querier.query-store-only", false, "Queriers should only query the store and not try to query any ingesters") + f.BoolVar(&cfg.QueryIngesterOnly, "querier.query-ingester-only", false, "Queriers should only query the ingesters and not try to query any store") +} + +// Validate validates the config. +func (cfg *Config) Validate() error { + if cfg.QueryStoreOnly && cfg.QueryIngesterOnly { + return errors.New("querier.query_store_only and querier.query_store_only cannot both be true") + } + return nil } // Querier handlers queries. @@ -120,7 +131,7 @@ func (q *Querier) SelectLogs(ctx context.Context, params logql.SelectLogParams) iters = append(iters, ingesterIters...) } - if storeQueryInterval != nil { + if !q.cfg.QueryIngesterOnly && storeQueryInterval != nil { params.Start = storeQueryInterval.start params.End = storeQueryInterval.end level.Debug(spanlogger.FromContext(ctx)).Log( @@ -165,7 +176,7 @@ func (q *Querier) SelectSamples(ctx context.Context, params logql.SelectSamplePa iters = append(iters, ingesterIters...) } - if storeQueryInterval != nil { + if !q.cfg.QueryIngesterOnly && storeQueryInterval != nil { params.Start = storeQueryInterval.start params.End = storeQueryInterval.end @@ -277,17 +288,19 @@ func (q *Querier) Label(ctx context.Context, req *logproto.LabelRequest) (*logpr } } - from, through := model.TimeFromUnixNano(req.Start.UnixNano()), model.TimeFromUnixNano(req.End.UnixNano()) var storeValues []string - if req.Values { - storeValues, err = q.store.LabelValuesForMetricName(ctx, userID, from, through, "logs", req.Name) - if err != nil { - return nil, err - } - } else { - storeValues, err = q.store.LabelNamesForMetricName(ctx, userID, from, through, "logs") - if err != nil { - return nil, err + if !q.cfg.QueryIngesterOnly { + from, through := model.TimeFromUnixNano(req.Start.UnixNano()), model.TimeFromUnixNano(req.End.UnixNano()) + if req.Values { + storeValues, err = q.store.LabelValuesForMetricName(ctx, userID, from, through, "logs", req.Name) + if err != nil { + return nil, err + } + } else { + storeValues, err = q.store.LabelNamesForMetricName(ctx, userID, from, through, "logs") + if err != nil { + return nil, err + } } } @@ -396,14 +409,16 @@ func (q *Querier) awaitSeries(ctx context.Context, req *logproto.SeriesRequest) }() } - go func() { - storeValues, err := q.seriesForMatchers(ctx, req.Start, req.End, req.GetGroups(), req.Shards) - if err != nil { - errs <- err - return - } - series <- [][]logproto.SeriesIdentifier{storeValues} - }() + if !q.cfg.QueryIngesterOnly { + go func() { + storeValues, err := q.seriesForMatchers(ctx, req.Start, req.End, req.GetGroups(), req.Shards) + if err != nil { + errs <- err + return + } + series <- [][]logproto.SeriesIdentifier{storeValues} + }() + } var sets [][]logproto.SeriesIdentifier for i := 0; i < 2; i++ {