notifier clear queue when back online

pull/94/head
Hunter Long 2018-10-27 02:27:09 -07:00
parent 70064ecbb9
commit 16b076aadd
13 changed files with 50 additions and 28 deletions

View File

@ -245,7 +245,7 @@ func Init(n Notifier) (*Notification, error) {
if err == nil {
notify, _ = SelectNotification(n)
if notify.Delay.Seconds() == 0 {
notify.Delay = time.Duration(60 * time.Second)
notify.Delay = time.Duration(1 * time.Second)
}
notify.testable = isType(n, new(Tester))
notify.Form = n.Select().Form
@ -400,9 +400,6 @@ func (n *Notification) WithinLimits() (bool, error) {
if n.SentLastMinute() >= n.Limits {
return false, fmt.Errorf("notifier sent %v out of %v in last minute", n.SentLastMinute(), n.Limits)
}
if n.Delay.Seconds() == 0 {
n.Delay = time.Duration(500 * time.Millisecond)
}
if n.LastSent().Seconds() == 0 {
return true, nil
}

View File

@ -227,14 +227,14 @@ func Dbtimestamp(group string, column string) string {
// Downtime returns the amount of time of a offline service
func (s *Service) Downtime() time.Duration {
hits, _ := s.Hits()
fails := s.LimitedFailures()
if len(fails) == 0 {
fail := s.lastFailure()
if fail == nil {
return time.Duration(0)
}
if len(hits) == 0 {
return time.Now().UTC().Sub(fails[len(fails)-1].CreatedAt.UTC())
return time.Now().UTC().Sub(fail.CreatedAt.UTC())
}
since := fails[0].CreatedAt.UTC().Sub(hits[0].CreatedAt.UTC())
since := fail.CreatedAt.UTC().Sub(fail.CreatedAt.UTC())
return since
}

View File

@ -202,7 +202,7 @@ func servicesUpdateHandler(w http.ResponseWriter, r *http.Request) {
service.Order = order
service.Update(true)
service.Check(true)
go service.Check(true)
executeResponse(w, r, "service.html", service, "/services")
}

View File

@ -83,6 +83,7 @@ func (u *discord) OnFailure(s *types.Service, f *types.Failure) {
// OnSuccess will trigger successful service
func (u *discord) OnSuccess(s *types.Service) {
if !u.Online {
u.ResetQueue()
msg := fmt.Sprintf(`{"content": "Your service '%v' is back online!"}`, s.Name)
u.AddQueue(msg)
}

View File

@ -66,7 +66,7 @@ func TestDiscordNotifier(t *testing.T) {
t.Run("discord OnFailure", func(t *testing.T) {
discorder.OnFailure(TestService, TestFailure)
assert.Len(t, discorder.Queue, 1)
assert.Equal(t, 1, len(discorder.Queue))
})
t.Run("discord Check Offline", func(t *testing.T) {
@ -75,7 +75,7 @@ func TestDiscordNotifier(t *testing.T) {
t.Run("discord OnSuccess", func(t *testing.T) {
discorder.OnSuccess(TestService)
assert.Len(t, discorder.Queue, 2)
assert.Equal(t, 1, len(discorder.Queue))
})
t.Run("discord Check Back Online", func(t *testing.T) {
@ -84,7 +84,7 @@ func TestDiscordNotifier(t *testing.T) {
t.Run("discord OnSuccess Again", func(t *testing.T) {
discorder.OnSuccess(TestService)
assert.Len(t, discorder.Queue, 2)
assert.Equal(t, 1, len(discorder.Queue))
})
t.Run("discord Send", func(t *testing.T) {

View File

@ -196,6 +196,7 @@ func (u *email) OnFailure(s *types.Service, f *types.Failure) {
// OnSuccess will trigger successful service
func (u *email) OnSuccess(s *types.Service) {
if !u.Online {
u.ResetQueue()
email := &emailOutgoing{
To: u.Var2,
Subject: fmt.Sprintf("Service %v is Back Online", s.Name),

View File

@ -102,7 +102,7 @@ func TestEmailNotifier(t *testing.T) {
t.Run("email OnFailure", func(t *testing.T) {
emailer.OnFailure(TestService, TestFailure)
assert.Len(t, emailer.Queue, 1)
assert.Equal(t, 1, len(emailer.Queue))
})
t.Run("email Check Offline", func(t *testing.T) {
@ -111,7 +111,7 @@ func TestEmailNotifier(t *testing.T) {
t.Run("email OnSuccess", func(t *testing.T) {
emailer.OnSuccess(TestService)
assert.Len(t, emailer.Queue, 2)
assert.Equal(t, 1, len(emailer.Queue))
})
t.Run("email Check Back Online", func(t *testing.T) {
@ -120,7 +120,7 @@ func TestEmailNotifier(t *testing.T) {
t.Run("email OnSuccess Again", func(t *testing.T) {
emailer.OnSuccess(TestService)
assert.Len(t, emailer.Queue, 2)
assert.Equal(t, 1, len(emailer.Queue))
})
t.Run("email Send", func(t *testing.T) {

View File

@ -90,6 +90,7 @@ func (u *lineNotifier) OnFailure(s *types.Service, f *types.Failure) {
// OnSuccess will trigger successful service
func (u *lineNotifier) OnSuccess(s *types.Service) {
if !u.Online {
u.ResetQueue()
msg := fmt.Sprintf("Your service '%v' is back online!", s.Name)
u.AddQueue(msg)
}

View File

@ -36,12 +36,12 @@ var TestService = &types.Service{
Name: "Interpol - All The Rage Back Home",
Domain: "https://www.youtube.com/watch?v=-u6DvRyyKGU",
ExpectedStatus: 200,
Expected: "test example",
Interval: 30,
Type: "http",
Method: "GET",
Timeout: 20,
LastStatusCode: 404,
Expected: "test example",
LastResponse: "<html>this is an example response</html>",
CreatedAt: time.Now().Add(-24 * time.Hour),
}

View File

@ -30,7 +30,7 @@ import (
const (
slackMethod = "slack"
failingTemplate = `{ "attachments": [ { "fallback": "Service {{.Service.Name}} - is currently failing", "text": "Your Statup service <{{.Service.Domain}}|{{.Service.Name}}> has just received a Failure notification based on your expected results. {{.Service.Name}} responded with a HTTP Status code of {{.Service.LastStatusCode}}.", "fields": [ { "title": "Expected", "value": "{{.Service.Expected}}", "short": true }, { "title": "Status Code", "value": "{{.Service.LastStatusCode}}", "short": true } ], "color": "#FF0000", "thumb_url": "https://statup.io", "footer": "Statup", "footer_icon": "https://img.cjx.io/statuplogo32.png" } ] }`
successTemplate = `{ "attachments": [ { "fallback": "Service {{.Service.Name}} - is now back online", "text": "Your Statup service <{{.Service.Domain}}|{{.Service.Name}}> is now back online and meets your expected responses.", "fields": [ { "title": "Issue", "value": "Awesome Project", "short": true }, { "title": "Status Code", "value": "{{.Service.LastStatusCode}}", "short": true } ], "color": "#00FF00", "thumb_url": "https://statup.io", "footer": "Statup", "footer_icon": "https://img.cjx.io/statuplogo32.png" } ] }`
successTemplate = `{ "attachments": [ { "fallback": "Service {{.Service.Name}} - is now back online", "text": "Your Statup service <{{.Service.Domain}}|{{.Service.Name}}> is now back online and meets your expected responses.", "color": "#00FF00", "thumb_url": "https://statup.io", "footer": "Statup", "footer_icon": "https://img.cjx.io/statuplogo32.png" } ] }`
slackText = `{"text":"{{.}}"}`
)
@ -127,6 +127,7 @@ func (u *slack) OnFailure(s *types.Service, f *types.Failure) {
// OnSuccess will trigger successful service
func (u *slack) OnSuccess(s *types.Service) {
if !u.Online {
u.ResetQueue()
message := slackMessage{
Service: s,
Template: successTemplate,

View File

@ -46,6 +46,7 @@ func TestSlackNotifier(t *testing.T) {
t.Run("Load slack", func(t *testing.T) {
slacker.Host = SLACK_URL
slacker.Delay = time.Duration(100 * time.Millisecond)
slacker.Limits = 3
err := notifier.AddNotifier(slacker)
assert.Nil(t, err)
assert.Equal(t, "Hunter Long", slacker.Author)
@ -60,11 +61,11 @@ func TestSlackNotifier(t *testing.T) {
assert.True(t, slacker.CanTest())
})
t.Run("slack parse message", func(t *testing.T) {
err := parseSlackMessage(slackText, "this is a test!")
assert.Nil(t, err)
assert.Equal(t, 1, len(slacker.Queue))
})
//t.Run("slack parse message", func(t *testing.T) {
// err := parseSlackMessage(slackText, "this is a test!")
// assert.Nil(t, err)
// assert.Equal(t, 1, len(slacker.Queue))
//})
t.Run("slack Within Limits", func(t *testing.T) {
ok, err := slacker.WithinLimits()
@ -74,7 +75,14 @@ func TestSlackNotifier(t *testing.T) {
t.Run("slack OnFailure", func(t *testing.T) {
slacker.OnFailure(TestService, TestFailure)
assert.Len(t, slacker.Queue, 2)
assert.Equal(t, 1, len(slacker.Queue))
})
t.Run("slack OnFailure multiple times", func(t *testing.T) {
for i := 0; i <= 50; i++ {
slacker.OnFailure(TestService, TestFailure)
}
assert.Equal(t, 52, len(slacker.Queue))
})
t.Run("slack Check Offline", func(t *testing.T) {
@ -83,22 +91,33 @@ func TestSlackNotifier(t *testing.T) {
t.Run("slack OnSuccess", func(t *testing.T) {
slacker.OnSuccess(TestService)
assert.Len(t, slacker.Queue, 3)
assert.Equal(t, 1, len(slacker.Queue))
})
t.Run("slack Check Back Online", func(t *testing.T) {
t.Run("slack Queue after being online", func(t *testing.T) {
assert.True(t, slacker.Online)
assert.Equal(t, 1, len(slacker.Queue))
})
t.Run("slack OnSuccess Again", func(t *testing.T) {
assert.True(t, slacker.Online)
slacker.OnSuccess(TestService)
assert.Len(t, slacker.Queue, 3)
assert.Equal(t, 1, len(slacker.Queue))
go notifier.Queue(slacker)
time.Sleep(5 * time.Second)
assert.Equal(t, 0, len(slacker.Queue))
})
t.Run("slack Within Limits again", func(t *testing.T) {
ok, err := slacker.WithinLimits()
assert.Nil(t, err)
assert.True(t, ok)
})
t.Run("slack Send", func(t *testing.T) {
err := slacker.Send(slackTestMessage)
assert.Nil(t, err)
assert.Len(t, slacker.Queue, 3)
assert.Equal(t, 0, len(slacker.Queue))
})
t.Run("slack Test", func(t *testing.T) {
@ -108,7 +127,7 @@ func TestSlackNotifier(t *testing.T) {
t.Run("slack Queue", func(t *testing.T) {
go notifier.Queue(slacker)
time.Sleep(4 * time.Second)
time.Sleep(5 * time.Second)
assert.Equal(t, SLACK_URL, slacker.Host)
assert.Equal(t, 0, len(slacker.Queue))
})

View File

@ -122,6 +122,7 @@ func (u *twilio) OnFailure(s *types.Service, f *types.Failure) {
// OnSuccess will trigger successful service
func (u *twilio) OnSuccess(s *types.Service) {
if !u.Online {
u.ResetQueue()
msg := fmt.Sprintf("Your service '%v' is back online!", s.Name)
u.AddQueue(msg)
}

View File

@ -177,6 +177,7 @@ func (w *webhooker) OnFailure(s *types.Service, f *types.Failure) {
// OnSuccess will trigger successful service
func (w *webhooker) OnSuccess(s *types.Service) {
if !w.Online {
w.ResetQueue()
msg := replaceBodyText(w.Var2, s, nil)
webhook.AddQueue(msg)
}