diff --git a/pkg/services/ngalert/api/api_prometheus.go b/pkg/services/ngalert/api/api_prometheus.go index 36d8dc1d5b3..e8344434860 100644 --- a/pkg/services/ngalert/api/api_prometheus.go +++ b/pkg/services/ngalert/api/api_prometheus.go @@ -9,9 +9,9 @@ import ( "strings" "time" - "github.com/grafana/grafana/pkg/services/ngalert/eval" apiv1 "github.com/prometheus/client_golang/api/prometheus/v1" + "github.com/grafana/grafana/pkg/services/ngalert/eval" ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/store" @@ -40,8 +40,8 @@ func (srv PrometheusSrv) RouteGetAlertStatuses(c *models.ReqContext) response.Re for _, alertState := range srv.manager.GetAll(c.OrgId) { startsAt := alertState.StartsAt valString := "" - if len(alertState.Results) > 0 && alertState.State == eval.Alerting { - valString = alertState.Results[0].EvaluationString + if alertState.State == eval.Alerting { + valString = alertState.LastEvaluationString } alertResponse.Data.Alerts = append(alertResponse.Data.Alerts, &apimodels.Alert{ Labels: map[string]string(alertState.Labels), @@ -173,8 +173,8 @@ func (srv PrometheusSrv) RouteGetRuleStatuses(c *models.ReqContext) response.Res for _, alertState := range srv.manager.GetStatesForRuleUID(c.OrgId, rule.UID) { activeAt := alertState.StartsAt valString := "" - if len(alertState.Results) > 0 && alertState.State == eval.Alerting { - valString = alertState.Results[0].EvaluationString + if alertState.State == eval.Alerting { + valString = alertState.LastEvaluationString } alert := &apimodels.Alert{ Labels: map[string]string(alertState.Labels), diff --git a/pkg/services/ngalert/schedule/compat.go b/pkg/services/ngalert/schedule/compat.go index 17dc9057f6a..fda9b1da948 100644 --- a/pkg/services/ngalert/schedule/compat.go +++ b/pkg/services/ngalert/schedule/compat.go @@ -35,8 +35,8 @@ func stateToPostableAlert(alertState *state.State, appURL *url.URL) *models.Post nL := alertState.Labels.Copy() nA := data.Labels(alertState.Annotations).Copy() - if len(alertState.Results) > 0 { - nA["__value_string__"] = alertState.Results[0].EvaluationString + if alertState.LastEvaluationString != "" { + nA["__value_string__"] = alertState.LastEvaluationString } var urlStr string diff --git a/pkg/services/ngalert/schedule/compat_test.go b/pkg/services/ngalert/schedule/compat_test.go index 704fbaff730..6c67cc04b23 100644 --- a/pkg/services/ngalert/schedule/compat_test.go +++ b/pkg/services/ngalert/schedule/compat_test.go @@ -100,11 +100,7 @@ func Test_stateToPostableAlert(t *testing.T) { alertState := randomState(tc.state) alertState.Annotations = randomMapOfStrings() expectedValueString := util.GenerateShortUID() - alertState.Results = []state.Evaluation{ - { - EvaluationString: expectedValueString, - }, - } + alertState.LastEvaluationString = expectedValueString result := stateToPostableAlert(alertState, appURL) diff --git a/pkg/services/ngalert/state/manager.go b/pkg/services/ngalert/state/manager.go index 5a3d2e03cb3..a1db3b23ef2 100644 --- a/pkg/services/ngalert/state/manager.go +++ b/pkg/services/ngalert/state/manager.go @@ -96,16 +96,16 @@ func (st *Manager) Warm() { st.log.Error("error getting cacheId for entry", "msg", err.Error()) } stateForEntry := &State{ - AlertRuleUID: entry.RuleUID, - OrgID: entry.RuleOrgID, - CacheId: cacheId, - Labels: lbs, - State: translateInstanceState(entry.CurrentState), - Results: []Evaluation{}, - StartsAt: entry.CurrentStateSince, - EndsAt: entry.CurrentStateEnd, - LastEvaluationTime: entry.LastEvalTime, - Annotations: ruleForEntry.Annotations, + AlertRuleUID: entry.RuleUID, + OrgID: entry.RuleOrgID, + CacheId: cacheId, + Labels: lbs, + State: translateInstanceState(entry.CurrentState), + LastEvaluationString: "", + StartsAt: entry.CurrentStateSince, + EndsAt: entry.CurrentStateEnd, + LastEvaluationTime: entry.LastEvalTime, + Annotations: ruleForEntry.Annotations, } states = append(states, stateForEntry) } @@ -158,11 +158,11 @@ func (st *Manager) setNextState(ctx context.Context, alertRule *ngModels.AlertRu currentState.LastEvaluationTime = result.EvaluatedAt currentState.EvaluationDuration = result.EvaluationDuration currentState.Results = append(currentState.Results, Evaluation{ - EvaluationTime: result.EvaluatedAt, - EvaluationState: result.State, - EvaluationString: result.EvaluationString, - Values: NewEvaluationValues(result.Values), + EvaluationTime: result.EvaluatedAt, + EvaluationState: result.State, + Values: NewEvaluationValues(result.Values), }) + currentState.LastEvaluationString = result.EvaluationString currentState.TrimResults(alertRule) oldState := currentState.State diff --git a/pkg/services/ngalert/state/manager_test.go b/pkg/services/ngalert/state/manager_test.go index 9149bc31bb6..21ec276a9d8 100644 --- a/pkg/services/ngalert/state/manager_test.go +++ b/pkg/services/ngalert/state/manager_test.go @@ -437,16 +437,6 @@ func TestProcessEvalResults(t *testing.T) { }, State: eval.Pending, Results: []state.Evaluation{ - { - EvaluationTime: evaluationTime.Add(10 * time.Second), - EvaluationState: eval.Alerting, - Values: make(map[string]*float64), - }, - { - EvaluationTime: evaluationTime.Add(20 * time.Second), - EvaluationState: eval.NoData, - Values: make(map[string]*float64), - }, { EvaluationTime: evaluationTime.Add(30 * time.Second), EvaluationState: eval.Alerting, @@ -528,16 +518,6 @@ func TestProcessEvalResults(t *testing.T) { }, State: eval.NoData, Results: []state.Evaluation{ - { - EvaluationTime: evaluationTime, - EvaluationState: eval.Alerting, - Values: make(map[string]*float64), - }, - { - EvaluationTime: evaluationTime.Add(10 * time.Second), - EvaluationState: eval.Alerting, - Values: make(map[string]*float64), - }, { EvaluationTime: evaluationTime.Add(20 * time.Second), EvaluationState: eval.Alerting, @@ -1336,11 +1316,6 @@ func TestProcessEvalResults(t *testing.T) { }, State: eval.Alerting, Results: []state.Evaluation{ - { - EvaluationTime: evaluationTime, - EvaluationState: eval.Normal, - Values: make(map[string]*float64), - }, { EvaluationTime: evaluationTime.Add(30 * time.Second), EvaluationState: eval.Alerting, @@ -1428,11 +1403,6 @@ func TestProcessEvalResults(t *testing.T) { }, State: eval.NoData, Results: []state.Evaluation{ - { - EvaluationTime: evaluationTime, - EvaluationState: eval.Normal, - Values: make(map[string]*float64), - }, { EvaluationTime: evaluationTime.Add(30 * time.Second), EvaluationState: eval.Alerting, diff --git a/pkg/services/ngalert/state/state.go b/pkg/services/ngalert/state/state.go index 02f1f41440c..2947f789761 100644 --- a/pkg/services/ngalert/state/state.go +++ b/pkg/services/ngalert/state/state.go @@ -12,26 +12,26 @@ import ( ) type State struct { - AlertRuleUID string - OrgID int64 - CacheId string - State eval.State - Resolved bool - Results []Evaluation - StartsAt time.Time - EndsAt time.Time - LastEvaluationTime time.Time - EvaluationDuration time.Duration - LastSentAt time.Time - Annotations map[string]string - Labels data.Labels - Error error + AlertRuleUID string + OrgID int64 + CacheId string + State eval.State + Resolved bool + Results []Evaluation + LastEvaluationString string + StartsAt time.Time + EndsAt time.Time + LastEvaluationTime time.Time + EvaluationDuration time.Duration + LastSentAt time.Time + Annotations map[string]string + Labels data.Labels + Error error } type Evaluation struct { - EvaluationTime time.Time - EvaluationState eval.State - EvaluationString string + EvaluationTime time.Time + EvaluationState eval.State // Values contains the RefID and value of reduce and math expressions. // It does not contain values for classic conditions as the values // in classic conditions do not have a RefID. @@ -152,7 +152,7 @@ func (a *State) Equals(b *State) bool { } func (a *State) TrimResults(alertRule *ngModels.AlertRule) { - numBuckets := 2 * (int64(alertRule.For.Seconds()) / alertRule.IntervalSeconds) + numBuckets := int64(alertRule.For.Seconds()) / alertRule.IntervalSeconds if numBuckets == 0 { numBuckets = 10 // keep at least 10 evaluations in the event For is set to 0 }