From b0d6628f82ca5a4d742e91606eeb44b179ed5a2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Sun, 25 Jun 2017 11:07:28 -0700 Subject: [PATCH] Generate alert unique fingerprint on the fly --- alertmanager/dedup.go | 7 ++++--- alertmanager/models.go | 10 +++------- models/alert.go | 7 ++++++- models/alertgroup_test.go | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/alertmanager/dedup.go b/alertmanager/dedup.go index 9d36e8137..2f6646f57 100644 --- a/alertmanager/dedup.go +++ b/alertmanager/dedup.go @@ -27,14 +27,15 @@ func DedupAlerts() []models.AlertGroup { alerts := map[string]models.Alert{} for _, ag := range agList { for _, alert := range ag.Alerts { - a, found := alerts[alert.ID] + alertLFP := alert.LabelsFingerprint() + a, found := alerts[alertLFP] if found { for _, am := range alert.Alertmanager { a.Alertmanager = append(a.Alertmanager, am) - alerts[alert.ID] = a + alerts[alertLFP] = a } } else { - alerts[alert.ID] = alert + alerts[alertLFP] = alert } } } diff --git a/alertmanager/models.go b/alertmanager/models.go index 8b5125f96..517a28e86 100644 --- a/alertmanager/models.go +++ b/alertmanager/models.go @@ -119,16 +119,12 @@ func (am *Alertmanager) pullAlerts(version string) error { } } for _, alert := range ag.Alerts { - // generate alert id from labels - aID := fmt.Sprintf("%x", structhash.Sha1(alert.Labels, 1)) - alert.ID = aID - // generate alert fingerprint from a raw, unaltered alert object - fp := fmt.Sprintf("%x", structhash.Sha1(alert, 1)) if _, found := uniqueAlerts[agID]; !found { uniqueAlerts[agID] = map[string]models.Alert{} } - if _, found := uniqueAlerts[agID][fp]; !found { - uniqueAlerts[agID][fp] = alert + alertCFP := alert.ContentFingerprint() + if _, found := uniqueAlerts[agID][alertCFP]; !found { + uniqueAlerts[agID][alertCFP] = alert } } diff --git a/models/alert.go b/models/alert.go index efdff33fb..7ba954efd 100644 --- a/models/alert.go +++ b/models/alert.go @@ -42,7 +42,12 @@ type Alert struct { Alertmanager []AlertmanagerUpstream `json:"alertmanager"` Receiver string `json:"receiver"` Links map[string]string `json:"links"` - ID string `json:"-"` +} + +// LabelsFingerprint is a checksum computed only from labels which should be +// unique for every alert +func (a Alert) LabelsFingerprint() string { + return fmt.Sprintf("%x", structhash.Sha1(a.Labels, 1)) } // ContentFingerprint is a checksum computed from entire alert object diff --git a/models/alertgroup_test.go b/models/alertgroup_test.go index 1f7a4ca29..ab505417b 100644 --- a/models/alertgroup_test.go +++ b/models/alertgroup_test.go @@ -114,7 +114,7 @@ var agFPTests = []agFPTest{ }, StateCount: map[string]int{"default": 0}, }, - fingerprint: "c4a76e2d59f7ef3d49b20da06c4a89f63fdf9e3f", + fingerprint: "954a7283c2cda4179b63499465d82a313d21180f", }, }