Alerting: Add backend support for keep_firing_for (#100750)
What is this feature? This PR introduces a new alert rule configuration option, keep_firing_for (Prometheus documentation). keep_firing_for prevents alerts from resolving immediately after the alert condition returns to normal. Instead, they transition into a "Recovering" state and are not considered resolved by the Alertmanager. Once the recovery period ends (or after the next evaluation if it is bigger than keep_firing_for), the alert transitions to "Normal" if it doesn't start alerting again: Before +----------+ +----------+ | Alerting |---->| Normal | +----------+ +----------+ ----- After +----------+ +------------+ +----------+ | Alerting |----->| Recovering |---->| Normal | +----------+ +------------+ +----------+ Why do we need this feature? This feature prevents flapping alerts by adding a recovery period. This helps avoid false resolutions caused by brief alert
This commit is contained in:
@@ -73,6 +73,7 @@ func (g *AlertRuleGenerator) Generate() AlertRule {
|
||||
|
||||
interval := (rand.Int63n(6) + 1) * 10
|
||||
forInterval := time.Duration(interval*rand.Int63n(6)) * time.Second
|
||||
keepFiringFor := time.Duration(interval*rand.Int63n(6)) * time.Second
|
||||
|
||||
var annotations map[string]string = nil
|
||||
if rand.Int63()%2 == 0 {
|
||||
@@ -122,6 +123,7 @@ func (g *AlertRuleGenerator) Generate() AlertRule {
|
||||
NoDataState: randNoDataState(),
|
||||
ExecErrState: randErrState(),
|
||||
For: forInterval,
|
||||
KeepFiringFor: keepFiringFor,
|
||||
Annotations: annotations,
|
||||
Labels: labels,
|
||||
NotificationSettings: ns,
|
||||
@@ -344,6 +346,18 @@ func (a *AlertRuleMutators) WithForNTimes(timesOfInterval int64) AlertRuleMutato
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AlertRuleMutators) WithKeepFiringFor(interval time.Duration) AlertRuleMutator {
|
||||
return func(rule *AlertRule) {
|
||||
rule.KeepFiringFor = interval
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AlertRuleMutators) WithKeepFiringForNTimes(timesOfInterval int64) AlertRuleMutator {
|
||||
return func(rule *AlertRule) {
|
||||
rule.KeepFiringFor = time.Duration(rule.IntervalSeconds*timesOfInterval) * time.Second
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AlertRuleMutators) WithNoDataExecAs(nodata NoDataState) AlertRuleMutator {
|
||||
return func(rule *AlertRule) {
|
||||
rule.NoDataState = nodata
|
||||
@@ -855,6 +869,7 @@ func AlertInstanceGen(mutators ...AlertInstanceMutator) *AlertInstance {
|
||||
InstanceStatePending,
|
||||
InstanceStateNoData,
|
||||
InstanceStateError,
|
||||
InstanceStateRecovering,
|
||||
}
|
||||
return s[rand.Intn(len(s))]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user