فهرست منبع

Implemented operator based firiing in backend

utkarshcmu 9 سال پیش
والد
کامیت
dfb1b1918c
3فایلهای تغییر یافته به همراه13 افزوده شده و 5 حذف شده
  1. 7 1
      pkg/services/alerting/conditions/query.go
  2. 5 4
      pkg/services/alerting/eval_handler.go
  3. 1 0
      pkg/services/alerting/interfaces.go

+ 7 - 1
pkg/services/alerting/conditions/query.go

@@ -23,6 +23,7 @@ type QueryCondition struct {
 	Query         AlertQuery
 	Reducer       QueryReducer
 	Evaluator     AlertEvaluator
+	Operator      string
 	HandleRequest tsdb.HandleRequestFunc
 }
 
@@ -72,6 +73,7 @@ func (c *QueryCondition) Eval(context *alerting.EvalContext) (*alerting.Conditio
 	return &alerting.ConditionResult{
 		Firing:      evalMatchCount > 0,
 		NoDataFound: emptySerieCount == len(seriesList),
+		Operator:    c.Operator,
 		EvalMatches: matches,
 	}, nil
 }
@@ -168,8 +170,12 @@ func NewQueryCondition(model *simplejson.Json, index int) (*QueryCondition, erro
 	if err != nil {
 		return nil, err
 	}
-
 	condition.Evaluator = evaluator
+
+	operatorJson := model.Get("operator")
+	operator := operatorJson.Get("type").MustString()
+	condition.Operator = operator
+
 	return &condition, nil
 }
 

+ 5 - 4
pkg/services/alerting/eval_handler.go

@@ -32,10 +32,11 @@ func (e *DefaultEvalHandler) Eval(context *EvalContext) {
 			break
 		}
 
-		// break if result has not triggered yet
-		if cr.Firing == false {
-			firing = false
-			break
+		// calculating Firing based on operator
+		if cr.Operator == "or" {
+			firing = firing || cr.Firing
+		} else {
+			firing = firing && cr.Firing
 		}
 
 		context.EvalMatches = append(context.EvalMatches, cr.EvalMatches...)

+ 1 - 0
pkg/services/alerting/interfaces.go

@@ -24,6 +24,7 @@ type Notifier interface {
 type ConditionResult struct {
 	Firing      bool
 	NoDataFound bool
+	Operator    string
 	EvalMatches []*EvalMatch
 }