Skip to content

Commit 4fcd0ec

Browse files
committed
Address comments
Signed-off-by: 🌲 Harry 🌊 John 🏔 <[email protected]>
1 parent 895dd48 commit 4fcd0ec

31 files changed

+121
-72
lines changed

docs/blocks-storage/querier.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ querier:
257257
# https://github.com/thanos-io/promql-engine rather than the Prometheus
258258
# promql engine.
259259
# CLI flag: -querier.thanos-engine
260-
[enable_thanos_engine: <boolean> | default = false]
260+
[enabled: <boolean> | default = false]
261261

262262
# Enable xincrease, xdelta, xrate etc from Thanos engine.
263263
# CLI flag: -querier.enable-x-functions

docs/configuration/config-file-reference.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4307,7 +4307,7 @@ thanos_engine:
43074307
# https://github.com/thanos-io/promql-engine rather than the Prometheus promql
43084308
# engine.
43094309
# CLI flag: -querier.thanos-engine
4310-
[enable_thanos_engine: <boolean> | default = false]
4310+
[enabled: <boolean> | default = false]
43114311

43124312
# Enable xincrease, xdelta, xrate etc from Thanos engine.
43134313
# CLI flag: -querier.enable-x-functions
@@ -5034,6 +5034,23 @@ ring:
50345034
# ruler.enable-ha-evaluation is true.
50355035
# CLI flag: -ruler.liveness-check-timeout
50365036
[liveness_check_timeout: <duration> | default = 1s]
5037+
5038+
thanos_engine:
5039+
# Experimental. Use Thanos promql engine
5040+
# https://github.com/thanos-io/promql-engine rather than the Prometheus promql
5041+
# engine.
5042+
# CLI flag: -ruler.thanos-engine
5043+
[enabled: <boolean> | default = false]
5044+
5045+
# Enable xincrease, xdelta, xrate etc from Thanos engine.
5046+
# CLI flag: -ruler.enable-x-functions
5047+
[enable_x_functions: <boolean> | default = false]
5048+
5049+
# Logical plan optimizers. Multiple optimizers can be provided as a
5050+
# comma-separated list. Supported values: default, all, propagate-matchers,
5051+
# sort-matchers, merge-selects, detect-histogram-stats
5052+
# CLI flag: -ruler.optimizers
5053+
[optimizers: <string> | default = "default"]
50375054
```
50385055
50395056
### `ruler_storage_config`

pkg/configs/userconfig/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import (
99
"github.com/pkg/errors"
1010
"github.com/prometheus/prometheus/model/labels"
1111
"github.com/prometheus/prometheus/model/rulefmt"
12-
"github.com/prometheus/prometheus/promql/parser"
1312
"github.com/prometheus/prometheus/rules"
1413
"gopkg.in/yaml.v3"
1514

15+
"github.com/cortexproject/cortex/pkg/parser"
1616
util_log "github.com/cortexproject/cortex/pkg/util/log"
1717
)
1818

pkg/configs/userconfig/config_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ import (
1212
"github.com/prometheus/common/model"
1313
"github.com/prometheus/prometheus/model/labels"
1414
"github.com/prometheus/prometheus/model/rulefmt"
15-
"github.com/prometheus/prometheus/promql/parser"
1615
"github.com/prometheus/prometheus/rules"
1716
"github.com/stretchr/testify/assert"
1817
"github.com/stretchr/testify/require"
1918
"gopkg.in/yaml.v3"
2019

20+
"github.com/cortexproject/cortex/pkg/parser"
2121
util_log "github.com/cortexproject/cortex/pkg/util/log"
2222
)
2323

pkg/cortex/cortex.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ func New(cfg Config) (*Cortex, error) {
379379
return nil, err
380380
}
381381

382+
cortex.setupPromQLFunctions()
382383
return cortex, nil
383384
}
384385

@@ -537,3 +538,9 @@ func (t *Cortex) readyHandler(sm *services.Manager) http.HandlerFunc {
537538
util.WriteTextResponse(w, "ready")
538539
}
539540
}
541+
542+
func (t *Cortex) setupPromQLFunctions() {
543+
// The holt_winters function is renamed to double_exponential_smoothing and has been experimental since Prometheus v3. (https://github.com/prometheus/prometheus/pull/14930)
544+
// The cortex supports holt_winters for users using this function.
545+
querier.EnableExperimentalPromQLFunctions(t.Cfg.Querier.EnablePromQLExperimentalFunctions, true)
546+
}

pkg/cortex/modules.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,6 @@ func (t *Cortex) initQueryFrontendTripperware() (serv services.Service, err erro
555555
t.Cfg.Querier.DefaultEvaluationInterval,
556556
t.Cfg.Querier.MaxSubQuerySteps,
557557
t.Cfg.Querier.LookbackDelta,
558-
t.Cfg.Querier.EnablePromQLExperimentalFunctions,
559558
)
560559

561560
return services.NewIdleService(nil, func(_ error) error {
@@ -648,7 +647,7 @@ func (t *Cortex) initRuler() (serv services.Service, err error) {
648647
return t.Cfg.Querier.DefaultEvaluationInterval.Milliseconds()
649648
},
650649
}
651-
queryEngine := engine.New(opts, t.Cfg.Querier.Engine, rulerRegisterer)
650+
queryEngine := engine.New(opts, t.Cfg.Ruler.ThanosEngine, rulerRegisterer)
652651

653652
managerFactory := ruler.DefaultTenantManagerFactory(t.Cfg.Ruler, t.Cfg.ExternalPusher, t.Cfg.ExternalQueryable, queryEngine, t.Overrides, metrics, prometheus.DefaultRegisterer)
654653
manager, err = ruler.NewDefaultMultiTenantManager(t.Cfg.Ruler, t.Overrides, managerFactory, metrics, prometheus.DefaultRegisterer, util_log.Logger)

pkg/engine/config.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,21 @@ import (
1010

1111
var supportedOptimizers = []string{"default", "all", "propagate-matchers", "sort-matchers", "merge-selects", "detect-histogram-stats"}
1212

13-
// Config contains the configuration to create engine
14-
type Config struct {
15-
EnableThanosEngine bool `yaml:"enable_thanos_engine"`
16-
EnableXFunctions bool `yaml:"enable_x_functions"`
17-
Optimizers string `yaml:"optimizers"`
18-
LogicalOptimizers []logicalplan.Optimizer `yaml:"-"`
13+
// ThanosEngineConfig contains the configuration to create engine
14+
type ThanosEngineConfig struct {
15+
Enabled bool `yaml:"enabled"`
16+
EnableXFunctions bool `yaml:"enable_x_functions"`
17+
Optimizers string `yaml:"optimizers"`
18+
LogicalOptimizers []logicalplan.Optimizer `yaml:"-"`
1919
}
2020

21-
// RegisterFlags adds the flags required to config this to the given FlagSet.
22-
func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
23-
f.BoolVar(&cfg.EnableThanosEngine, "querier.thanos-engine", false, "Experimental. Use Thanos promql engine https://github.com/thanos-io/promql-engine rather than the Prometheus promql engine.")
24-
f.BoolVar(&cfg.EnableXFunctions, "querier.enable-x-functions", false, "Enable xincrease, xdelta, xrate etc from Thanos engine.")
25-
f.StringVar(&cfg.Optimizers, "querier.optimizers", "default", "Logical plan optimizers. Multiple optimizers can be provided as a comma-separated list. Supported values: "+strings.Join(supportedOptimizers, ", "))
21+
func (cfg *ThanosEngineConfig) RegisterFlagsWithPrefix(prefix string, f *flag.FlagSet) {
22+
f.BoolVar(&cfg.Enabled, prefix+"thanos-engine", false, "Experimental. Use Thanos promql engine https://github.com/thanos-io/promql-engine rather than the Prometheus promql engine.")
23+
f.BoolVar(&cfg.EnableXFunctions, prefix+"enable-x-functions", false, "Enable xincrease, xdelta, xrate etc from Thanos engine.")
24+
f.StringVar(&cfg.Optimizers, prefix+"optimizers", "default", "Logical plan optimizers. Multiple optimizers can be provided as a comma-separated list. Supported values: "+strings.Join(supportedOptimizers, ", "))
2625
}
2726

28-
func (cfg *Config) Validate() error {
27+
func (cfg *ThanosEngineConfig) Validate() error {
2928
splitOptimizers := strings.Split(cfg.Optimizers, ",")
3029

3130
for _, optimizer := range splitOptimizers {

pkg/engine/engine.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,16 @@ type Engine struct {
5151
engineSwitchQueriesTotal *prometheus.CounterVec
5252
}
5353

54-
func New(opts promql.EngineOpts, engineCfg Config, reg prometheus.Registerer) *Engine {
54+
func New(opts promql.EngineOpts, thanosEngineCfg ThanosEngineConfig, reg prometheus.Registerer) *Engine {
5555
prometheusEngine := promql.NewEngine(opts)
5656

5757
var thanosEngine *thanosengine.Engine
58-
if engineCfg.EnableThanosEngine {
58+
if thanosEngineCfg.Enabled {
5959
thanosEngine = thanosengine.New(thanosengine.Opts{
6060
EngineOpts: opts,
61-
LogicalOptimizers: engineCfg.LogicalOptimizers,
61+
LogicalOptimizers: thanosEngineCfg.LogicalOptimizers,
6262
EnableAnalysis: true,
63-
EnableXFunctions: engineCfg.EnableXFunctions,
63+
EnableXFunctions: thanosEngineCfg.EnableXFunctions,
6464
})
6565
}
6666

pkg/engine/engine_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func TestEngine_Fallback(t *testing.T) {
3939
Logger: utillog.GoKitLogToSlog(log.NewNopLogger()),
4040
Reg: reg,
4141
}
42-
queryEngine := New(opts, Config{EnableThanosEngine: true}, reg)
42+
queryEngine := New(opts, ThanosEngineConfig{Enabled: true}, reg)
4343

4444
// instant query, should go to fallback
4545
_, _ = queryEngine.NewInstantQuery(ctx, queryable, nil, "unimplemented(foo)", now)
@@ -70,7 +70,7 @@ func TestEngine_Switch(t *testing.T) {
7070
Logger: utillog.GoKitLogToSlog(log.NewNopLogger()),
7171
Reg: reg,
7272
}
73-
queryEngine := New(opts, Config{EnableThanosEngine: true}, reg)
73+
queryEngine := New(opts, ThanosEngineConfig{Enabled: true}, reg)
7474

7575
// Query Prometheus engine
7676
r := &http.Request{Header: http.Header{}}
@@ -111,7 +111,7 @@ func TestEngine_XFunctions(t *testing.T) {
111111
Logger: utillog.GoKitLogToSlog(log.NewNopLogger()),
112112
Reg: reg,
113113
}
114-
queryEngine := New(opts, Config{EnableThanosEngine: true, EnableXFunctions: true}, reg)
114+
queryEngine := New(opts, ThanosEngineConfig{Enabled: true, EnableXFunctions: true}, reg)
115115

116116
for name := range parse.XFunctions {
117117
t.Run(name, func(t *testing.T) {

pkg/parser/parser.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package parser
2+
3+
import (
4+
"maps"
5+
6+
promqlparser "github.com/prometheus/prometheus/promql/parser"
7+
"github.com/thanos-io/promql-engine/execution/parse"
8+
)
9+
10+
var functions = buildFunctions()
11+
12+
func buildFunctions() map[string]*promqlparser.Function {
13+
fns := make(map[string]*promqlparser.Function, len(promqlparser.Functions))
14+
maps.Copy(fns, promqlparser.Functions)
15+
maps.Copy(fns, parse.XFunctions)
16+
return fns
17+
}
18+
19+
func ParseExpr(qs string) (promqlparser.Expr, error) {
20+
return promqlparser.NewParser(qs, promqlparser.WithFunctions(functions)).ParseExpr()
21+
}

0 commit comments

Comments
 (0)