Do not store EvaluationString in Evaluation. (#44606)

* do not store evaluation string in Evaluation.
* reduce number of buckets to store for a single state
This commit is contained in:
Yuriy Tseretyan 2022-02-02 13:18:20 -05:00 committed by GitHub
parent 0092d10764
commit 984c95de63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 40 additions and 74 deletions

View File

@ -9,9 +9,9 @@ import (
"strings" "strings"
"time" "time"
"github.com/grafana/grafana/pkg/services/ngalert/eval"
apiv1 "github.com/prometheus/client_golang/api/prometheus/v1" 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" ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models"
"github.com/grafana/grafana/pkg/services/ngalert/store" "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) { for _, alertState := range srv.manager.GetAll(c.OrgId) {
startsAt := alertState.StartsAt startsAt := alertState.StartsAt
valString := "" valString := ""
if len(alertState.Results) > 0 && alertState.State == eval.Alerting { if alertState.State == eval.Alerting {
valString = alertState.Results[0].EvaluationString valString = alertState.LastEvaluationString
} }
alertResponse.Data.Alerts = append(alertResponse.Data.Alerts, &apimodels.Alert{ alertResponse.Data.Alerts = append(alertResponse.Data.Alerts, &apimodels.Alert{
Labels: map[string]string(alertState.Labels), 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) { for _, alertState := range srv.manager.GetStatesForRuleUID(c.OrgId, rule.UID) {
activeAt := alertState.StartsAt activeAt := alertState.StartsAt
valString := "" valString := ""
if len(alertState.Results) > 0 && alertState.State == eval.Alerting { if alertState.State == eval.Alerting {
valString = alertState.Results[0].EvaluationString valString = alertState.LastEvaluationString
} }
alert := &apimodels.Alert{ alert := &apimodels.Alert{
Labels: map[string]string(alertState.Labels), Labels: map[string]string(alertState.Labels),

View File

@ -35,8 +35,8 @@ func stateToPostableAlert(alertState *state.State, appURL *url.URL) *models.Post
nL := alertState.Labels.Copy() nL := alertState.Labels.Copy()
nA := data.Labels(alertState.Annotations).Copy() nA := data.Labels(alertState.Annotations).Copy()
if len(alertState.Results) > 0 { if alertState.LastEvaluationString != "" {
nA["__value_string__"] = alertState.Results[0].EvaluationString nA["__value_string__"] = alertState.LastEvaluationString
} }
var urlStr string var urlStr string

View File

@ -100,11 +100,7 @@ func Test_stateToPostableAlert(t *testing.T) {
alertState := randomState(tc.state) alertState := randomState(tc.state)
alertState.Annotations = randomMapOfStrings() alertState.Annotations = randomMapOfStrings()
expectedValueString := util.GenerateShortUID() expectedValueString := util.GenerateShortUID()
alertState.Results = []state.Evaluation{ alertState.LastEvaluationString = expectedValueString
{
EvaluationString: expectedValueString,
},
}
result := stateToPostableAlert(alertState, appURL) result := stateToPostableAlert(alertState, appURL)

View File

@ -96,16 +96,16 @@ func (st *Manager) Warm() {
st.log.Error("error getting cacheId for entry", "msg", err.Error()) st.log.Error("error getting cacheId for entry", "msg", err.Error())
} }
stateForEntry := &State{ stateForEntry := &State{
AlertRuleUID: entry.RuleUID, AlertRuleUID: entry.RuleUID,
OrgID: entry.RuleOrgID, OrgID: entry.RuleOrgID,
CacheId: cacheId, CacheId: cacheId,
Labels: lbs, Labels: lbs,
State: translateInstanceState(entry.CurrentState), State: translateInstanceState(entry.CurrentState),
Results: []Evaluation{}, LastEvaluationString: "",
StartsAt: entry.CurrentStateSince, StartsAt: entry.CurrentStateSince,
EndsAt: entry.CurrentStateEnd, EndsAt: entry.CurrentStateEnd,
LastEvaluationTime: entry.LastEvalTime, LastEvaluationTime: entry.LastEvalTime,
Annotations: ruleForEntry.Annotations, Annotations: ruleForEntry.Annotations,
} }
states = append(states, stateForEntry) states = append(states, stateForEntry)
} }
@ -158,11 +158,11 @@ func (st *Manager) setNextState(ctx context.Context, alertRule *ngModels.AlertRu
currentState.LastEvaluationTime = result.EvaluatedAt currentState.LastEvaluationTime = result.EvaluatedAt
currentState.EvaluationDuration = result.EvaluationDuration currentState.EvaluationDuration = result.EvaluationDuration
currentState.Results = append(currentState.Results, Evaluation{ currentState.Results = append(currentState.Results, Evaluation{
EvaluationTime: result.EvaluatedAt, EvaluationTime: result.EvaluatedAt,
EvaluationState: result.State, EvaluationState: result.State,
EvaluationString: result.EvaluationString, Values: NewEvaluationValues(result.Values),
Values: NewEvaluationValues(result.Values),
}) })
currentState.LastEvaluationString = result.EvaluationString
currentState.TrimResults(alertRule) currentState.TrimResults(alertRule)
oldState := currentState.State oldState := currentState.State

View File

@ -437,16 +437,6 @@ func TestProcessEvalResults(t *testing.T) {
}, },
State: eval.Pending, State: eval.Pending,
Results: []state.Evaluation{ 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), EvaluationTime: evaluationTime.Add(30 * time.Second),
EvaluationState: eval.Alerting, EvaluationState: eval.Alerting,
@ -528,16 +518,6 @@ func TestProcessEvalResults(t *testing.T) {
}, },
State: eval.NoData, State: eval.NoData,
Results: []state.Evaluation{ 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), EvaluationTime: evaluationTime.Add(20 * time.Second),
EvaluationState: eval.Alerting, EvaluationState: eval.Alerting,
@ -1336,11 +1316,6 @@ func TestProcessEvalResults(t *testing.T) {
}, },
State: eval.Alerting, State: eval.Alerting,
Results: []state.Evaluation{ Results: []state.Evaluation{
{
EvaluationTime: evaluationTime,
EvaluationState: eval.Normal,
Values: make(map[string]*float64),
},
{ {
EvaluationTime: evaluationTime.Add(30 * time.Second), EvaluationTime: evaluationTime.Add(30 * time.Second),
EvaluationState: eval.Alerting, EvaluationState: eval.Alerting,
@ -1428,11 +1403,6 @@ func TestProcessEvalResults(t *testing.T) {
}, },
State: eval.NoData, State: eval.NoData,
Results: []state.Evaluation{ Results: []state.Evaluation{
{
EvaluationTime: evaluationTime,
EvaluationState: eval.Normal,
Values: make(map[string]*float64),
},
{ {
EvaluationTime: evaluationTime.Add(30 * time.Second), EvaluationTime: evaluationTime.Add(30 * time.Second),
EvaluationState: eval.Alerting, EvaluationState: eval.Alerting,

View File

@ -12,26 +12,26 @@ import (
) )
type State struct { type State struct {
AlertRuleUID string AlertRuleUID string
OrgID int64 OrgID int64
CacheId string CacheId string
State eval.State State eval.State
Resolved bool Resolved bool
Results []Evaluation Results []Evaluation
StartsAt time.Time LastEvaluationString string
EndsAt time.Time StartsAt time.Time
LastEvaluationTime time.Time EndsAt time.Time
EvaluationDuration time.Duration LastEvaluationTime time.Time
LastSentAt time.Time EvaluationDuration time.Duration
Annotations map[string]string LastSentAt time.Time
Labels data.Labels Annotations map[string]string
Error error Labels data.Labels
Error error
} }
type Evaluation struct { type Evaluation struct {
EvaluationTime time.Time EvaluationTime time.Time
EvaluationState eval.State EvaluationState eval.State
EvaluationString string
// Values contains the RefID and value of reduce and math expressions. // Values contains the RefID and value of reduce and math expressions.
// It does not contain values for classic conditions as the values // It does not contain values for classic conditions as the values
// in classic conditions do not have a RefID. // 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) { 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 { if numBuckets == 0 {
numBuckets = 10 // keep at least 10 evaluations in the event For is set to 0 numBuckets = 10 // keep at least 10 evaluations in the event For is set to 0
} }