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.
This commit is contained in:
Fabian Reinartz 2016-03-02 11:54:37 +01:00
parent 95c9706d2d
commit d89c254849
2 changed files with 10 additions and 2 deletions

View File

@ -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())

View File

@ -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
}
} }
} }
} }