vmalert: skip automatically added labels on alerts restore (#871)

Label `alertgroup` was introduced in #611 and automatically added to generated
time series. By mistake, this new label wasn't correctly purged on restore event
and affected alert's ID uniqueness. This commit removes `alertgroup` label
in restore function.

https://github.com/VictoriaMetrics/VictoriaMetrics/issues/870
This commit is contained in:
Roman Khavronenko 2020-10-30 08:18:20 +00:00 committed by Aliaksandr Valialkin
parent e8fe618bbb
commit 333675875f
2 changed files with 7 additions and 3 deletions

View file

@ -403,7 +403,7 @@ func (ar *AlertingRule) Restore(ctx context.Context, q datasource.Querier, lookb
labelsFilter += fmt.Sprintf(",%s=%q", k, v) labelsFilter += fmt.Sprintf(",%s=%q", k, v)
} }
// Get the last datapoint in range via MetricsQL `last_over_time`. // Get the last data point in range via MetricsQL `last_over_time`.
// We don't use plain PromQL since Prometheus doesn't support // We don't use plain PromQL since Prometheus doesn't support
// remote write protocol which is used for state persistence in vmalert. // remote write protocol which is used for state persistence in vmalert.
expr := fmt.Sprintf("last_over_time(%s{alertname=%q%s}[%ds])", expr := fmt.Sprintf("last_over_time(%s{alertname=%q%s}[%ds])",
@ -417,11 +417,14 @@ func (ar *AlertingRule) Restore(ctx context.Context, q datasource.Querier, lookb
labels := m.Labels labels := m.Labels
m.Labels = make([]datasource.Label, 0) m.Labels = make([]datasource.Label, 0)
// drop all extra labels, so hash key will // drop all extra labels, so hash key will
// be identical to timeseries received in Exec // be identical to time series received in Exec
for _, l := range labels { for _, l := range labels {
if l.Name == alertNameLabel { if l.Name == alertNameLabel {
continue continue
} }
if l.Name == alertGroupNameLabel {
continue
}
// drop all overridden labels // drop all overridden labels
if _, ok := ar.Labels[l.Name]; ok { if _, ok := ar.Labels[l.Name]; ok {
continue continue
@ -436,7 +439,7 @@ func (ar *AlertingRule) Restore(ctx context.Context, q datasource.Querier, lookb
a.ID = hash(m) a.ID = hash(m)
a.State = notifier.StatePending a.State = notifier.StatePending
ar.alerts[a.ID] = a ar.alerts[a.ID] = a
logger.Infof("alert %q(%d) restored to state at %v", a.Name, a.ID, a.Start) logger.Infof("alert %q (%d) restored to state at %v", a.Name, a.ID, a.Start)
} }
return nil return nil
} }

View file

@ -355,6 +355,7 @@ func TestAlertingRule_Restore(t *testing.T) {
metricWithValueAndLabels(t, float64(time.Now().Truncate(time.Hour).Unix()), metricWithValueAndLabels(t, float64(time.Now().Truncate(time.Hour).Unix()),
"__name__", alertForStateMetricName, "__name__", alertForStateMetricName,
alertNameLabel, "", alertNameLabel, "",
alertGroupNameLabel, "groupID",
"foo", "bar", "foo", "bar",
"namespace", "baz", "namespace", "baz",
), ),