Skip to content

Commit 717b8cd

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

29 files changed

+102
-70
lines changed

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+
}

pkg/querier/batch/batch_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ func TestSeekCorrectlyDealWithSinglePointChunks(t *testing.T) {
149149
require.Equal(t, histograms[0], val)
150150
require.Equal(t, int64(1*time.Second/time.Millisecond), actual)
151151

152-
// Histogram chunk should support querying float histograms since it is what Query Engine does.
152+
// Histogram chunk should support querying float histograms since it is what Query ThanosEngine does.
153153
actualT, fh := sut.AtFloatHistogram(nil)
154154
require.Equal(t, histograms[0].ToFloat(nil), fh)
155155
require.Equal(t, int64(1*time.Second/time.Millisecond), actualT)

pkg/querier/querier.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ type Config struct {
8585

8686
ShuffleShardingIngestersLookbackPeriod time.Duration `yaml:"shuffle_sharding_ingesters_lookback_period"`
8787

88-
Engine engine.Config `yaml:"thanos_engine"`
88+
ThanosEngine engine.ThanosEngineConfig `yaml:"thanos_engine"`
8989

9090
// Ignore max query length check at Querier.
9191
IgnoreMaxQueryLength bool `yaml:"ignore_max_query_length"`
@@ -109,6 +109,8 @@ var (
109109

110110
// RegisterFlags adds the flags required to config this to the given FlagSet.
111111
func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
112+
cfg.ThanosEngine.RegisterFlagsWithPrefix("querier.", f)
113+
112114
//lint:ignore faillint Need to pass the global logger like this for warning on deprecated methods
113115
flagext.DeprecatedFlag(f, "querier.ingester-streaming", "Deprecated: Use streaming RPCs to query ingester. QueryStream is always enabled and the flag is not effective anymore.", util_log.Logger)
114116
//lint:ignore faillint Need to pass the global logger like this for warning on deprecated methods
@@ -143,8 +145,6 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
143145
f.BoolVar(&cfg.EnableParquetQueryable, "querier.enable-parquet-queryable", false, "[Experimental] If true, querier will try to query the parquet files if available.")
144146
f.IntVar(&cfg.ParquetQueryableShardCacheSize, "querier.parquet-queryable-shard-cache-size", 512, "[Experimental] [Experimental] Maximum size of the Parquet queryable shard cache. 0 to disable.")
145147
f.StringVar(&cfg.ParquetQueryableDefaultBlockStore, "querier.parquet-queryable-default-block-store", string(parquetBlockStore), "Parquet queryable's default block store to query. Valid options are tsdb and parquet. If it is set to tsdb, parquet queryable always fallback to store gateway.")
146-
147-
cfg.Engine.RegisterFlags(f)
148148
}
149149

150150
// Validate the config
@@ -180,7 +180,7 @@ func (cfg *Config) Validate() error {
180180
}
181181
}
182182

183-
if err := cfg.Engine.Validate(); err != nil {
183+
if err := cfg.ThanosEngine.Validate(); err != nil {
184184
return err
185185
}
186186

@@ -231,10 +231,6 @@ func New(cfg Config, limits *validation.Overrides, distributor Distributor, stor
231231
})
232232
maxConcurrentMetric.Set(float64(cfg.MaxConcurrent))
233233

234-
// The holt_winters function is renamed to double_exponential_smoothing and has been experimental since Prometheus v3. (https://github.com/prometheus/prometheus/pull/14930)
235-
// The cortex supports holt_winters for users using this function.
236-
EnableExperimentalPromQLFunctions(cfg.EnablePromQLExperimentalFunctions, true)
237-
238234
opts := promql.EngineOpts{
239235
Logger: util_log.GoKitLogToSlog(logger),
240236
Reg: reg,
@@ -249,7 +245,7 @@ func New(cfg Config, limits *validation.Overrides, distributor Distributor, stor
249245
return cfg.DefaultEvaluationInterval.Milliseconds()
250246
},
251247
}
252-
queryEngine := engine.New(opts, cfg.Engine, reg)
248+
queryEngine := engine.New(opts, cfg.ThanosEngine, reg)
253249
return NewSampleAndChunkQueryable(lazyQueryable), exemplarQueryable, queryEngine
254250
}
255251

0 commit comments

Comments
 (0)