From f2b21a60e2369cd3c851adc429978422c006a39a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Sat, 1 Jul 2017 12:43:15 -0700 Subject: [PATCH] Store alert state per instance --- alertmanager/dedup.go | 15 +++++++++++++++ alertmanager/models.go | 1 + models/alertmanager.go | 2 ++ 3 files changed, 18 insertions(+) diff --git a/alertmanager/dedup.go b/alertmanager/dedup.go index f6d79e1d5..9831bbc65 100644 --- a/alertmanager/dedup.go +++ b/alertmanager/dedup.go @@ -24,6 +24,7 @@ func DedupAlerts() []models.AlertGroup { } dedupedGroups := []models.AlertGroup{} + alertStates := map[string][]string{} for _, agList := range uniqueGroups { alerts := map[string]models.Alert{} for _, ag := range agList { @@ -48,14 +49,28 @@ func DedupAlerts() []models.AlertGroup { } // update map alerts[alertLFP] = a + // and append alert state to the slice + alertStates[alertLFP] = append(alertStates[alertLFP], a.State) } else { alerts[alertLFP] = models.Alert(alert) + // seed alert state slice + alertStates[alertLFP] = []string{alert.State} } } } ag := models.AlertGroup(agList[0]) ag.Alerts = models.AlertList{} for _, alert := range alerts { + // calculate final alert state based on the most important value found + // in the list of states from all instances + alertLFP := alert.LabelsFingerprint() + if slices.StringInSlice(alertStates[alertLFP], models.AlertStateActive) { + alert.State = models.AlertStateActive + } else if slices.StringInSlice(alertStates[alertLFP], models.AlertStateSuppressed) { + alert.State = models.AlertStateSuppressed + } else { + alert.State = models.AlertStateUnprocessed + } // sort Alertmanager instances for every alert sort.Slice(alert.Alertmanager, func(i, j int) bool { return alert.Alertmanager[i].Name < alert.Alertmanager[j].Name diff --git a/alertmanager/models.go b/alertmanager/models.go index c44488d8a..28f6b2284 100644 --- a/alertmanager/models.go +++ b/alertmanager/models.go @@ -153,6 +153,7 @@ func (am *Alertmanager) pullAlerts(version string) error { models.AlertmanagerInstance{ Name: am.Name, URI: am.URI, + State: alert.State, StartsAt: alert.StartsAt, EndsAt: alert.EndsAt, Source: alert.GeneratorURL, diff --git a/models/alertmanager.go b/models/alertmanager.go index 338f96135..392f39a78 100644 --- a/models/alertmanager.go +++ b/models/alertmanager.go @@ -7,6 +7,8 @@ import "time" type AlertmanagerInstance struct { Name string `json:"name"` URI string `json:"uri"` + // per instance alert state + State string `json:"state"` // timestamp collected from this instance, those on the alert itself // will be calculated min/max values StartsAt time.Time `json:"startsAt"`