From cd12190c91e542a7fbe4429027faeb2c5b52b056 Mon Sep 17 00:00:00 2001 From: Cruvie Kang Date: Mon, 11 Sep 2023 00:45:41 +0800 Subject: [PATCH] Add CheckRulesFiles method to replace rulefmt.ParseFile in prometheus Signed-off-by: Cruvie <> --- pkg/rules/rules.go | 26 +++++++++++++++++++++++++- pkg/rules/rules_test.go | 21 +++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/pkg/rules/rules.go b/pkg/rules/rules.go index 5fd3dc01e81..ac02c656795 100644 --- a/pkg/rules/rules.go +++ b/pkg/rules/rules.go @@ -5,6 +5,7 @@ package rules import ( "context" + "os" "sort" "sync" "text/template" @@ -14,7 +15,7 @@ import ( "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/promql/parser" "github.com/prometheus/prometheus/storage" - + "github.com/thanos-io/thanos/pkg/errutil" "github.com/thanos-io/thanos/pkg/rules/rulespb" "github.com/thanos-io/thanos/pkg/tracing" ) @@ -248,3 +249,26 @@ func (srv *rulesServer) Send(res *rulespb.RulesResponse) error { func (srv *rulesServer) Context() context.Context { return srv.ctx } + +func CheckRulesFiles(filePaths []string) error { + var failed errutil.MultiError + + for _, path := range filePaths { + f, er := os.Open(path) + if er != nil { + failed.Add(er) + continue + } + defer func() { _ = f.Close() }() + + _, errs := ValidateAndCount(f) + if errs.Err() != nil { + for _, e := range errs { + failed.Add(e) + } + continue + } + } + + return failed.Err() +} diff --git a/pkg/rules/rules_test.go b/pkg/rules/rules_test.go index 721da26c10c..a6581d545a9 100644 --- a/pkg/rules/rules_test.go +++ b/pkg/rules/rules_test.go @@ -1390,3 +1390,24 @@ func TestFilterRules(t *testing.T) { }) } } + +func TestCheckRulesFiles(t *testing.T) { + + validFiles := []string{ + "../../cmd/thanos/testdata/rules-files/valid.yaml", + } + + invalidFiles := [][]string{ + {"../../cmd/thanos/testdata/rules-files/non-existing-file.yaml"}, + {"../../cmd/thanos/testdata/rules-files/invalid-yaml-format.yaml"}, + {"../../cmd/thanos/testdata/rules-files/invalid-rules-data.yaml"}, + {"../../cmd/thanos/testdata/rules-files/invalid-unknown-field.yaml"}, + } + + testutil.Ok(t, CheckRulesFiles(validFiles)) + + for _, fn := range invalidFiles { + testutil.NotOk(t, CheckRulesFiles(fn), "expected err for file %s", fn) + } + +}