mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Backend: * Update the Grafana Alerting engine to provide feedback to HysteresisCommand. The feedback information is stored in state.Manager as a fingerprint of each state. The fingerprint is persisted to the database. Only fingerprints that belong to Pending and Alerting states are considered as "loaded" and provided back to the command. - add ResultFingerprint to state.State. It's different from other fingerprints we store in the state because it is calculated from the result labels. - add rule_fingerprint column to alert_instance - update alerting evaluator to accept AlertingResultsReader via context, and update scheduler to provide it. - add AlertingResultsFromRuleState that implements the new interface in eval package - update getExprRequest to patch the hysteresis command. * Only one "Recovery Threshold" query is allowed to be used in the alert rule and it must be the Condition. Frontend: * Add hysteresis option to Threshold in UI. It's called "Recovery Threshold" * Add test for getUnloadEvaluatorTypeFromCondition * Hide hysteresis in panel expressions * Refactor isInvalid and add test for it * Remove unnecesary React.memo * Add tests for updateEvaluatorConditions --------- Co-authored-by: Sonia Aguilar <soniaaguilarpeiron@gmail.com>
45 lines
1.3 KiB
Go
45 lines
1.3 KiB
Go
package schedule
|
|
|
|
import (
|
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
|
|
|
"github.com/grafana/grafana/pkg/services/ngalert/eval"
|
|
ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models"
|
|
"github.com/grafana/grafana/pkg/services/ngalert/state"
|
|
)
|
|
|
|
var _ eval.AlertingResultsReader = AlertingResultsFromRuleState{}
|
|
|
|
func (sch *schedule) newLoadedMetricsReader(rule *ngmodels.AlertRule) eval.AlertingResultsReader {
|
|
return &AlertingResultsFromRuleState{
|
|
Manager: sch.stateManager,
|
|
Rule: rule,
|
|
}
|
|
}
|
|
|
|
type RuleStateProvider interface {
|
|
GetStatesForRuleUID(orgID int64, alertRuleUID string) []*state.State
|
|
}
|
|
|
|
// AlertingResultsFromRuleState implements eval.AlertingResultsReader that gets the data from state manager.
|
|
// It returns results fingerprints only for Alerting and Pending states that have empty StateReason.
|
|
type AlertingResultsFromRuleState struct {
|
|
Manager RuleStateProvider
|
|
Rule *ngmodels.AlertRule
|
|
}
|
|
|
|
func (n AlertingResultsFromRuleState) Read() map[data.Fingerprint]struct{} {
|
|
states := n.Manager.GetStatesForRuleUID(n.Rule.OrgID, n.Rule.UID)
|
|
|
|
active := map[data.Fingerprint]struct{}{}
|
|
for _, st := range states {
|
|
if st.StateReason != "" {
|
|
continue
|
|
}
|
|
if st.State == eval.Alerting || st.State == eval.Pending {
|
|
active[st.ResultFingerprint] = struct{}{}
|
|
}
|
|
}
|
|
return active
|
|
}
|