diff --git a/CHANGELOG.md b/CHANGELOG.md index d0c1e779d7..91d5dcbe13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ * [CHANGE] Drops support Prometheus 1.x rule format on configdb. #4826 * [CHANGE] Removes `-ingester.stream-chunks-when-using-blocks` experimental flag and stream chunks by default when `querier.ingester-streaming` is enabled. #4864 * [CHANGE] Compactor: Added `cortex_compactor_runs_interrupted_total` to separate compaction interruptions from failures +* [CHANGE] Enable PromQL `@` modifier, negative offset always. #4927 * [ENHANCEMENT] AlertManager: Retrying AlertManager Get Requests (Get Alertmanager status, Get Alertmanager Receivers) on next replica on error #4840 * [ENHANCEMENT] Querier/Ruler: Retry store-gateway in case of unexpected failure, instead of failing the query. #4532 #4839 * [ENHANCEMENT] Ring: DoBatch prioritize 4xx errors when failing. #4783 diff --git a/docs/blocks-storage/querier.md b/docs/blocks-storage/querier.md index 3c8cbdc3d6..f199fe8815 100644 --- a/docs/blocks-storage/querier.md +++ b/docs/blocks-storage/querier.md @@ -136,10 +136,6 @@ querier: # CLI flag: -querier.query-store-for-labels-enabled [query_store_for_labels_enabled: | default = false] - # Enable the @ modifier in PromQL. - # CLI flag: -querier.at-modifier-enabled - [at_modifier_enabled: | default = false] - # Enable returning samples stats per steps in query response. # CLI flag: -querier.per-step-stats-enabled [per_step_stats_enabled: | default = false] diff --git a/docs/configuration/config-file-reference.md b/docs/configuration/config-file-reference.md index e97d4cdb6f..e717e6ec7a 100644 --- a/docs/configuration/config-file-reference.md +++ b/docs/configuration/config-file-reference.md @@ -814,10 +814,6 @@ The `querier_config` configures the Cortex querier. # CLI flag: -querier.query-store-for-labels-enabled [query_store_for_labels_enabled: | default = false] -# Enable the @ modifier in PromQL. -# CLI flag: -querier.at-modifier-enabled -[at_modifier_enabled: | default = false] - # Enable returning samples stats per steps in query response. # CLI flag: -querier.per-step-stats-enabled [per_step_stats_enabled: | default = false] diff --git a/pkg/cortex/modules.go b/pkg/cortex/modules.go index 3e66efd51d..ba573fddbd 100644 --- a/pkg/cortex/modules.go +++ b/pkg/cortex/modules.go @@ -533,14 +533,15 @@ func (t *Cortex) initRuler() (serv services.Service, err error) { if t.Cfg.ExternalPusher != nil && t.Cfg.ExternalQueryable != nil { rulerRegisterer := prometheus.WrapRegistererWith(prometheus.Labels{"engine": "ruler"}, prometheus.DefaultRegisterer) engine := promql.NewEngine(promql.EngineOpts{ - Logger: util_log.Logger, - Reg: rulerRegisterer, - ActiveQueryTracker: createActiveQueryTracker(t.Cfg.Querier, util_log.Logger), - MaxSamples: t.Cfg.Querier.MaxSamples, - Timeout: t.Cfg.Querier.Timeout, - LookbackDelta: t.Cfg.Querier.LookbackDelta, - EnablePerStepStats: t.Cfg.Querier.EnablePerStepStats, - EnableAtModifier: t.Cfg.Querier.AtModifierEnabled, + Logger: util_log.Logger, + Reg: rulerRegisterer, + ActiveQueryTracker: createActiveQueryTracker(t.Cfg.Querier, util_log.Logger), + MaxSamples: t.Cfg.Querier.MaxSamples, + Timeout: t.Cfg.Querier.Timeout, + LookbackDelta: t.Cfg.Querier.LookbackDelta, + EnablePerStepStats: t.Cfg.Querier.EnablePerStepStats, + EnableAtModifier: true, + EnableNegativeOffset: true, NoStepSubqueryIntervalFn: func(int64) int64 { return t.Cfg.Querier.DefaultEvaluationInterval.Milliseconds() }, diff --git a/pkg/querier/querier.go b/pkg/querier/querier.go index d17ab287e7..2c950f28d4 100644 --- a/pkg/querier/querier.go +++ b/pkg/querier/querier.go @@ -30,7 +30,9 @@ import ( seriesset "github.com/cortexproject/cortex/pkg/querier/series" "github.com/cortexproject/cortex/pkg/tenant" "github.com/cortexproject/cortex/pkg/util" + "github.com/cortexproject/cortex/pkg/util/flagext" "github.com/cortexproject/cortex/pkg/util/limiter" + util_log "github.com/cortexproject/cortex/pkg/util/log" "github.com/cortexproject/cortex/pkg/util/spanlogger" "github.com/cortexproject/cortex/pkg/util/validation" ) @@ -46,7 +48,7 @@ type Config struct { MaxSamples int `yaml:"max_samples"` QueryIngestersWithin time.Duration `yaml:"query_ingesters_within"` QueryStoreForLabels bool `yaml:"query_store_for_labels_enabled"` - AtModifierEnabled bool `yaml:"at_modifier_enabled"` + AtModifierEnabled bool `yaml:"at_modifier_enabled" doc:"hidden"` EnablePerStepStats bool `yaml:"per_step_stats_enabled"` // QueryStoreAfter the time after which queries should also be sent to the store and not just ingesters. @@ -82,6 +84,9 @@ var ( // RegisterFlags adds the flags required to config this to the given FlagSet. func (cfg *Config) RegisterFlags(f *flag.FlagSet) { + //lint:ignore faillint Need to pass the global logger like this for warning on deprecated methods + flagext.DeprecatedFlag(f, "querier.at-modifier-enabled", "This flag is no longer functional; at-modifier is always enabled now.", util_log.Logger) + cfg.StoreGatewayClient.RegisterFlagsWithPrefix("querier.store-gateway-client", f) f.IntVar(&cfg.MaxConcurrent, "querier.max-concurrent", 20, "The maximum number of concurrent queries.") f.DurationVar(&cfg.Timeout, "querier.timeout", 2*time.Minute, "The timeout for a query.") @@ -92,7 +97,6 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) { f.IntVar(&cfg.MaxSamples, "querier.max-samples", 50e6, "Maximum number of samples a single query can load into memory.") f.DurationVar(&cfg.QueryIngestersWithin, "querier.query-ingesters-within", 0, "Maximum lookback beyond which queries are not sent to ingester. 0 means all queries are sent to ingester.") f.BoolVar(&cfg.QueryStoreForLabels, "querier.query-store-for-labels-enabled", false, "Query long-term store for series, label values and label names APIs. Works only with blocks engine.") - f.BoolVar(&cfg.AtModifierEnabled, "querier.at-modifier-enabled", false, "Enable the @ modifier in PromQL.") f.BoolVar(&cfg.EnablePerStepStats, "querier.per-step-stats-enabled", false, "Enable returning samples stats per steps in query response.") f.DurationVar(&cfg.MaxQueryIntoFuture, "querier.max-query-into-future", 10*time.Minute, "Maximum duration into the future you can query. 0 to disable.") f.DurationVar(&cfg.DefaultEvaluationInterval, "querier.default-evaluation-interval", time.Minute, "The default evaluation interval or step size for subqueries.") @@ -163,14 +167,15 @@ func New(cfg Config, limits *validation.Overrides, distributor Distributor, stor }) engine := promql.NewEngine(promql.EngineOpts{ - Logger: logger, - Reg: reg, - ActiveQueryTracker: createActiveQueryTracker(cfg, logger), - MaxSamples: cfg.MaxSamples, - Timeout: cfg.Timeout, - LookbackDelta: cfg.LookbackDelta, - EnablePerStepStats: cfg.EnablePerStepStats, - EnableAtModifier: cfg.AtModifierEnabled, + Logger: logger, + Reg: reg, + ActiveQueryTracker: createActiveQueryTracker(cfg, logger), + MaxSamples: cfg.MaxSamples, + Timeout: cfg.Timeout, + LookbackDelta: cfg.LookbackDelta, + EnablePerStepStats: cfg.EnablePerStepStats, + EnableAtModifier: true, + EnableNegativeOffset: true, NoStepSubqueryIntervalFn: func(int64) int64 { return cfg.DefaultEvaluationInterval.Milliseconds() },