Browse Source

Make copying alerting state safer.

This considers static labels in the equality of alerts to
avoid falsely copying state from a different alert definition with
the same name across reloads.

To be safe, it also copies the state map rather than just its pointer
so that remaining collisions disappear after one evaluation interval.
pull/1447/head
Fabian Reinartz 9 years ago
parent
commit
d89c254849
  1. 4
      rules/alerting.go
  2. 8
      rules/manager.go

4
rules/alerting.go

@ -110,6 +110,10 @@ func (rule *AlertingRule) Name() string {
return rule.name return rule.name
} }
func (r *AlertingRule) equal(o *AlertingRule) bool {
return r.name == o.name && r.labels.Equal(o.labels)
}
func (r *AlertingRule) sample(alert *Alert, ts model.Time, set bool) *model.Sample { func (r *AlertingRule) sample(alert *Alert, ts model.Time, set bool) *model.Sample {
metric := model.Metric(r.labels.Clone()) metric := model.Metric(r.labels.Clone())

8
rules/manager.go

@ -212,8 +212,12 @@ func (g *Group) copyState(from *Group) {
if !ok { if !ok {
continue continue
} }
if far.Name() == ar.Name() { // TODO(fabxc): forbid same alert definitions that are not unique by
ar.active = far.active // at least on static label or alertname?
if far.equal(ar) {
for fp, a := range far.active {
ar.active[fp] = a
}
} }
} }
} }

Loading…
Cancel
Save