From 68b0b8f4ba3614623d27f0f83881727c88fdf279 Mon Sep 17 00:00:00 2001 From: junotx Date: Thu, 1 Apr 2021 14:44:47 +0800 Subject: [PATCH 1/3] fix case-insensitive keyword query for alerting Signed-off-by: junotx --- pkg/api/alerting/v2alpha1/types.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pkg/api/alerting/v2alpha1/types.go b/pkg/api/alerting/v2alpha1/types.go index c04194108..e2856ceb5 100644 --- a/pkg/api/alerting/v2alpha1/types.go +++ b/pkg/api/alerting/v2alpha1/types.go @@ -192,7 +192,7 @@ func (q *AlertingRuleQueryParams) Filter(rules []*GettableAlertingRule) []*Getta } func (q *AlertingRuleQueryParams) matches(rule *GettableAlertingRule) bool { - if q.NameContainFilter != "" && !strings.Contains(rule.Name, q.NameContainFilter) { + if q.NameContainFilter != "" && !containsI(rule.Name, q.NameContainFilter) { return false } if q.State != "" && q.State != rule.State { @@ -210,7 +210,7 @@ func (q *AlertingRuleQueryParams) matches(rule *GettableAlertingRule) bool { } } for k, v := range q.LabelContainFilters { - if fv, ok := rule.Labels[k]; !ok || !strings.Contains(fv, v) { + if fv, ok := rule.Labels[k]; !ok || !containsI(fv, v) { return false } } @@ -340,7 +340,7 @@ func (q *AlertQueryParams) matches(alert *Alert) bool { } } for k, v := range q.LabelContainFilters { - if fv, ok := alert.Labels[k]; !ok || !strings.Contains(fv, v) { + if fv, ok := alert.Labels[k]; !ok || !containsI(fv, v) { return false } } @@ -526,3 +526,10 @@ func NewBulkItemErrorServerResponse(ruleName string, err error) *BulkItemRespons Error: err, } } + +// containsI reports whether substr is case-insensitive within s. +func containsI(s, substr string) bool { + return strings.Contains( + strings.ToLower(s), + strings.ToLower(substr)) +} From 66c0e0dad1475d1cc52a34af124a681f7d880ce5 Mon Sep 17 00:00:00 2001 From: junotx Date: Thu, 1 Apr 2021 16:50:13 +0800 Subject: [PATCH 2/3] fix consistent state for alerting rule Signed-off-by: junotx --- pkg/models/alerting/rules/utils.go | 37 +++++++++++------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/pkg/models/alerting/rules/utils.go b/pkg/models/alerting/rules/utils.go index c243c4ba2..c385ef387 100644 --- a/pkg/models/alerting/rules/utils.go +++ b/pkg/models/alerting/rules/utils.go @@ -216,7 +216,8 @@ func GetAlertingRuleStatus(ruleNamespace string, rule *ResourceRule, epRuleGroup return nil, nil } - var epRules = make(map[string]*alerting.AlertingRule) + var epRule *alerting.AlertingRule +out: for _, group := range epRuleGroups { fileShort := strings.TrimSuffix(filepath.Base(group.File), filepath.Ext(group.File)) if !strings.HasPrefix(fileShort, ruleNamespace+"-") { @@ -226,34 +227,24 @@ func GetAlertingRuleStatus(ruleNamespace string, rule *ResourceRule, epRuleGroup continue } - for _, epRule := range group.Rules { - if eid, err := GenEndpointRuleId(group.Name, epRule, extLabels); err != nil { + if group.Name != rule.Group { + continue + } + + for _, epr := range group.Rules { + if epr.Name != rule.Alert { // first check name to speed up the hit + continue + } + if eid, err := GenEndpointRuleId(group.Name, epr, extLabels); err != nil { return nil, errors.Wrap(err, ErrGenRuleId) } else { - if rule.Rule.Alert == epRule.Name { - epRules[eid] = epRule + if rule.Id == eid { + epRule = epr + break out } } } } - var epRule *alerting.AlertingRule - if rule.Custom { - // guarantees the stability of the get operations. - var ids []string - for k, _ := range epRules { - ids = append(ids, k) - } - if l := len(ids); l > 0 { - if l > 1 { - sort.Slice(ids, func(i, j int) bool { - return v2alpha1.AlertingRuleIdCompare(ids[i], ids[j]) - }) - } - epRule = epRules[ids[0]] - } - } else { - epRule = epRules[rule.Id] - } return getAlertingRuleStatus(&rule.ResourceRuleItem, epRule, rule.Custom, rule.Level), nil } From 935df8622a391e527f563c2bc94c50223396233d Mon Sep 17 00:00:00 2001 From: junotx Date: Fri, 2 Apr 2021 10:50:31 +0800 Subject: [PATCH 3/3] make func more readable for alerting Signed-off-by: junotx --- pkg/api/alerting/v2alpha1/types.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/api/alerting/v2alpha1/types.go b/pkg/api/alerting/v2alpha1/types.go index e2856ceb5..3b218b355 100644 --- a/pkg/api/alerting/v2alpha1/types.go +++ b/pkg/api/alerting/v2alpha1/types.go @@ -192,7 +192,7 @@ func (q *AlertingRuleQueryParams) Filter(rules []*GettableAlertingRule) []*Getta } func (q *AlertingRuleQueryParams) matches(rule *GettableAlertingRule) bool { - if q.NameContainFilter != "" && !containsI(rule.Name, q.NameContainFilter) { + if q.NameContainFilter != "" && !containsCaseInsensitive(rule.Name, q.NameContainFilter) { return false } if q.State != "" && q.State != rule.State { @@ -210,7 +210,7 @@ func (q *AlertingRuleQueryParams) matches(rule *GettableAlertingRule) bool { } } for k, v := range q.LabelContainFilters { - if fv, ok := rule.Labels[k]; !ok || !containsI(fv, v) { + if fv, ok := rule.Labels[k]; !ok || !containsCaseInsensitive(fv, v) { return false } } @@ -340,7 +340,7 @@ func (q *AlertQueryParams) matches(alert *Alert) bool { } } for k, v := range q.LabelContainFilters { - if fv, ok := alert.Labels[k]; !ok || !containsI(fv, v) { + if fv, ok := alert.Labels[k]; !ok || !containsCaseInsensitive(fv, v) { return false } } @@ -527,8 +527,8 @@ func NewBulkItemErrorServerResponse(ruleName string, err error) *BulkItemRespons } } -// containsI reports whether substr is case-insensitive within s. -func containsI(s, substr string) bool { +// containsCaseInsensitive reports whether substr is case-insensitive within s. +func containsCaseInsensitive(s, substr string) bool { return strings.Contains( strings.ToLower(s), strings.ToLower(substr))