diff --git a/pkg/services/alerting/eval_handler.go b/pkg/services/alerting/eval_handler.go index ed77877e34d..fd6d2687a33 100644 --- a/pkg/services/alerting/eval_handler.go +++ b/pkg/services/alerting/eval_handler.go @@ -52,12 +52,15 @@ func (e *DefaultEvalHandler) Eval(context *EvalContext) { // calculating Firing based on operator if cr.Operator == "or" { firing = firing || cr.Firing - noDataFound = noDataFound || cr.NoDataFound } else { firing = firing && cr.Firing - noDataFound = noDataFound && cr.NoDataFound } + // We cannot evaluate the expression when one or more conditions are missing data + // and so noDataFound should be true if at least one condition returns no data, + // irrespective of the operator. + noDataFound = noDataFound || cr.NoDataFound + if i > 0 { conditionEvals = "[" + conditionEvals + " " + strings.ToUpper(cr.Operator) + " " + strconv.FormatBool(cr.Firing) + "]" } else { diff --git a/pkg/services/alerting/eval_handler_test.go b/pkg/services/alerting/eval_handler_test.go index 07e36ed0497..18b98e43ff0 100644 --- a/pkg/services/alerting/eval_handler_test.go +++ b/pkg/services/alerting/eval_handler_test.go @@ -181,7 +181,7 @@ func TestAlertingEvaluationHandler(t *testing.T) { require.True(t, context.NoDataFound) }) - t.Run("Should not return no data if at least one condition has no data and using AND", func(t *testing.T) { + t.Run("Should return no data if at least one condition has no data and using AND", func(t *testing.T) { context := NewEvalContext(context.TODO(), &Rule{ Conditions: []Condition{ &conditionStub{operator: "and", noData: true}, @@ -190,7 +190,7 @@ func TestAlertingEvaluationHandler(t *testing.T) { }, &validations.OSSPluginRequestValidator{}) handler.Eval(context) - require.False(t, context.NoDataFound) + require.True(t, context.NoDataFound) }) t.Run("Should return no data if at least one condition has no data and using OR", func(t *testing.T) {