diff --git a/cmd/bosun/sched/bolt.go b/cmd/bosun/sched/bolt.go index 12ee37fedb..88d0ca2d18 100644 --- a/cmd/bosun/sched/bolt.go +++ b/cmd/bosun/sched/bolt.go @@ -51,6 +51,7 @@ const ( dbMetadata = "metadata" dbMetricMetadata = "metadata-metric" dbIncidents = "incidents" + dbErrors = "errors" ) func (s *Schedule) save() { @@ -67,8 +68,9 @@ func (s *Schedule) save() { dbSilence: s.Silence, dbStatus: s.status, dbMetadata: s.Metadata, - dbIncidents: s.Incidents, dbMetricMetadata: s.metricMetadata, + dbIncidents: s.Incidents, + dbErrors: s.AlertStatuses, } tostore := make(map[string][]byte) for name, data := range store { @@ -181,6 +183,9 @@ func (s *Schedule) RestoreState() error { if err := decode(dbIncidents, &s.Incidents); err != nil { slog.Errorln(dbIncidents, err) } + if err := decode(dbErrors, &s.AlertStatuses); err != nil { + slog.Errorln(dbErrors, err) + } // Calculate next incident id. for _, i := range s.Incidents { @@ -216,11 +221,16 @@ func (s *Schedule) RestoreState() error { } } clear(st.Result) + newHistory := []Event{} for _, e := range st.History { clear(e.Warn) clear(e.Crit) - clear(e.Error) + // Remove error events which no longer are a thing. + if e.Status <= StUnknown { + newHistory = append(newHistory, e) + } } + st.History = newHistory s.status[ak] = st if a.Log && st.Open { st.Open = false diff --git a/cmd/bosun/sched/check.go b/cmd/bosun/sched/check.go index 89d08ffd37..03f4bddf89 100644 --- a/cmd/bosun/sched/check.go +++ b/cmd/bosun/sched/check.go @@ -129,9 +129,7 @@ func (s *Schedule) runHistory(r *RunHistory, ak expr.AlertKey, event *Event, sil // make sure we always touch the state. state.Touched = r.Start // set state.Result according to event result - if event.Error != nil { - state.Result = event.Error - } else if event.Crit != nil { + if event.Crit != nil { state.Result = event.Crit } else if event.Warn != nil { state.Result = event.Warn @@ -407,7 +405,7 @@ func (s *Schedule) findUnknownAlerts(now time.Time, alert string) []expr.AlertKe s.Lock("FindUnknown") for ak, st := range s.status { name := ak.Name() - if name != alert || st.Forgotten || st.Status() == StError { + if name != alert || st.Forgotten || !s.AlertSuccessful(ak.Name()) { continue } a := s.Conf.Alerts[name] @@ -437,13 +435,16 @@ func (s *Schedule) CheckAlert(T miniprofiler.Timer, r *RunHistory, a *conf.Alert deps = filterDependencyResults(d) crits, err = s.CheckExpr(T, r, a, a.Crit, StCritical, nil) if err == nil { - warns, _ = s.CheckExpr(T, r, a, a.Warn, StWarning, crits) + warns, err = s.CheckExpr(T, r, a, a.Warn, StWarning, crits) } } unevalCount, unknownCount := markDependenciesUnevaluated(r.Events, deps, a.Name) if err != nil { slog.Errorf("Error checking alert %s: %s", a.Name, err.Error()) removeUnknownEvents(r.Events, a.Name) + s.markAlertError(a.Name, err) + } else { + s.markAlertSuccessful(a.Name) } collect.Put("check.duration", opentsdb.TagSet{"name": a.Name}, time.Since(start).Seconds()) slog.Infof("check alert %v done (%s): %v crits, %v warns, %v unevaluated, %v unknown", a.Name, time.Since(start), len(crits), len(warns), unevalCount, unknownCount) @@ -502,23 +503,6 @@ func (s *Schedule) executeExpr(T miniprofiler.Timer, rh *RunHistory, a *conf.Ale return nil, nil } results, _, err := e.Execute(rh.Context, rh.GraphiteContext, rh.Logstash, rh.InfluxHost, rh.Cache, T, rh.Start, 0, a.UnjoinedOK, s.Search, s.Conf.AlertSquelched(a), rh) - if err != nil { - ak := expr.NewAlertKey(a.Name, nil) - rh.Events[ak] = &Event{ - Status: StError, - Error: &Result{ - Result: &expr.Result{ - Computations: []expr.Computation{ - { - Text: e.String(), - Value: err.Error(), - }, - }, - }, - }, - } - return nil, err - } return results, err } @@ -575,7 +559,7 @@ Loop: } status := checkStatus if math.IsNaN(n) { - status = StError + status = checkStatus } else if n == 0 { status = StNormal } diff --git a/cmd/bosun/sched/filter.go b/cmd/bosun/sched/filter.go index 18d2db4341..8e2dc48610 100644 --- a/cmd/bosun/sched/filter.go +++ b/cmd/bosun/sched/filter.go @@ -81,8 +81,6 @@ func makeFilter(filter string) (func(*conf.Conf, *conf.Alert, *State) bool, erro v = StWarning case "critical": v = StCritical - case "error": - v = StError case "unknown": v = StUnknown default: diff --git a/cmd/bosun/sched/sched.go b/cmd/bosun/sched/sched.go index 5aefd4e4c4..d1eb4e0fb0 100644 --- a/cmd/bosun/sched/sched.go +++ b/cmd/bosun/sched/sched.go @@ -49,6 +49,8 @@ type Schedule struct { Incidents map[uint64]*Incident Search *search.Search + AlertStatuses map[string]*AlertStatus + //channel signals an alert has added notifications, and notifications should be processed. nc chan interface{} //notifications to be sent immediately @@ -58,11 +60,12 @@ type Schedule struct { //unknown states that need to be notified about. Collected and sent in batches. pendingUnknowns map[*conf.Notification][]*State - metaLock sync.Mutex - metricMetaLock sync.Mutex - maxIncidentId uint64 - incidentLock sync.Mutex - db *bolt.DB + metaLock sync.Mutex + metricMetaLock sync.Mutex + alertStatusLock sync.Mutex + maxIncidentId uint64 + incidentLock sync.Mutex + db *bolt.DB LastCheck time.Time @@ -72,6 +75,7 @@ type Schedule struct { func (s *Schedule) Init(c *conf.Conf) error { var err error s.Conf = c + s.AlertStatuses = make(map[string]*AlertStatus) s.Silence = make(map[string]*Silence) s.Group = make(map[time.Time]expr.AlertKeys) s.Metadata = make(map[metadata.Metakey]*Metavalue) @@ -353,6 +357,7 @@ type StateGroup struct { Active bool `json:",omitempty"` Status Status Silenced bool + IsError bool `json:",omitempty"` Subject string `json:",omitempty"` Alert string `json:",omitempty"` AlertKey expr.AlertKey `json:",omitempty"` @@ -366,7 +371,8 @@ type StateGroups struct { NeedAck []*StateGroup `json:",omitempty"` Acknowledged []*StateGroup `json:",omitempty"` } - TimeAndDate []int + TimeAndDate []int + FailingAlerts, UnclosedErrors int } func (s *Schedule) MarshalGroups(T miniprofiler.Timer, filter string) (*StateGroups, error) { @@ -380,6 +386,7 @@ func (s *Schedule) MarshalGroups(T miniprofiler.Timer, filter string) (*StateGro t := StateGroups{ TimeAndDate: s.Conf.TimeAndDate, } + t.FailingAlerts, t.UnclosedErrors = s.getErrorCounts() s.Lock("MarshallGroups") defer s.Unlock() T.Step("Setup", func(miniprofiler.Timer) { @@ -414,7 +421,7 @@ func (s *Schedule) MarshalGroups(T miniprofiler.Timer, filter string) (*StateGro for tuple, states := range groups { var grouped []*StateGroup switch tuple.Status { - case StWarning, StCritical, StUnknown, StError: + case StWarning, StCritical, StUnknown: var sets map[string]expr.AlertKeys T.Step(fmt.Sprintf("GroupSets (%d): %v", len(states), tuple), func(T miniprofiler.Timer) { sets = states.GroupSets() @@ -447,6 +454,7 @@ func (s *Schedule) MarshalGroups(T miniprofiler.Timer, filter string) (*StateGro Subject: string(st.Subject), Ago: marshalTime(st.Last().Time), State: st, + IsError: !s.AlertSuccessful(ak.Name()), }) } if len(g.Children) == 1 && g.Children[0].Subject != "" { @@ -683,7 +691,6 @@ func (s *Schedule) Action(user, message string, t ActionType, ak expr.AlertKey) st.NeedAck = false } isUnknown := st.AbnormalStatus() == StUnknown - isError := st.AbnormalStatus() == StError timestamp := time.Now().UTC() switch t { case ActionAcknowledge: @@ -698,7 +705,7 @@ func (s *Schedule) Action(user, message string, t ActionType, ak expr.AlertKey) if st.NeedAck { ack() } - if st.IsActive() && !isError { + if st.IsActive() { return fmt.Errorf("cannot close active alert") } st.Open = false @@ -755,11 +762,11 @@ func (s *State) Last() Event { } type Event struct { - Warn, Crit, Error *Result - Status Status - Time time.Time - Unevaluated bool - IncidentId uint64 + Warn, Crit *Result + Status Status + Time time.Time + Unevaluated bool + IncidentId uint64 } type Result struct { @@ -779,7 +786,6 @@ const ( StWarning StCritical StUnknown - StError ) func (s Status) String() string { @@ -792,8 +798,6 @@ func (s Status) String() string { return "critical" case StUnknown: return "unknown" - case StError: - return "error" default: return "none" } @@ -807,7 +811,6 @@ func (s Status) IsNormal() bool { return s == StNormal } func (s Status) IsWarning() bool { return s == StWarning } func (s Status) IsCritical() bool { return s == StCritical } func (s Status) IsUnknown() bool { return s == StUnknown } -func (s Status) IsError() bool { return s == StError } type Action struct { User string @@ -1123,3 +1126,124 @@ type HostData struct { } SerialNumber string `json:",omitempty"` } + +//Alert Status is the current state of a single alert +type AlertStatus struct { + Success bool + Errors []*AlertError +} + +type AlertError struct { + FirstTime, LastTime time.Time + Count int + Message string +} + +func (s *Schedule) AlertSuccessful(name string) bool { + s.alertStatusLock.Lock() + defer s.alertStatusLock.Unlock() + if as, ok := s.AlertStatuses[name]; ok { + return as.Success + } + return true +} + +func (s *Schedule) markAlertError(name string, err error) { + s.alertStatusLock.Lock() + defer s.alertStatusLock.Unlock() + as, ok := s.AlertStatuses[name] + if !ok { + as = &AlertStatus{} + s.AlertStatuses[name] = as + } + // if it succeeded prior to now, make a new error event. + // else if message is same as last, coalesce together. + // else append new event + now := time.Now().UTC().Truncate(time.Second) + newError := func() { + as.Errors = append(as.Errors, &AlertError{ + FirstTime: now, + LastTime: now, + Count: 1, + Message: err.Error(), + }) + } + if as.Success || len(as.Errors) == 0 { + newError() + } else { + last := as.Errors[len(as.Errors)-1] + if err.Error() == last.Message { + last.Count++ + last.LastTime = now + } else { + newError() + } + } + as.Success = false +} + +func (s *Schedule) markAlertSuccessful(name string) { + s.alertStatusLock.Lock() + defer s.alertStatusLock.Unlock() + as, ok := s.AlertStatuses[name] + if !ok { + as = &AlertStatus{} + s.AlertStatuses[name] = as + } + as.Success = true +} + +func (s *Schedule) ClearErrorLine(alert string, startTime time.Time) { + s.alertStatusLock.Lock() + defer s.alertStatusLock.Unlock() + if as, ok := s.AlertStatuses[alert]; ok { + newErrors := make([]*AlertError, 0, len(as.Errors)) + for _, err := range as.Errors { + if err.FirstTime != startTime { + newErrors = append(newErrors, err) + } + } + as.Errors = newErrors + if len(as.Errors) == 0 { + as.Success = true + } + } +} + +func (s *Schedule) getErrorCounts() (failing, total int) { + failing = 0 + total = 0 + s.alertStatusLock.Lock() + defer s.alertStatusLock.Unlock() + for _, as := range s.AlertStatuses { + if !as.Success { + failing++ + } + for _, err := range as.Errors { + total += err.Count + } + } + return +} + +func (s *Schedule) GetErrorHistory() map[string]*AlertStatus { + s.alertStatusLock.Lock() + defer s.alertStatusLock.Unlock() + mapCopy := make(map[string]*AlertStatus, len(s.AlertStatuses)) + for name, as := range s.AlertStatuses { + asCopy := &AlertStatus{ + Success: as.Success, + Errors: make([]*AlertError, len(as.Errors)), + } + for i, err := range as.Errors { + asCopy.Errors[i] = &AlertError{ + Count: err.Count, + FirstTime: err.FirstTime.UTC(), + LastTime: err.LastTime.UTC(), + Message: err.Message, + } + } + mapCopy[name] = asCopy + } + return mapCopy +} diff --git a/cmd/bosun/sched/sched_test.go b/cmd/bosun/sched/sched_test.go index 5c65cf8879..e84462b274 100644 --- a/cmd/bosun/sched/sched_test.go +++ b/cmd/bosun/sched/sched_test.go @@ -135,7 +135,7 @@ var queryTime = time.Date(2000, 1, 1, 12, 0, 0, 0, time.UTC) var window5Min = `"9.467277e+08", "9.46728e+08"` func TestCrit(t *testing.T) { - testSched(t, &schedTest{ + s := testSched(t, &schedTest{ conf: `alert a { crit = avg(q("avg:m{a=b}", "5m", "")) > 0 }`, @@ -152,6 +152,9 @@ func TestCrit(t *testing.T) { schedState{"a{a=b}", "critical"}: true, }, }) + if !s.AlertSuccessful("a") { + t.Fatal("Expected alert a to be successful") + } } func TestBandDisableUnjoined(t *testing.T) { @@ -258,45 +261,20 @@ func TestUnknown_WithError(t *testing.T) { state.Touched = queryTime.Add(-10 * time.Minute) state.Append(&Event{Status: StNormal, Time: state.Touched}) - testSched(t, &schedTest{ + s := testSched(t, &schedTest{ conf: `alert a { crit = avg(q("avg:m{a=*}", "5m", "")) > 0 }`, queries: map[string]opentsdb.ResponseSet{ `q("avg:m{a=*}", ` + window5Min + `)`: nil, }, - state: map[schedState]bool{ - schedState{"a{}", "error"}: true, - }, + state: map[schedState]bool{}, previous: map[expr.AlertKey]*State{ "a{a=b}": state, }, }) -} - -func TestError_To_Unknown(t *testing.T) { - ak := expr.NewAlertKey("a", nil) - state := NewStatus(ak) - state.Touched = queryTime.Add(-10 * time.Minute) - state.Append(&Event{Status: StError, Time: state.Touched}) - - s := testSched(t, &schedTest{ - conf: `alert a { - crit = avg(q("avg:m{a=*}", "5m", "")) > 0 - }`, - queries: map[string]opentsdb.ResponseSet{ - `q("avg:m{a=*}", ` + window5Min + `)`: {}, - }, - state: map[schedState]bool{ - //No abnormal events - }, - previous: map[expr.AlertKey]*State{ - ak: state, - }, - }) - st := s.GetStatus(expr.AlertKey(ak)) - if st.Status() != StError { - t.Errorf("Expected status to be %s but was %s", StError, st.Status()) + if s.AlertSuccessful("a") { + t.Fatal("Expected alert a to be in a failed state") } } diff --git a/cmd/bosun/web/expr.go b/cmd/bosun/web/expr.go index bb5ff2d1e6..1cd41f2d4c 100644 --- a/cmd/bosun/web/expr.go +++ b/cmd/bosun/web/expr.go @@ -134,7 +134,7 @@ func procRule(t miniprofiler.Timer, c *conf.Conf, a *conf.Alert, now time.Time, return nil, err } keys := make(expr.AlertKeys, len(rh.Events)) - errors, criticals, warnings, normals := make([]expr.AlertKey, 0), make([]expr.AlertKey, 0), make([]expr.AlertKey, 0), make([]expr.AlertKey, 0) + criticals, warnings, normals := make([]expr.AlertKey, 0), make([]expr.AlertKey, 0), make([]expr.AlertKey, 0) i := 0 for k, v := range rh.Events { v.Time = now @@ -147,8 +147,6 @@ func procRule(t miniprofiler.Timer, c *conf.Conf, a *conf.Alert, now time.Time, warnings = append(warnings, k) case sched.StCritical: criticals = append(criticals, k) - case sched.StError: - errors = append(errors, k) default: return nil, fmt.Errorf("unknown state type %v", v.Status) } @@ -179,9 +177,7 @@ func procRule(t miniprofiler.Timer, c *conf.Conf, a *conf.Alert, now time.Time, warning = append(warning, fmt.Sprintf("template group %s was not a subset of any result", template_group)) } } - if e := instance.History[0]; e.Error != nil { - instance.Result = e.Error - } else if e.Crit != nil { + if e := instance.History[0]; e.Crit != nil { instance.Result = e.Crit } else if e.Warn != nil { instance.Result = e.Warn @@ -239,7 +235,6 @@ func procRule(t miniprofiler.Timer, c *conf.Conf, a *conf.Alert, now time.Time, data = s.Data(rh, instance, a, false) } return &ruleResult{ - errors, criticals, warnings, normals, @@ -253,7 +248,6 @@ func procRule(t miniprofiler.Timer, c *conf.Conf, a *conf.Alert, now time.Time, } type ruleResult struct { - Errors []expr.AlertKey Criticals []expr.AlertKey Warnings []expr.AlertKey Normals []expr.AlertKey @@ -339,9 +333,9 @@ func Rule(t miniprofiler.Timer, w http.ResponseWriter, r *http.Request) (interfa Result *sched.Event } type Set struct { - Error, Critical, Warning, Normal int - Time string - Results []*Result `json:",omitempty"` + Critical, Warning, Normal int + Time string + Results []*Result `json:",omitempty"` } type History struct { Time, EndTime time.Time @@ -375,7 +369,6 @@ func Rule(t miniprofiler.Timer, w http.ResponseWriter, r *http.Request) (interfa continue } set := Set{ - Error: len(res.Errors), Critical: len(res.Criticals), Warning: len(res.Warnings), Normal: len(res.Normals), diff --git a/cmd/bosun/web/static.go b/cmd/bosun/web/static.go index 9430c4627b..3a1429d04f 100644 --- a/cmd/bosun/web/static.go +++ b/cmd/bosun/web/static.go @@ -3180,59 +3180,59 @@ pnIBAgAA//8dC7O6NwAAAA== "/js/0-bosun.ts": { local: "web/static/js/0-bosun.ts", - size: 9232, + size: 9346, modtime: 0, compressed: ` -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 `, }, @@ -9098,328 +9098,338 @@ xitlUKAxazlo8/8JAAD//4NB/DtLfAAA "/js/bosun.js": { local: "web/static/js/bosun.js", - size: 97224, + size: 100620, modtime: 0, compressed: ` -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 -8v8GAAD///9o4BnIewEA +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 `, }, @@ -10695,6 +10705,30 @@ yXHt957/NwAA///RKmHJoE4AAA== `, }, + "/js/errors.ts": { + local: "web/static/js/errors.ts", + size: 2579, + modtime: 0, + compressed: ` +H4sIAAAJbogA/6xVX2/qNhR/hk/hi65KIrjpnhOxaaOdhtZu09jLVFWVGxwS1bGR7bAhynefz7EdEqBr +td0+FPv8+Z2fz79UwjBV0JyRxa1SUi1zuWGE/W2YWGmy+EHqRjjZfjhgYKFTQsUu87eUaKMqsbZ3LunK +nlLyLCVnVFiRkYbyu0ow6xTFZPYtEU39zJRVacZZbtiq1XaVecnyFyu0ITAaum5ltQIdr3q6KWFbJkx6 +Zsao+p7zELgrXvrYJzrVcGbpADi3rFIHbsME6PDUw3D4DImZS2GU5JwpneTtORpjJudG8fGUPIw/a8if +PY4/l8Zs8MBlTk0lBV6UbAzoi0bkIIycR9otyZSgc0rEOln8ZE9LprZVDvKA5XR3/nbUIzwq8ZQsfocf +r4+hri5e4gtIZsSohlkxREzWzETja7qprl35x/FwMEh0k+dM6yhaUUMxORZnEJCcpQV6eMxA/OTMkkKq +W5qXERRvKmjNbNXRD5op+cUKrA/Is1a4bGor+6YjKOVfwnN00ieASzBXuhMDatjit1iTGQFFMpeNME6F +9x8rpc0fFTKoZW07KmlMHvV1ccfhjr5pH1TO/OB+eqlJNo0ugXaMT0AT/Of0UdsKLr37ISHkBMPGHeGb +ScFMXkLhwDglIzLBUzYEH4daVIJyvotgzPb9cs8KyjUDs7YRcPwsPhIMta0KvDslW5GrK/KprUeMWb5U +nsPwQwXCvAXoGekEynxqDlmXISwBz9AvgJYo3hJt5OY3JTd0jeMQQaJ7EMfdBDit95YqYkLHPUW9qvUb +GFyQu4GmOr4w4UysTRl4DxQzjRLEnBLobcD/y+EjM1AVUTfNsZ8MM5m4OTr0W/GMN9Cy2+BntkO6HuZX +wXftzu894cUZuh3wVZ/xqRObvL6SS8+C6G7M9tRuZZOGFTO1e5zaO+nPth/Ty0kAMMhDSAN+RiAJoGgf +7RbmRuqTjTlF/3/dm241KwZDib3639fBHLjBOrj1n+vzhXDojZL7UIYOPKmeL3iEWwKJoYN7eHYBKnxc +zzr6BBAWxDt44YMMUFCsaXcfAWSjgPbo2n58i2r9HdZ5Bs8Ntc68YaFkfUPNu8sdAO0wj66CA6KFCzRk +TU00+tP+fbm//3JzM8In9NwA67JbWaZ1PYrDhMs3GHU/Hy2ys0Zcd3yfjJEtlROXIxHf39YHc394jLN/ +AgAA//+RUf6dEwoAAA== +`, + }, + "/js/expr.ts": { local: "web/static/js/expr.ts", size: 2341, @@ -12950,23 +12984,24 @@ NeZtQ48ZNx5cB0tkPLvkz/bBIAzIu+Vq0mH5U/wNAAD//wJxdrNjAwAA "/partials/alertstate.html": { local: "web/static/partials/alertstate.html", - size: 3256, + size: 3396, modtime: 0, compressed: ` -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 +DQAA//9L9sWERA0AAA== `, }, @@ -13049,17 +13084,40 @@ fRfZm7lcOfJQY7Q3S5HNB22WjpEbke2V21B6QO59MmrMR8l4fHZuPFH+LwAA//8udOBWxycAAA== "/partials/dashboard.html": { local: "web/static/partials/dashboard.html", - size: 1037, + size: 1345, + modtime: 0, + compressed: ` +H4sIAAAJbogA/5xTTW/bPAw+9/0VrPACaYA6WXfM4gA5rLvttt1li3aEyJIh0U2NIv99lOTmA0iBopfE +FMnn4cfDtdIvUBsZQim8OwiwbRF27lAK46TSthWb/+4ug2pnCtMWT9+j48ojDXqC9Fto27iEVWmrLrDW +S06IiPn//e/DItB7579WgpK2RX9RxIT1uRJuUIauePqWKbXtB+KPu8ndON8VtbPknRHxncYeS0H4Ssnk +Gjqn0HCkNsRVTY97HJU72FJMHw//4wtamid/b2SNO2cU+qs8cs6Q7tOnJsM8z8mZ+4ZICtUIL9IMuIC/ +0ms3BHC045BAkhAyWIAw9L3zhGqVHENYrVPWBrihCS474AFfT0G116RraeaPIOv9at1IE3BJ/pRY7607 +GFQtqpwYw6KfM6wj3YxXROmJAUk7OzFNUWEMUnXazhewhYoXCg/3c+jkCBVC77FHq5ijQoZBkHacWuMh ++A7IgcU2Nqwpw95PHQw2VsiwcaBnLdxa+SQyCTuPTSmWSUWBZVQNRM6+R1dkk9Qm823GD4XCRg6GZpG4 +3qEaDC6epTZ8Cts43PAIOS5JlcNuRx0FT36Mi274kGjldbujHwKyyHIdXCUAK2IdenkuSvIKxObt7QPc +4/LC9cfWxgVUP1ODx+N6GaE2kO04g2Wm4guSt++HQsGbLlrvhr4UJ+Rf0Q6L34hqW+9FVEMpZtEMsD1r +pWPlz8RpBmcA7lR3KK1SvEu+qrNxuuZP0F8wqfcaLt++SP0vAAD///r8Ui1BBQAA +`, + }, + + "/partials/errors.html": { + local: "web/static/partials/errors.html", + size: 1844, modtime: 0, compressed: ` -H4sIAAAJbogA/5xSzW7bMAw+d0/BCgOaAHO67hjEBXLZbjvurkiMI0QWDYlO6rcfZSuJA7RA0Yst8iO/ -H1sb605gvE6pVpHOCkJTpQOda+VJWxca9frtYT5kyFe+qV5+ZeAO0R4jw/isXNjTyLVzwc64Ns+ykBmn -9+X1oQmMkeLXLFgdGowzE4XrcxbekUxt9fJzknSh61kODwXeU2wrQ4EjeZX7PHRYK8Y3Hkvx0JJFL5PO -s7gqzSMOls6hVuWw+I4nDLwc8c5rgwfyFuPdHhN5dt14dOxF5/cITrkhi8JugJP2Pa7gn46O+gTEBxlJ -rBlhIkuQ+q6jyGjXI9Cn9WbcegUJVOgmABb4dh0y0bEz2i9/gDbH9WavfcJnjtdFcwx09mgbtNNiHsu4 -bARitx/uhMaWELKjUJTKVBqStq0LyxVsYSc/FBaPS2j1ADuELmKHwYrGDoUGQYehRJOPEFtggoBNDux4 -on0sCfqQHQpt/qDv3wVOlbiumkh9V6tkDmh7j6s/uU6rv4h2a44qJ6vVUy4TbG+5W/mLTwouazcCBexa -1MFa8SU35FZcb+Yn5GdK9uJh3vui9P8AAAD//zDxReENBAAA +H4sIAAAJbogA/7RV30/jOBB+pn/FXHRSWqlJAXEvJY10h+CJQ6uFN7QPTjIkFq4d2Q6lyvZ/X/8KpKVo +V1pt1Tb1zPibz+NvpllznsO1lEIqyBZmMZlkFX2BkhGlVpEUmwh4nahGbFYR2rgon5yMQ0rBElYnZ+fW +cZK1EgcPYSg1uO+kIrxG6bAKyqsBC5TeMlxFm4ZqTFRLSlyCgUg2krSXUZ4tzMImXJiM+WR4fMqQCVJR +Xv+E48gz5kj5k3ABJ7ceJk1TG+6THnDwJN4Sa6EJu6Uc1XQGOZxGR1iGs66JrClPCqG1WC/P/mlfLx3f +ojMGHnbEheZgPkmFT6RjGtqOsUTSutGxzVoyWj6bgzEk8l/GpjNXhIoqUjCsDvisVpbQlY0FEwx9P3bv +dtnC5/4tFvfIsNRYfaCiguMYm74/8O52MFjeWR259pZwZEktRdceXrZzOQ4SWyTaaQ0oB/Qy/w5CVij/ +2y7hMb7vyhKViudxct+t42/7ak+NLfIHddB97PN6NcdL+MsHOYw5BK8KmMuRcxfBofR8cINesaNyum2G +AodVSGAXXplZc7G/X1PNMMq9jvveht+RNZo6JjD1a3MIs8QX5FrNHAgjBbI3nLc7DaX3mUwY5W2nQW9b +o9qywfK5EK/Rx22O+1pUyDx3F4pVtKcQ85ga5xz+dkS8SMrGFjKAW/csnHLhGIbfzUUOoz48UsRCVFsH +SJ9G5QtYn3T7MJGksE3pbHuiYUaQQTXp9aFyHuPklij9QNdoNbPX2cvT0NHm1fcWJv3fKIDU/lKC6Up0 +XBuDNhAKbqRYQ2bmHwetEmvzBNIbKn0aOwutP4cHcTRy4PMe6BiYjBmx52okmuL0vewYmmZ7ntpdc1vz +3S7KvxorfDEcswXx1P+gSBzfQSUh296NDxd9dPL+wgD2I2by6d2HDvW570SYDCk8NFSBeROohahAN/ZP +4J1IePwIAAD//x+8r+I0BwAA `, }, diff --git a/cmd/bosun/web/static/js/0-bosun.ts b/cmd/bosun/web/static/js/0-bosun.ts index 81b41b9405..8fcdf43cd8 100644 --- a/cmd/bosun/web/static/js/0-bosun.ts +++ b/cmd/bosun/web/static/js/0-bosun.ts @@ -33,6 +33,11 @@ bosunApp.config(['$routeProvider', '$locationProvider', '$httpProvider', functio templateUrl: 'partials/expr.html', controller: 'ExprCtrl', }). + when('/errors', { + title: 'Errors', + templateUrl: 'partials/errors.html', + controller: 'ErrorCtrl', + }). when('/graph', { title: 'Graph', templateUrl: 'partials/graph.html', diff --git a/cmd/bosun/web/static/js/bosun.js b/cmd/bosun/web/static/js/bosun.js index 7500c7aada..1247bd4d0c 100644 --- a/cmd/bosun/web/static/js/bosun.js +++ b/cmd/bosun/web/static/js/bosun.js @@ -30,6 +30,11 @@ bosunApp.config(['$routeProvider', '$locationProvider', '$httpProvider', functio title: 'Expression', templateUrl: 'partials/expr.html', controller: 'ExprCtrl' + }). + when('/errors', { + title: 'Errors', + templateUrl: 'partials/errors.html', + controller: 'ErrorCtrl' }). when('/graph', { title: 'Graph', @@ -1474,6 +1479,95 @@ bosunApp.directive('tsGraph', ['$window', 'nfmtFilter', function ($window, fmtfi } }; }]); +bosunControllers.controller('ErrorCtrl', ['$scope', '$http', '$location', '$route', function ($scope, $http, $location, $route) { + $scope.loading = true; + $http.get('/api/errors') + .success(function (data) { + $scope.errors = []; + _(data).forEach(function (err, name) { + err.Name = name; + err.Sum = 0; + err.Shown = true; + _(err.Errors).forEach(function (line) { + err.Sum += line.Count; + line.FirstTime = moment.utc(line.FirstTime); + line.LastTime = moment.utc(line.LastTime); + }); + $scope.errors.push(err); + }); + }) + .error(function (data) { + $scope.error = "Error fetching data: " + data; + }) + .finally(function () { $scope.loading = false; }); + $scope.check = function (err) { + if (err.checked && !err.Shown) { + err.Shown = true; + } + _(err.Errors).forEach(function (line) { + line.checked = err.checked; + }); + }; + $scope.click = function (err, event) { + event.stopPropagation(); + }; + $scope.totalLines = function () { + var t = 0; + _($scope.errors).forEach(function (err) { + t += err.Errors.length; + }); + return t; + }; + $scope.selectedLines = function () { + var t = 0; + _($scope.errors).forEach(function (err) { + _(err.Errors).forEach(function (line) { + if (line.checked) { + t++; + } + }); + }); + return t; + }; + var getKeys = function (checkedOnly) { + var keys = []; + _($scope.errors).forEach(function (err) { + _(err.Errors).forEach(function (line) { + if (!checkedOnly || line.checked) { + keys.push({ alert: err.Name, start: line.FirstTime }); + } + }); + }); + return keys; + }; + var clear = function (keys) { + $http.post('/api/errors', keys) + .success(function (data) { + $route.reload(); + }) + .error(function (data) { + $scope.error = "Error Clearing Errors: " + data; + }); + }; + $scope.clearAll = function () { + var keys = getKeys(false); + clear(keys); + }; + $scope.clearSelected = function () { + var keys = getKeys(true); + clear(keys); + }; + $scope.ruleLink = function (line, err) { + var url = "/config?alert=" + err.Name; + var fromDate = moment.utc(line.FirstTime); + url += "&fromDate=" + fromDate.format("YYYY-MM-DD"); + url += "&fromTime=" + fromDate.format("hh:mm"); + var toDate = moment.utc(line.LastTime); + url += "&toDate=" + toDate.format("YYYY-MM-DD"); + url += "&toTime=" + toDate.format("hh:mm"); + return url; + }; + }]); bosunControllers.controller('ExprCtrl', ['$scope', '$http', '$location', '$route', function ($scope, $http, $location, $route) { var search = $location.search(); var current; diff --git a/cmd/bosun/web/static/js/errors.ts b/cmd/bosun/web/static/js/errors.ts new file mode 100644 index 0000000000..bfed8f44d6 --- /dev/null +++ b/cmd/bosun/web/static/js/errors.ts @@ -0,0 +1,111 @@ +interface IErrorScope extends IBosunScope { + errors: any; + error: string; + loading: boolean; + totalLines: () => number; + selectedLines: ()=> number; + check: (err: any) => void; + click: (err: any, event:any) => void; + clearAll: () => void; + clearSelected: () => void; + ruleLink: (line:any, err:any) => string; +} + +bosunControllers.controller('ErrorCtrl', ['$scope', '$http', '$location', '$route', function($scope: IErrorScope, $http: ng.IHttpService, $location: ng.ILocationService, $route: ng.route.IRouteService) { + $scope.loading = true + $http.get('/api/errors') + .success((data) => { + $scope.errors = []; + _(data).forEach((err,name)=>{ + err.Name = name; + err.Sum = 0; + err.Shown = true; + _(err.Errors).forEach((line)=>{ + err.Sum += line.Count + line.FirstTime = moment.utc(line.FirstTime) + line.LastTime = moment.utc(line.LastTime) + }) + $scope.errors.push(err); + }) + }) + .error(function(data) { + $scope.error = "Error fetching data: " + data; + }) + .finally(()=>{$scope.loading=false}) + + $scope.check = (err) => { + if (err.checked && !err.Shown){ + err.Shown = true; + } + _(err.Errors).forEach((line)=>{ + line.checked = err.checked; + }) + }; + + $scope.click = (err, event) => { + event.stopPropagation(); + }; + + $scope.totalLines = () => { + var t = 0; + _($scope.errors).forEach((err) =>{ + t += err.Errors.length; + }) + return t; + }; + + $scope.selectedLines = () => { + var t = 0; + _($scope.errors).forEach((err) =>{ + _(err.Errors).forEach((line)=>{ + if(line.checked){ + t++; + } + }) + }) + return t; + }; + + var getKeys = (checkedOnly: boolean) => { + var keys = []; + _($scope.errors).forEach((err) =>{ + _(err.Errors).forEach((line)=>{ + if(!checkedOnly || line.checked){ + keys.push({alert:err.Name, start: line.FirstTime}) + } + }) + }) + return keys; + } + + var clear = (keys) => { + $http.post('/api/errors', keys) + .success((data) => { + $route.reload(); + }) + .error(function(data) { + $scope.error = "Error Clearing Errors: " + data; + }) + } + + $scope.clearAll = () =>{ + var keys = getKeys(false); + clear(keys); + } + + $scope.clearSelected = () => { + var keys = getKeys(true); + clear(keys); + } + + $scope.ruleLink = (line,err) => { + var url = "/config?alert=" + err.Name; + var fromDate = moment.utc(line.FirstTime) + url += "&fromDate=" + fromDate.format("YYYY-MM-DD"); + url += "&fromTime=" + fromDate.format("hh:mm") + var toDate = moment.utc(line.LastTime) + url += "&toDate=" + toDate.format("YYYY-MM-DD"); + url += "&toTime=" + toDate.format("hh:mm") + return url; + } +}]); \ No newline at end of file diff --git a/cmd/bosun/web/static/partials/alertstate.html b/cmd/bosun/web/static/partials/alertstate.html index 7509c22c80..6c2f3b2734 100644 --- a/cmd/bosun/web/static/partials/alertstate.html +++ b/cmd/bosun/web/static/partials/alertstate.html @@ -4,6 +4,7 @@