diff --git a/promql/ast.go b/promql/ast.go index dba38db3bd..b427f5ee0f 100644 --- a/promql/ast.go +++ b/promql/ast.go @@ -260,6 +260,11 @@ func Walk(v Visitor, node Node, path []Node) error { } } case *AggregateExpr: + if n.Param != nil { + if err := Walk(v, n.Param, path); err != nil { + return err + } + } if err := Walk(v, n.Expr, path); err != nil { return err } diff --git a/promql/engine.go b/promql/engine.go index 7450dcd389..c0ab02b078 100644 --- a/promql/engine.go +++ b/promql/engine.go @@ -614,7 +614,7 @@ func extractFuncFromPath(p []Node) string { return extractFuncFromPath(p[:len(p)-1]) } -func checkForSeriesSetExpansion(ctx context.Context, expr Expr) error { +func checkForSeriesSetExpansion(ctx context.Context, expr Expr) { switch e := expr.(type) { case *MatrixSelector: if e.series == nil { @@ -635,7 +635,6 @@ func checkForSeriesSetExpansion(ctx context.Context, expr Expr) error { } } } - return nil } func expandSeriesSet(ctx context.Context, it storage.SeriesSet) (res []storage.Series, err error) { @@ -966,9 +965,7 @@ func (ev *evaluator) eval(expr Expr) Value { } sel := e.Args[matrixArgIndex].(*MatrixSelector) - if err := checkForSeriesSetExpansion(ev.ctx, sel); err != nil { - ev.error(err) - } + checkForSeriesSetExpansion(ev.ctx, sel) mat := make(Matrix, 0, len(sel.series)) // Output matrix. offset := durationMilliseconds(sel.Offset) selRange := durationMilliseconds(sel.Range) @@ -1100,9 +1097,7 @@ func (ev *evaluator) eval(expr Expr) Value { }) case *VectorSelector: - if err := checkForSeriesSetExpansion(ev.ctx, e); err != nil { - ev.error(err) - } + checkForSeriesSetExpansion(ev.ctx, e) mat := make(Matrix, 0, len(e.series)) it := storage.NewBuffer(durationMilliseconds(LookbackDelta)) for i, s := range e.series { @@ -1175,9 +1170,7 @@ func durationToInt64Millis(d time.Duration) int64 { // vectorSelector evaluates a *VectorSelector expression. func (ev *evaluator) vectorSelector(node *VectorSelector, ts int64) Vector { - if err := checkForSeriesSetExpansion(ev.ctx, node); err != nil { - ev.error(err) - } + checkForSeriesSetExpansion(ev.ctx, node) var ( vec = make(Vector, 0, len(node.series)) @@ -1249,9 +1242,7 @@ func putPointSlice(p []Point) { // matrixSelector evaluates a *MatrixSelector expression. func (ev *evaluator) matrixSelector(node *MatrixSelector) Matrix { - if err := checkForSeriesSetExpansion(ev.ctx, node); err != nil { - ev.error(err) - } + checkForSeriesSetExpansion(ev.ctx, node) var ( offset = durationMilliseconds(node.Offset) diff --git a/promql/testdata/aggregators.test b/promql/testdata/aggregators.test index 8f6e047120..0da8057612 100644 --- a/promql/testdata/aggregators.test +++ b/promql/testdata/aggregators.test @@ -153,6 +153,7 @@ load 5m http_requests{job="app-server", instance="1", group="production"} 0+60x10 http_requests{job="app-server", instance="0", group="canary"} 0+70x10 http_requests{job="app-server", instance="1", group="canary"} 0+80x10 + foo 3+0x10 eval_ordered instant at 50m topk(3, http_requests) http_requests{group="canary", instance="1", job="app-server"} 800 @@ -207,6 +208,12 @@ eval_ordered instant at 50m topk(9999999999, http_requests{job="api-server",grou http_requests{job="api-server", instance="0", group="production"} 100 http_requests{job="api-server", instance="2", group="production"} NaN +# Bug #5276. +eval_ordered instant at 50m topk(scalar(foo), http_requests) + http_requests{group="canary", instance="1", job="app-server"} 800 + http_requests{group="canary", instance="0", job="app-server"} 700 + http_requests{group="production", instance="1", job="app-server"} 600 + clear # Tests for count_values. @@ -257,8 +264,15 @@ load 10s data{test="uneven samples",point="a"} 0 data{test="uneven samples",point="b"} 1 data{test="uneven samples",point="c"} 4 + foo .8 eval instant at 1m quantile without(point)(0.8, data) {test="two samples"} 0.8 {test="three samples"} 1.6 {test="uneven samples"} 2.8 + +# Bug #5276. +eval instant at 1m quantile without(point)(scalar(foo), data) + {test="two samples"} 0.8 + {test="three samples"} 1.6 + {test="uneven samples"} 2.8