From 48dae4417cca75a40d6a3bf16b0d976714e8db81 Mon Sep 17 00:00:00 2001 From: Cyril Tovena Date: Thu, 11 Apr 2024 14:45:25 +0200 Subject: [PATCH] feat: improve syntax parser for pattern (#12489) --- pkg/logql/log/pattern/parser.go | 24 ++++++++++++++++++++++-- pkg/logql/log/pattern/parser_test.go | 11 +++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/pkg/logql/log/pattern/parser.go b/pkg/logql/log/pattern/parser.go index b2a868f7af76..79ddf44e2a98 100644 --- a/pkg/logql/log/pattern/parser.go +++ b/pkg/logql/log/pattern/parser.go @@ -1,6 +1,9 @@ package pattern -import "fmt" +import ( + "fmt" + "sync" +) const underscore = "_" @@ -10,6 +13,19 @@ var tokens = map[int]string{ UNDERSCORE: underscore, } +type parser struct { + p *exprParserImpl +} + +var parserPool = sync.Pool{ + New: func() interface{} { + p := &parser{ + p: &exprParserImpl{}, + } + return p + }, +} + func init() { // Improve the error messages coming out of yacc. exprErrorVerbose = true @@ -23,9 +39,13 @@ func parseExpr(input string) (expr, error) { } func parseExprBytes(input []byte) (expr, error) { + p := parserPool.Get().(*parser) + defer parserPool.Put(p) + l := newLexer() l.setData(input) - e := exprNewParser().Parse(l) + + e := p.p.Parse(l) if e != 0 || len(l.errs) > 0 { return nil, l.errs[0] } diff --git a/pkg/logql/log/pattern/parser_test.go b/pkg/logql/log/pattern/parser_test.go index b46f8a2027ea..8a40d983c0a3 100644 --- a/pkg/logql/log/pattern/parser_test.go +++ b/pkg/logql/log/pattern/parser_test.go @@ -57,3 +57,14 @@ func Test_Parse(t *testing.T) { require.Equal(t, tc.expected, actual) } } + +var result expr + +func BenchmarkParseExpr(b *testing.B) { + var err error + b.ReportAllocs() + for i := 0; i < b.N; i++ { + result, err = parseExpr(`level=info <_> caller=main.go:107 msg="Starting Grafana Enterprise Traces" version="version=weekly-r138-f1920489, branch=weekly-r138, revision=f1920489"`) + } + require.NoError(b, err) +}