diff --git a/pkg/services/ngalert/state/cache.go b/pkg/services/ngalert/state/cache.go index 8df918e87c3..192e40bfa32 100644 --- a/pkg/services/ngalert/state/cache.go +++ b/pkg/services/ngalert/state/cache.go @@ -52,11 +52,11 @@ func (rs *ruleStates) getOrCreate(ctx context.Context, log log.Logger, alertRule ruleLabels, annotations := rs.expandRuleLabelsAndAnnotations(ctx, log, alertRule, result, extraLabels, externalURL) values := make(map[string]float64) - for _, v := range result.Values { + for refID, v := range result.Values { if v.Value != nil { - values[v.Var] = *v.Value + values[refID] = *v.Value } else { - values[v.Var] = math.NaN() + values[refID] = math.NaN() } } diff --git a/pkg/services/ngalert/state/cache_test.go b/pkg/services/ngalert/state/cache_test.go index 73691fd5a53..5f5a2de3428 100644 --- a/pkg/services/ngalert/state/cache_test.go +++ b/pkg/services/ngalert/state/cache_test.go @@ -108,6 +108,7 @@ func Test_getOrCreate(t *testing.T) { assert.Equal(t, expected, state.Labels["rule-"+key]) } }) + t.Run("rule annotations should be able to be expanded with result and extra labels", func(t *testing.T) { result := eval.Result{ Instance: models.GenerateAlertLabels(5, "result-"), @@ -134,6 +135,34 @@ func Test_getOrCreate(t *testing.T) { assert.Equal(t, expected, state.Annotations["rule-"+key]) } }) + + t.Run("expected Reduce and Math expression values", func(t *testing.T) { + result := eval.Result{ + Instance: models.GenerateAlertLabels(5, "result-"), + Values: map[string]eval.NumberValueCapture{ + "A": eval.NumberValueCapture{Var: "A", Value: util.Pointer(1.0)}, + "B": eval.NumberValueCapture{Var: "B", Value: util.Pointer(2.0)}, + }, + } + rule := generateRule() + + state := c.getOrCreate(context.Background(), l, rule, result, nil, url) + assert.Equal(t, map[string]float64{"A": 1, "B": 2}, state.Values) + }) + + t.Run("expected Classic Condition values", func(t *testing.T) { + result := eval.Result{ + Instance: models.GenerateAlertLabels(5, "result-"), + Values: map[string]eval.NumberValueCapture{ + "B0": eval.NumberValueCapture{Var: "B", Value: util.Pointer(1.0)}, + "B1": eval.NumberValueCapture{Var: "B", Value: util.Pointer(2.0)}, + }, + } + rule := generateRule() + + state := c.getOrCreate(context.Background(), l, rule, result, nil, url) + assert.Equal(t, map[string]float64{"B0": 1, "B1": 2}, state.Values) + }) } func Test_mergeLabels(t *testing.T) {