From 01c89082ddb6298d79bfc9b5a937392ac6ef8f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Sat, 1 Jul 2017 12:09:07 -0700 Subject: [PATCH] Calculate min/max timestamps and store those as globals, keep individual timestamps per instance --- alertmanager/dedup.go | 13 +++++++++++++ alertmanager/models.go | 2 ++ models/alert.go | 7 ++++--- models/alertgroup_test.go | 2 +- models/alertmanager.go | 6 ++++++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/alertmanager/dedup.go b/alertmanager/dedup.go index b741a4424..f6d79e1d5 100644 --- a/alertmanager/dedup.go +++ b/alertmanager/dedup.go @@ -31,9 +31,22 @@ func DedupAlerts() []models.AlertGroup { alertLFP := alert.LabelsFingerprint() a, found := alerts[alertLFP] if found { + // if we already have an alert with the same fp then just append + // alertmanager instances to it, this way we end up with all instances + // for each unique alert merged into a single alert with all + // alertmanager instances attached to it for _, am := range alert.Alertmanager { a.Alertmanager = append(a.Alertmanager, am) } + // set startsAt to the earliest value we have + if alert.StartsAt.Before(a.StartsAt) { + a.StartsAt = alert.StartsAt + } + // set endsAt to the oldest value we have + if alert.EndsAt.After(a.EndsAt) { + a.EndsAt = alert.EndsAt + } + // update map alerts[alertLFP] = a } else { alerts[alertLFP] = models.Alert(alert) diff --git a/alertmanager/models.go b/alertmanager/models.go index 1ecb19737..c44488d8a 100644 --- a/alertmanager/models.go +++ b/alertmanager/models.go @@ -153,6 +153,8 @@ func (am *Alertmanager) pullAlerts(version string) error { models.AlertmanagerInstance{ Name: am.Name, URI: am.URI, + StartsAt: alert.StartsAt, + EndsAt: alert.EndsAt, Source: alert.GeneratorURL, Silences: silences, }, diff --git a/models/alert.go b/models/alert.go index 3b590364a..30216979b 100644 --- a/models/alert.go +++ b/models/alert.go @@ -37,9 +37,10 @@ type Alert struct { State string `json:"state"` // those are not exposed in JSON, Alertmanager specific value will be in kept // in the Alertmanager slice - GeneratorURL string `json:"-"` - SilencedBy []string `json:"-"` - InhibitedBy []string `json:"-"` + // skip those when generating alert fingerprint too + GeneratorURL string `json:"-" hash:"-"` + SilencedBy []string `json:"-" hash:"-"` + InhibitedBy []string `json:"-" hash:"-"` // unsee fields Alertmanager []AlertmanagerInstance `json:"alertmanager"` Receiver string `json:"receiver"` diff --git a/models/alertgroup_test.go b/models/alertgroup_test.go index ab505417b..1de912f9b 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: "954a7283c2cda4179b63499465d82a313d21180f", + fingerprint: "87e79b3d507d26f21bc5e82b8db19f87ce46c1ad", }, } diff --git a/models/alertmanager.go b/models/alertmanager.go index 35b263ff4..338f96135 100644 --- a/models/alertmanager.go +++ b/models/alertmanager.go @@ -1,10 +1,16 @@ package models +import "time" + // AlertmanagerInstance describes the Alertmanager instance alert was collected // from type AlertmanagerInstance struct { Name string `json:"name"` URI string `json:"uri"` + // timestamp collected from this instance, those on the alert itself + // will be calculated min/max values + StartsAt time.Time `json:"startsAt"` + EndsAt time.Time `json:"endsAt"` // Source links to alert source for given alertmanager instance Source string `json:"source"` // all silences matching current alert in this upstream