diff --git a/pkg/query-service/rules/api_params.go b/pkg/query-service/rules/api_params.go index 77a1552946..b3c174b147 100644 --- a/pkg/query-service/rules/api_params.go +++ b/pkg/query-service/rules/api_params.go @@ -170,18 +170,62 @@ func isValidLabelValue(v string) bool { return utf8.ValidString(v) } +func isAllQueriesDisabled(compositeQuery *v3.CompositeQuery) bool { + if compositeQuery == nil { + return false + } + if compositeQuery.BuilderQueries == nil && compositeQuery.PromQueries == nil && compositeQuery.ClickHouseQueries == nil { + return false + } + switch compositeQuery.QueryType { + case v3.QueryTypeBuilder: + if len(compositeQuery.BuilderQueries) == 0 { + return false + } + for _, query := range compositeQuery.BuilderQueries { + if !query.Disabled { + return false + } + } + case v3.QueryTypePromQL: + if len(compositeQuery.PromQueries) == 0 { + return false + } + for _, query := range compositeQuery.PromQueries { + if !query.Disabled { + return false + } + } + case v3.QueryTypeClickHouseSQL: + if len(compositeQuery.ClickHouseQueries) == 0 { + return false + } + for _, query := range compositeQuery.ClickHouseQueries { + if !query.Disabled { + return false + } + } + } + return true +} + func (r *PostableRule) Validate() error { var errs []error if r.RuleCondition == nil { - errs = append(errs, errors.Errorf("rule condition is required")) + // will get panic if we try to access CompositeQuery, so return here + return errors.Errorf("rule condition is required") } else { if r.RuleCondition.CompositeQuery == nil { errs = append(errs, errors.Errorf("composite metric query is required")) } } + if isAllQueriesDisabled(r.RuleCondition.CompositeQuery) { + errs = append(errs, errors.Errorf("all queries are disabled in rule condition")) + } + if r.RuleType == RuleTypeThreshold { if r.RuleCondition.Target == nil { errs = append(errs, errors.Errorf("rule condition missing the threshold")) diff --git a/pkg/query-service/rules/api_params_test.go b/pkg/query-service/rules/api_params_test.go new file mode 100644 index 0000000000..6a1245d0fe --- /dev/null +++ b/pkg/query-service/rules/api_params_test.go @@ -0,0 +1,86 @@ +package rules + +import ( + "testing" + + v3 "go.signoz.io/signoz/pkg/query-service/model/v3" +) + +func TestIsAllQueriesDisabled(t *testing.T) { + testCases := []*v3.CompositeQuery{ + &v3.CompositeQuery{ + BuilderQueries: map[string]*v3.BuilderQuery{ + "query1": { + Disabled: true, + }, + "query2": { + Disabled: true, + }, + }, + QueryType: v3.QueryTypeBuilder, + }, + nil, + &v3.CompositeQuery{ + QueryType: v3.QueryTypeBuilder, + }, + &v3.CompositeQuery{ + QueryType: v3.QueryTypeBuilder, + BuilderQueries: map[string]*v3.BuilderQuery{ + "query1": { + Disabled: true, + }, + "query2": { + Disabled: false, + }, + }, + }, + &v3.CompositeQuery{ + QueryType: v3.QueryTypePromQL, + }, + &v3.CompositeQuery{ + QueryType: v3.QueryTypePromQL, + PromQueries: map[string]*v3.PromQuery{ + "query3": { + Disabled: false, + }, + }, + }, + &v3.CompositeQuery{ + QueryType: v3.QueryTypePromQL, + PromQueries: map[string]*v3.PromQuery{ + "query3": { + Disabled: true, + }, + }, + }, + &v3.CompositeQuery{ + QueryType: v3.QueryTypeClickHouseSQL, + }, + &v3.CompositeQuery{ + QueryType: v3.QueryTypeClickHouseSQL, + ClickHouseQueries: map[string]*v3.ClickHouseQuery{ + "query4": { + Disabled: false, + }, + }, + }, + &v3.CompositeQuery{ + QueryType: v3.QueryTypeClickHouseSQL, + ClickHouseQueries: map[string]*v3.ClickHouseQuery{ + "query4": { + Disabled: true, + }, + }, + }, + } + + expectedResult := []bool{true, false, false, false, false, false, true, false, false, true} + + for index, compositeQuery := range testCases { + expected := expectedResult[index] + actual := isAllQueriesDisabled(compositeQuery) + if actual != expected { + t.Errorf("Expected %v, but got %v", expected, actual) + } + } +}