From b7dd9d088ed6953fe85329feb7138b07ed3663a8 Mon Sep 17 00:00:00 2001 From: Tristan Colgate Date: Wed, 29 Mar 2017 08:18:31 +0100 Subject: [PATCH] Fixes for 0.5.1 --- alertmanager/silences.go | 15 +++---- filters/filter_fuzzy.go | 6 +-- filters/filter_silence_author.go | 10 ++--- filters/filter_silence_jira.go | 10 ++--- filters/filter_silenced.go | 3 +- filters/filter_test.go | 76 ++++++++++++++++---------------- mock/api/v1/alerts/groups | 10 ++--- mock/api/v1/silences | 8 ++-- models/models.go | 4 +- timer.go | 7 ++- views.go | 7 ++- views_test.go | 11 ++--- 12 files changed, 78 insertions(+), 89 deletions(-) diff --git a/alertmanager/silences.go b/alertmanager/silences.go index b63b03eb4..e04eb3af7 100644 --- a/alertmanager/silences.go +++ b/alertmanager/silences.go @@ -12,17 +12,12 @@ import ( log "github.com/Sirupsen/logrus" ) -type silencesData struct { - Silences []models.AlertmanagerSilence `json:"silences"` - TotalSilences int `json:"totalSilences"` -} - // SilenceAPIResponse is what Alertmanager API returns type SilenceAPIResponse struct { - Status string `json:"status"` - Data silencesData `json:"data"` - ErrorType string `json:"errorType"` - Error string `json:"error"` + Status string `json:"status"` + Data []models.AlertmanagerSilence `json:"data"` + ErrorType string `json:"errorType"` + Error string `json:"error"` } // Get will return fresh data from Alertmanager API @@ -44,6 +39,6 @@ func (response *SilenceAPIResponse) Get() error { return errors.New(response.Error) } - log.Infof("Got %d silences(s) in %s", len(response.Data.Silences), time.Since(start)) + log.Infof("Got %d silences(s) in %s", len(response.Data), time.Since(start)) return nil } diff --git a/filters/filter_fuzzy.go b/filters/filter_fuzzy.go index 2a31b09c6..1cc0200a5 100644 --- a/filters/filter_fuzzy.go +++ b/filters/filter_fuzzy.go @@ -3,7 +3,7 @@ package filters import ( "fmt" "regexp" - "strconv" + "github.com/cloudflare/unsee/models" "github.com/cloudflare/unsee/store" ) @@ -41,8 +41,8 @@ func (filter *fuzzyFilter) Match(alert *models.UnseeAlert, matches int) bool { } } - if alert.Silenced > 0 { - if silence, found := store.SilenceStore.Store[strconv.Itoa(alert.Silenced)]; found { + if alert.Silenced != "" { + if silence, found := store.SilenceStore.Store[alert.Silenced]; found { if filter.Matcher.Compare(silence.Comment, filter.Value) { filter.Hits++ return true diff --git a/filters/filter_silence_author.go b/filters/filter_silence_author.go index 8b3ce1c4f..a34e294d4 100644 --- a/filters/filter_silence_author.go +++ b/filters/filter_silence_author.go @@ -2,8 +2,8 @@ package filters import ( "fmt" - "strconv" "strings" + "github.com/cloudflare/unsee/models" "github.com/cloudflare/unsee/store" ) @@ -15,9 +15,9 @@ type silenceAuthorFilter struct { func (filter *silenceAuthorFilter) Match(alert *models.UnseeAlert, matches int) bool { if filter.IsValid { var isMatch bool - if alert.Silenced > 0 { + if alert.Silenced != "" { store.StoreLock.RLock() - if silence, found := store.SilenceStore.Store[strconv.Itoa(alert.Silenced)]; found { + if silence, found := store.SilenceStore.Store[alert.Silenced]; found { isMatch = filter.Matcher.Compare(filter.Value, silence.CreatedBy) } store.StoreLock.RUnlock() @@ -41,9 +41,9 @@ func newSilenceAuthorFilter() FilterT { func sinceAuthorAutocomplete(name string, operators []string, alerts []models.UnseeAlert) []models.UnseeAutocomplete { tokens := map[string]models.UnseeAutocomplete{} for _, alert := range alerts { - if alert.Silenced > 0 { + if alert.Silenced != "" { store.StoreLock.RLock() - if silence, found := store.SilenceStore.Store[strconv.Itoa(alert.Silenced)]; found && silence.CreatedBy != "" { + if silence, found := store.SilenceStore.Store[alert.Silenced]; found && silence.CreatedBy != "" { for _, operator := range operators { token := fmt.Sprintf("%s%s%s", name, operator, silence.CreatedBy) tokens[token] = makeAC(token, []string{ diff --git a/filters/filter_silence_jira.go b/filters/filter_silence_jira.go index 34b6f76cd..690f0367c 100644 --- a/filters/filter_silence_jira.go +++ b/filters/filter_silence_jira.go @@ -2,8 +2,8 @@ package filters import ( "fmt" - "strconv" "strings" + "github.com/cloudflare/unsee/models" "github.com/cloudflare/unsee/store" ) @@ -15,9 +15,9 @@ type silenceJiraFilter struct { func (filter *silenceJiraFilter) Match(alert *models.UnseeAlert, matches int) bool { if filter.IsValid { var isMatch bool - if alert.Silenced > 0 { + if alert.Silenced != "" { store.StoreLock.RLock() - if silence, found := store.SilenceStore.Store[strconv.Itoa(alert.Silenced)]; found { + if silence, found := store.SilenceStore.Store[alert.Silenced]; found { isMatch = filter.Matcher.Compare(silence.JiraID, filter.Value) } store.StoreLock.RUnlock() @@ -41,9 +41,9 @@ func newSilenceJiraFilter() FilterT { func sinceJiraIDAutocomplete(name string, operators []string, alerts []models.UnseeAlert) []models.UnseeAutocomplete { tokens := map[string]models.UnseeAutocomplete{} for _, alert := range alerts { - if alert.Silenced > 0 { + if alert.Silenced != "" { store.StoreLock.RLock() - if silence, found := store.SilenceStore.Store[strconv.Itoa(alert.Silenced)]; found && silence.JiraID != "" { + if silence, found := store.SilenceStore.Store[alert.Silenced]; found && silence.JiraID != "" { for _, operator := range operators { token := fmt.Sprintf("%s%s%s", name, operator, silence.JiraID) tokens[token] = makeAC(token, []string{ diff --git a/filters/filter_silenced.go b/filters/filter_silenced.go index 5f8992b07..380bb4e1a 100644 --- a/filters/filter_silenced.go +++ b/filters/filter_silenced.go @@ -3,6 +3,7 @@ package filters import ( "fmt" "strings" + "github.com/cloudflare/unsee/models" ) @@ -30,7 +31,7 @@ func (filter *silencedFilter) init(name string, matcher *matcherT, rawText strin func (filter *silencedFilter) Match(alert *models.UnseeAlert, matches int) bool { if filter.IsValid { var isSilenced bool - isSilenced = (alert.Silenced > 0) + isSilenced = (alert.Silenced != "") isMatch := filter.Matcher.Compare(isSilenced, filter.Value) if isMatch { filter.Hits++ diff --git a/filters/filter_test.go b/filters/filter_test.go index ae1f36d78..4013f31bb 100644 --- a/filters/filter_test.go +++ b/filters/filter_test.go @@ -2,12 +2,12 @@ package filters_test import ( "encoding/json" + "testing" + "time" + "github.com/cloudflare/unsee/filters" "github.com/cloudflare/unsee/models" "github.com/cloudflare/unsee/store" - "strconv" - "testing" - "time" ) type filterTest struct { @@ -34,13 +34,13 @@ var tests = []filterTest{ filterTest{ Expression: "@silenced=true", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, IsMatch: true, }, filterTest{ Expression: "@silenced!=true", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, IsMatch: false, }, filterTest{ @@ -51,86 +51,86 @@ var tests = []filterTest{ filterTest{ Expression: "@silence_jira=1", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1}, JiraID: "1"}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1"}, JiraID: "1"}, IsMatch: true, }, filterTest{ Expression: "@silence_jira=2", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1"}}, IsMatch: false, }, filterTest{ Expression: "@silence_jira!=3", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1}, JiraID: "x"}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1"}, JiraID: "x"}, IsMatch: true, }, filterTest{ Expression: "@silence_jira!=4", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1}, JiraID: "4"}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1"}, JiraID: "4"}, IsMatch: false, }, filterTest{ Expression: "@silence_jira!=5", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1"}}, IsMatch: true, }, filterTest{ Expression: "@silence_jira=~abc", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1}, JiraID: "xxabcxx"}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1"}, JiraID: "xxabcxx"}, IsMatch: true, }, filterTest{ Expression: "@silence_jira=~abc", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1}, JiraID: "xxx"}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1"}, JiraID: "xxx"}, IsMatch: false, }, filterTest{ Expression: "@silence_author=john", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1, CreatedBy: "john"}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1", CreatedBy: "john"}}, IsMatch: true, }, filterTest{ Expression: "@silence_author=john", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1, CreatedBy: "bob"}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1", CreatedBy: "bob"}}, IsMatch: false, }, filterTest{ Expression: "@silence_author!=john", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1, CreatedBy: "bob"}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1", CreatedBy: "bob"}}, IsMatch: true, }, filterTest{ Expression: "@silence_author!=john", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1, CreatedBy: "john"}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1", CreatedBy: "john"}}, IsMatch: false, }, filterTest{ Expression: "@silence_author!=john", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1"}}, IsMatch: true, }, @@ -241,29 +241,29 @@ var tests = []filterTest{ filterTest{ Expression: "abc", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1, Comment: "abc"}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1", Comment: "abc"}}, IsMatch: true, }, filterTest{ Expression: "abc", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1, Comment: "abcxxx"}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1", Comment: "abcxxx"}}, IsMatch: true, }, filterTest{ Expression: "abc", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1, Comment: "ABCD"}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1", Comment: "ABCD"}}, IsMatch: true, }, filterTest{ Expression: "abc", IsValid: true, - Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: 1}}, - Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: 1, Comment: "xzc"}}, + Alert: models.UnseeAlert{AlertmanagerAlert: models.AlertmanagerAlert{Silenced: "1"}}, + Silence: models.UnseeSilence{AlertmanagerSilence: models.AlertmanagerSilence{ID: "1", Comment: "xzc"}}, IsMatch: false, }, filterTest{ @@ -282,7 +282,7 @@ func TestFilters(t *testing.T) { for _, ft := range tests { if &ft.Silence != nil { store.SilenceStore.Store = map[string]models.UnseeSilence{} - store.SilenceStore.Store[strconv.Itoa(ft.Silence.ID)] = ft.Silence + store.SilenceStore.Store[ft.Silence.ID] = ft.Silence } else { store.SilenceStore.Store = map[string]models.UnseeSilence{} } diff --git a/mock/api/v1/alerts/groups b/mock/api/v1/alerts/groups index 96939c8ad..06f3ea520 100644 --- a/mock/api/v1/alerts/groups +++ b/mock/api/v1/alerts/groups @@ -35,7 +35,7 @@ "endsAt": "0001-01-01T00:00:00Z", "generatorURL": "http://localhost/graph", "inhibited": false, - "silenced": 1 + "silenced": "1" }, { "labels": { @@ -88,7 +88,7 @@ "endsAt": "0001-01-01T00:00:00Z", "generatorURL": "http://localhost/graph", "inhibited": false, - "silenced": 1 + "silenced": "1" }, { "labels": { @@ -164,7 +164,7 @@ "endsAt": "0001-01-01T00:00:00Z", "generatorURL": "http://localhost/graph", "inhibited": false, - "silenced": 2 + "silenced": "2" }, { "labels": { @@ -180,7 +180,7 @@ "endsAt": "0001-01-01T00:00:00Z", "generatorURL": "http://localhost/graph", "inhibited": false, - "silenced": 2 + "silenced": "2" }, { "labels": { @@ -196,7 +196,7 @@ "endsAt": "0001-01-01T00:00:00Z", "generatorURL": "http://localhost/graph", "inhibited": false, - "silenced": 2 + "silenced": "2" } ] } diff --git a/mock/api/v1/silences b/mock/api/v1/silences index 4323e6374..3488c4421 100644 --- a/mock/api/v1/silences +++ b/mock/api/v1/silences @@ -1,9 +1,8 @@ { "status": "success", - "data": { - "silences": [ + "data": [ { - "id": 1, + "id": "1", "matchers": [ { "name": "instance", @@ -18,7 +17,7 @@ "comment": "Silenced instance" }, { - "id": 2, + "id": "2", "matchers": [ { "name": "alertname", @@ -38,6 +37,5 @@ "comment": "Silenced Host_Down alerts in the dev cluster" } ], - "totalSilences": 2 } } diff --git a/models/models.go b/models/models.go index a60adbb3a..33158746d 100644 --- a/models/models.go +++ b/models/models.go @@ -10,7 +10,7 @@ type AlertmanagerAlert struct { EndsAt time.Time `json:"endsAt"` GeneratorURL string `json:"generatorURL"` Inhibited bool `json:"inhibited"` - Silenced int `json:"silenced"` + Silenced string `json:"silenced"` } // AlertmanagerAlertGroup is vanilla group object from Alertmanager, exposed under api/v1/alerts/groups @@ -23,7 +23,7 @@ type AlertmanagerAlertGroup struct { // AlertmanagerSilence is vanilla silence object from Alertmanager, exposed under api/v1/silences type AlertmanagerSilence struct { - ID int `json:"id"` + ID string `json:"id"` Matchers []struct { Name string `json:"name"` Value string `json:"value"` diff --git a/timer.go b/timer.go index 5d275c414..fb36968ed 100644 --- a/timer.go +++ b/timer.go @@ -6,7 +6,6 @@ import ( "io" "runtime" "sort" - "strconv" "time" "github.com/cloudflare/unsee/alertmanager" @@ -48,9 +47,9 @@ func PullFromAlertmanager() { } silenceStore := make(map[string]models.UnseeSilence) - for _, silence := range silenceResponse.Data.Silences { + for _, silence := range silenceResponse.Data { jiraID, jiraLink := transform.DetectJIRAs(&silence) - silenceStore[strconv.Itoa(silence.ID)] = models.UnseeSilence{ + silenceStore[silence.ID] = models.UnseeSilence{ AlertmanagerSilence: silence, JiraID: jiraID, JiraURL: jiraLink, @@ -116,7 +115,7 @@ func PullFromAlertmanager() { for _, alert := range alerts { ag.Alerts = append(ag.Alerts, alert) - if alert.Silenced > 0 { + if alert.Silenced != "" { counterAlertsSilenced++ } else { counterAlertsUnsilenced++ diff --git a/views.go b/views.go index 3f08a47c4..e4f694f32 100644 --- a/views.go +++ b/views.go @@ -7,7 +7,6 @@ import ( "io" "net/http" "sort" - "strconv" "strings" "time" @@ -153,9 +152,9 @@ func alerts(c *gin.Context) { } io.WriteString(h, string(aj)) - if alert.Silenced > 0 { - if silence, found := store.SilenceStore.Store[strconv.Itoa(alert.Silenced)]; found { - silences[strconv.Itoa(alert.Silenced)] = silence + if alert.Silenced != "" { + if silence, found := store.SilenceStore.Store[alert.Silenced]; found { + silences[alert.Silenced] = silence } agCopy.SilencedCount++ countLabel(counters, "@silenced", "true") diff --git a/views_test.go b/views_test.go index 5023176f8..494520cb2 100644 --- a/views_test.go +++ b/views_test.go @@ -64,10 +64,9 @@ func mockAlerts() { silences := `{ "status": "success", - "data": { - "silences": [ + "data": [ { - "id": 1, + "id": "1", "matchers": [ { "name": "alertname", @@ -81,9 +80,7 @@ func mockAlerts() { "createdBy": "john@localhost", "comment": "JIRA-3273" } - ], - "totalSilences": 1100 - } + ] }` httpmock.RegisterResponder("GET", "http://localhost/api/v1/silences?limit=4294967295", httpmock.NewStringResponder(200, silences)) @@ -119,7 +116,7 @@ func mockAlerts() { "endsAt": "0001-01-01T00:00:00Z", "generatorURL": "https://localhost/prometheus", "inhibited": false, - "silenced": 1 + "silenced": "1" } ] }