Skip to content

Commit a3bc1f0

Browse files
committed
try disable binary expression for not on and no labels
Signed-off-by: yeya24 <[email protected]>
1 parent 1ca106f commit a3bc1f0

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

pkg/cortex/modules.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ func (t *Cortex) initFlusher() (serv services.Service, err error) {
511511
// initQueryFrontendTripperware instantiates the tripperware used by the query frontend
512512
// to optimize Prometheus query requests.
513513
func (t *Cortex) initQueryFrontendTripperware() (serv services.Service, err error) {
514-
queryAnalyzer := tripperware.NewDisableWithoutNameAnalyzer(querysharding.NewQueryAnalyzer())
514+
queryAnalyzer := tripperware.NewDisableBinaryExpressionAnalyzer(querysharding.NewQueryAnalyzer())
515515
// PrometheusCodec is a codec to encode and decode Prometheus query range requests and responses.
516516
prometheusCodec := queryrange.NewPrometheusCodec(false, t.Cfg.Querier.ResponseCompression, t.Cfg.API.QuerierDefaultCodec)
517517
// ShardedPrometheusCodec is same as PrometheusCodec but to be used on the sharded queries (it sum up the stats)

pkg/querier/tripperware/shard_by.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,27 @@ package tripperware
33
import (
44
"context"
55
"net/http"
6-
"slices"
76

87
"github.com/go-kit/log"
98
"github.com/go-kit/log/level"
10-
"github.com/prometheus/prometheus/model/labels"
9+
"github.com/pkg/errors"
10+
promqlparser "github.com/prometheus/prometheus/promql/parser"
1111
"github.com/thanos-io/thanos/pkg/querysharding"
1212
"github.com/thanos-io/thanos/pkg/store/storepb"
1313
"github.com/weaveworks/common/httpgrpc"
1414

15+
"github.com/cortexproject/cortex/pkg/parser"
1516
querier_stats "github.com/cortexproject/cortex/pkg/querier/stats"
1617
cquerysharding "github.com/cortexproject/cortex/pkg/querysharding"
1718
"github.com/cortexproject/cortex/pkg/tenant"
1819
util_log "github.com/cortexproject/cortex/pkg/util/log"
1920
"github.com/cortexproject/cortex/pkg/util/validation"
2021
)
2122

23+
var (
24+
stop = errors.New("stop")
25+
)
26+
2227
func ShardByMiddleware(logger log.Logger, limits Limits, merger Merger, queryAnalyzer querysharding.Analyzer) Middleware {
2328
return MiddlewareFunc(func(next Handler) Handler {
2429
return shardBy{
@@ -127,22 +132,33 @@ func InjectVerticalShardSizeToContext(ctx context.Context, verticalShardSize int
127132
return context.WithValue(ctx, verticalShardsKey{}, verticalShardSize)
128133
}
129134

130-
type disableWithoutNameAnalyzer struct {
135+
type disableBinaryExpressionAnalyzer struct {
131136
analyzer querysharding.Analyzer
132137
}
133138

134-
func NewDisableWithoutNameAnalyzer(analyzer querysharding.Analyzer) *disableWithoutNameAnalyzer {
135-
return &disableWithoutNameAnalyzer{analyzer: analyzer}
139+
func NewDisableBinaryExpressionAnalyzer(analyzer querysharding.Analyzer) *disableBinaryExpressionAnalyzer {
140+
return &disableBinaryExpressionAnalyzer{analyzer: analyzer}
136141
}
137142

138-
func (d *disableWithoutNameAnalyzer) Analyze(query string) (querysharding.QueryAnalysis, error) {
143+
func (d *disableBinaryExpressionAnalyzer) Analyze(query string) (querysharding.QueryAnalysis, error) {
139144
analysis, err := d.analyzer.Analyze(query)
140-
if err != nil || !analysis.IsShardable() || analysis.ShardBy() {
145+
if err != nil || !analysis.IsShardable() {
141146
return analysis, err
142147
}
143148

144-
// We are only interested in not shard by case.
145-
if slices.Contains(analysis.ShardingLabels(), labels.MetricName) {
149+
expr, _ := parser.ParseExpr(query)
150+
isShardable := true
151+
promqlparser.Inspect(expr, func(node promqlparser.Node, nodes []promqlparser.Node) error {
152+
switch n := node.(type) {
153+
case *promqlparser.BinaryExpr:
154+
if !n.VectorMatching.On && len(n.VectorMatching.MatchingLabels) == 0 {
155+
isShardable = false
156+
return stop
157+
}
158+
}
159+
return nil
160+
})
161+
if !isShardable {
146162
// Mark as not shardable.
147163
return querysharding.QueryAnalysis{}, nil
148164
}

0 commit comments

Comments
 (0)