diff --git a/cmd/filter/README.md b/cmd/filter/README.md new file mode 100644 index 00000000..7c540099 --- /dev/null +++ b/cmd/filter/README.md @@ -0,0 +1,24 @@ +## Filter 调试器 + +在编写各种[过滤规则](https://docs.guance.com/datakit/datakit-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 new file mode 100644 index 00000000..9a055663 --- /dev/null +++ b/cmd/filter/main.go @@ -0,0 +1,38 @@ +package main + +import ( + "flag" + "fmt" + "log" + "os" + "path/filepath" + + "github.com/GuanceCloud/cliutils/filter" +) + +var ( + conditionFile string +) + +// nolint: gochecknoinits +func init() { + flag.StringVar(&conditionFile, "condition-path", "", "condition file") +} + +func main() { + flag.Parse() + + condData, err := os.ReadFile(filepath.Clean(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) + } + + fmt.Printf("Parse %d conditions ok\n", len(where)) +} 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)