From 380764319b036b41ac0e0b7434878c4692ab336c Mon Sep 17 00:00:00 2001 From: coanor Date: Sun, 15 Oct 2023 11:11:24 +0800 Subject: [PATCH 1/5] add filter parser debug --- cmd/filter/main.go | 35 +++++++++++++++++++++++++++++++++++ filter/ast.go | 2 +- filter/parse.go | 2 -- 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 cmd/filter/main.go diff --git a/cmd/filter/main.go b/cmd/filter/main.go new file mode 100644 index 00000000..3e759893 --- /dev/null +++ b/cmd/filter/main.go @@ -0,0 +1,35 @@ +package main + +import ( + "flag" + "log" + "os" + + "github.com/GuanceCloud/cliutils/filter" +) + +var ( + conditionFile string +) + +func init() { + flag.StringVar(&conditionFile, "condition-path", "", "condition file") +} + +func main() { + flag.Parse() + + condData, err := os.ReadFile(conditionFile) + if err != nil { + log.Printf("ReadFile: %s", err) + os.Exit(-1) + } + + where, err := filter.GetConds(string(condData)) + if err != nil { + log.Printf("GetConds: %s", err) + os.Exit(-1) + } + + log.Printf("conditions:\n%s", where.String()) +} diff --git a/filter/ast.go b/filter/ast.go index fa16fea3..bc552cda 100644 --- a/filter/ast.go +++ b/filter/ast.go @@ -906,7 +906,7 @@ func (x WhereConditions) String() string { arr = append(arr, c.String()) } - return strings.Join(arr, "; ") + return strings.Join(arr, ";\n") } func (x WhereConditions) Eval(data KVs) int { diff --git a/filter/parse.go b/filter/parse.go index e188c67d..f122a81b 100644 --- a/filter/parse.go +++ b/filter/parse.go @@ -44,8 +44,6 @@ type parser struct { } func GetConds(input string) (WhereConditions, error) { - log.Debugf("parse %s", input) - var err error p := newParser(input) defer parserPool.Put(p) From 70cbb37a1720725f5e2ee23a105293ace0265dda Mon Sep 17 00:00:00 2001 From: coanor Date: Sat, 28 Oct 2023 10:28:07 +0800 Subject: [PATCH 2/5] docs: update filter debug readme --- cmd/filter/README.md | 20 ++++++++++++++++++++ cmd/filter/build.sh | 1 + cmd/filter/filter-bad-sample.txt | 1 + cmd/filter/filter-sample.txt | 3 +++ cmd/filter/main.go | 3 ++- 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 cmd/filter/README.md create mode 100755 cmd/filter/build.sh create mode 100644 cmd/filter/filter-bad-sample.txt create mode 100644 cmd/filter/filter-sample.txt diff --git a/cmd/filter/README.md b/cmd/filter/README.md new file mode 100644 index 00000000..d69f429f --- /dev/null +++ b/cmd/filter/README.md @@ -0,0 +1,20 @@ +## Filter 调试器 + +通过 filter 调试器,可以得知具体的 filter 规则是否编写正确。 + +编译: + +```bash +$ ./build.sh +``` + +```bash +# 正确的 filter 规则示例 +$ ./fdbg -condition-path filter-sample.txt +Parse 3 conditions ok + + +# 错误的 filter 规则示例 +$ ./fdbg -condition-path filter-bad-sample.txt +2023/10/28 10:26:33 GetConds: 1:46 parse error: unterminated quoted string +``` diff --git a/cmd/filter/build.sh b/cmd/filter/build.sh new file mode 100755 index 00000000..d5ea360c --- /dev/null +++ b/cmd/filter/build.sh @@ -0,0 +1 @@ +go build -o fdbg main.go diff --git a/cmd/filter/filter-bad-sample.txt b/cmd/filter/filter-bad-sample.txt new file mode 100644 index 00000000..3d09f543 --- /dev/null +++ b/cmd/filter/filter-bad-sample.txt @@ -0,0 +1 @@ +{ `service` = prd-oa-main-service-sql-server' } diff --git a/cmd/filter/filter-sample.txt b/cmd/filter/filter-sample.txt new file mode 100644 index 00000000..c5093fed --- /dev/null +++ b/cmd/filter/filter-sample.txt @@ -0,0 +1,3 @@ +{ `source` = 'manager' and ( `llllll` in [ 'lllllll' ] )}; +{ `source` = 'worker-0' and ( `jinei` in [ 'ss' ] )}; +{ `source` = re(`.*`) and ( `host` in [ 'cn-hangzhou.172.16.211.112' ] )}; diff --git a/cmd/filter/main.go b/cmd/filter/main.go index 3e759893..edebbc86 100644 --- a/cmd/filter/main.go +++ b/cmd/filter/main.go @@ -2,6 +2,7 @@ package main import ( "flag" + "fmt" "log" "os" @@ -31,5 +32,5 @@ func main() { os.Exit(-1) } - log.Printf("conditions:\n%s", where.String()) + fmt.Printf("Parse %d conditions ok\n", len(where)) } From 770394034fea8a84a359097fe7114a4a84120449 Mon Sep 17 00:00:00 2001 From: coanor Date: Sat, 28 Oct 2023 10:32:36 +0800 Subject: [PATCH 3/5] save --- cmd/filter/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/filter/README.md b/cmd/filter/README.md index d69f429f..463da2a4 100644 --- a/cmd/filter/README.md +++ b/cmd/filter/README.md @@ -1,6 +1,8 @@ ## Filter 调试器 -通过 filter 调试器,可以得知具体的 filter 规则是否编写正确。 +在编写各种黑名单时,普通用户难以确定规则是否编写正确,这给调试具体的数据策略造成一些麻烦。 + +通过 filter 调试器,可以得知具体的 filter 规则是否编写正确,对于语法错误的规则,会提示具体的错误位置。 编译: @@ -14,7 +16,7 @@ $ ./fdbg -condition-path filter-sample.txt Parse 3 conditions ok -# 错误的 filter 规则示例 +# 错误的 filter 规则示例:有错误位置提示 $ ./fdbg -condition-path filter-bad-sample.txt 2023/10/28 10:26:33 GetConds: 1:46 parse error: unterminated quoted string ``` From 6784b04ab6a35416f318917dd335017c333c5b02 Mon Sep 17 00:00:00 2001 From: coanor Date: Sat, 28 Oct 2023 10:34:56 +0800 Subject: [PATCH 4/5] save --- cmd/filter/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/filter/README.md b/cmd/filter/README.md index 463da2a4..7c540099 100644 --- a/cmd/filter/README.md +++ b/cmd/filter/README.md @@ -1,8 +1,10 @@ ## Filter 调试器 -在编写各种黑名单时,普通用户难以确定规则是否编写正确,这给调试具体的数据策略造成一些麻烦。 +在编写各种[过滤规则](https://docs.guance.com/datakit/datakit-filter/)时, +普通用户难以确定规则是否编写正确,这给调试具体的数据策略造成一些麻烦。 -通过 filter 调试器,可以得知具体的 filter 规则是否编写正确,对于语法错误的规则,会提示具体的错误位置。 +通过 filter 调试器,可以得知具体的 filter 规则是否编写正确,对于语法错误 +的规则,会提示具体的错误位置。 编译: From 8bea1ae4ebc1fd6688fccd024d4e933d7d4c1bbf Mon Sep 17 00:00:00 2001 From: coanor Date: Sat, 28 Oct 2023 10:40:13 +0800 Subject: [PATCH 5/5] fix lint errors --- cmd/filter/main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/filter/main.go b/cmd/filter/main.go index edebbc86..9a055663 100644 --- a/cmd/filter/main.go +++ b/cmd/filter/main.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "os" + "path/filepath" "github.com/GuanceCloud/cliutils/filter" ) @@ -13,6 +14,7 @@ var ( conditionFile string ) +// nolint: gochecknoinits func init() { flag.StringVar(&conditionFile, "condition-path", "", "condition file") } @@ -20,7 +22,7 @@ func init() { func main() { flag.Parse() - condData, err := os.ReadFile(conditionFile) + condData, err := os.ReadFile(filepath.Clean(conditionFile)) if err != nil { log.Printf("ReadFile: %s", err) os.Exit(-1)