From 80bbd0477897e5926ce0441b82a1672f09c0b5ad Mon Sep 17 00:00:00 2001 From: Tom Wilkie <tom.wilkie@gmail.com> Date: Fri, 19 Apr 2019 15:50:13 +0800 Subject: [PATCH] Add an extra filter step if the user specifies a regex using old API. Signed-off-by: Tom Wilkie <tom.wilkie@gmail.com> --- pkg/ingester/instance.go | 4 ++++ pkg/logql/ast.go | 9 +++++++++ pkg/logql/expr.go | 8 ++++---- pkg/logql/expr.y | 8 ++++---- pkg/querier/store.go | 4 ++++ 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/pkg/ingester/instance.go b/pkg/ingester/instance.go index 7862bad4..cd2e2b34 100644 --- a/pkg/ingester/instance.go +++ b/pkg/ingester/instance.go @@ -103,6 +103,10 @@ func (i *instance) Query(req *logproto.QueryRequest, queryServer logproto.Querie return err } + if req.Regex != "" { + expr = logql.NewFilterExpr(expr, labels.MatchRegexp, req.Regex) + } + querier := logql.QuerierFunc(func(matchers []*labels.Matcher) (iter.EntryIterator, error) { iters, err := i.lookupStreams(req, matchers) if err != nil { diff --git a/pkg/logql/ast.go b/pkg/logql/ast.go index 256a42e3..95341a0f 100644 --- a/pkg/logql/ast.go +++ b/pkg/logql/ast.go @@ -42,6 +42,15 @@ type filterExpr struct { match string } +// NewFilterExpr wraps an existing Expr with a next filter expression. +func NewFilterExpr(left Expr, ty labels.MatchType, match string) Expr { + return &filterExpr{ + left: left, + ty: ty, + match: match, + } +} + func (e *filterExpr) Eval(q Querier) (iter.EntryIterator, error) { var f func(string) bool switch e.ty { diff --git a/pkg/logql/expr.go b/pkg/logql/expr.go index 358edb33..70c2cd7a 100644 --- a/pkg/logql/expr.go +++ b/pkg/logql/expr.go @@ -478,25 +478,25 @@ exprdefault: exprDollar = exprS[exprpt-3 : exprpt+1] //line pkg/logql/expr.y:32 { - exprVAL.Expr = &filterExpr{exprDollar[1].Expr, labels.MatchRegexp, exprDollar[3].str} + exprVAL.Expr = NewFilterExpr(exprDollar[1].Expr, labels.MatchRegexp, exprDollar[3].str) } case 4: exprDollar = exprS[exprpt-3 : exprpt+1] //line pkg/logql/expr.y:33 { - exprVAL.Expr = &filterExpr{exprDollar[1].Expr, labels.MatchEqual, exprDollar[3].str} + exprVAL.Expr = NewFilterExpr(exprDollar[1].Expr, labels.MatchEqual, exprDollar[3].str) } case 5: exprDollar = exprS[exprpt-3 : exprpt+1] //line pkg/logql/expr.y:34 { - exprVAL.Expr = &filterExpr{exprDollar[1].Expr, labels.MatchNotRegexp, exprDollar[3].str} + exprVAL.Expr = NewFilterExpr(exprDollar[1].Expr, labels.MatchNotRegexp, exprDollar[3].str) } case 6: exprDollar = exprS[exprpt-3 : exprpt+1] //line pkg/logql/expr.y:35 { - exprVAL.Expr = &filterExpr{exprDollar[1].Expr, labels.MatchNotEqual, exprDollar[3].str} + exprVAL.Expr = NewFilterExpr(exprDollar[1].Expr, labels.MatchNotEqual, exprDollar[3].str) } case 7: exprDollar = exprS[exprpt-2 : exprpt+1] diff --git a/pkg/logql/expr.y b/pkg/logql/expr.y index 4ab96e39..0a958816 100644 --- a/pkg/logql/expr.y +++ b/pkg/logql/expr.y @@ -29,10 +29,10 @@ root: expr { exprlex.(*lexer).expr = $1 }; expr: OPEN_BRACE matchers CLOSE_BRACE { $$ = &matchersExpr{ matchers: $2 } } - | expr PIPE_MATCH STRING { $$ = &filterExpr{ $1, labels.MatchRegexp, $3 } } - | expr PIPE_EXACT STRING { $$ = &filterExpr{ $1, labels.MatchEqual, $3 } } - | expr NRE STRING { $$ = &filterExpr{ $1, labels.MatchNotRegexp, $3 } } - | expr NEQ STRING { $$ = &filterExpr{ $1, labels.MatchNotEqual, $3 } } + | expr PIPE_MATCH STRING { $$ = NewFilterExpr( $1, labels.MatchRegexp, $3 ) } + | expr PIPE_EXACT STRING { $$ = NewFilterExpr( $1, labels.MatchEqual, $3 ) } + | expr NRE STRING { $$ = NewFilterExpr( $1, labels.MatchNotRegexp, $3 ) } + | expr NEQ STRING { $$ = NewFilterExpr( $1, labels.MatchNotEqual, $3 ) } | expr PIPE_MATCH { exprlex.(*lexer).Error("unexpected end of query, expected string") } | expr STRING { exprlex.(*lexer).Error("unexpected string, expected pipe") } ; diff --git a/pkg/querier/store.go b/pkg/querier/store.go index 3e8ca7f0..01500d72 100644 --- a/pkg/querier/store.go +++ b/pkg/querier/store.go @@ -21,6 +21,10 @@ func (q Querier) queryStore(ctx context.Context, req *logproto.QueryRequest) (it return nil, err } + if req.Regex != "" { + expr = logql.NewFilterExpr(expr, labels.MatchRegexp, req.Regex) + } + querier := logql.QuerierFunc(func(matchers []*labels.Matcher) (iter.EntryIterator, error) { nameLabelMatcher, err := labels.NewMatcher(labels.MatchEqual, labels.MetricName, "logs") if err != nil { -- GitLab