mirror of https://github.com/statping/statping
custom notifier JSON/text, notifier interface update, added example service and failure.
parent
f2ebe6de9f
commit
a9ef085024
|
@ -190,8 +190,8 @@ class Api {
|
|||
return axios.post('api/notifier/' + data.method, data).then(response => (response.data))
|
||||
}
|
||||
|
||||
async notifier_test(data) {
|
||||
return axios.post('api/notifier/' + data.method + '/test', data).then(response => (response.data))
|
||||
async notifier_test(data, notifier) {
|
||||
return axios.post('api/notifier/' + notifier + '/test', data).then(response => (response.data))
|
||||
}
|
||||
|
||||
async renewApiKeys() {
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
</span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
<p class="small text-muted" v-html="notifier.description"/>
|
||||
|
||||
<div v-for="(form, index) in notifier.form" v-bind:key="index" class="form-group">
|
||||
|
@ -65,23 +64,24 @@
|
|||
|
||||
</form>
|
||||
|
||||
<div v-if="error && !success" class="card text-black-50 bg-white mb-3">
|
||||
<div v-if="error || success" class="card text-black-50 bg-white mb-3">
|
||||
<div class="card-body">
|
||||
|
||||
<div v-if="error && !success" class="alert alert-danger col-12" role="alert">
|
||||
{{error}}<p v-if="response">Response:<br>{{response}}</p>
|
||||
</div>
|
||||
<div v-if="success" class="alert alert-success col-12" role="alert">
|
||||
{{notifier.title}} appears to be working!
|
||||
<p v-if="response">Response:<br>{{response}}</p>
|
||||
<span class="text-capitalize">{{notifier.title}}</span> appears to be working!
|
||||
</div>
|
||||
|
||||
<h5>Response</h5>
|
||||
<codemirror :value="response"/>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card text-black-50 bg-white mb-3">
|
||||
<div class="card-body">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-4 col-sm-4 mb-2 mb-sm-0 mt-2 mt-sm-0">
|
||||
<button @click.prevent="saveNotifier" type="submit" class="btn btn-block text-capitalize btn-primary save-notifier">
|
||||
|
@ -89,11 +89,11 @@
|
|||
</button>
|
||||
</div>
|
||||
<div class="col-4 col-md-4">
|
||||
<button @click.prevent="testNotifier" class="btn btn-outline-dark btn-block text-capitalize test-notifier">
|
||||
<button @click.prevent="testNotifier('success')" class="btn btn-outline-dark btn-block text-capitalize test-notifier">
|
||||
<i class="fa fa-vial"></i>{{loadingTest ? "Loading..." : "Test Success"}}</button>
|
||||
</div>
|
||||
<div class="col-4 col-md-4">
|
||||
<button @click.prevent="testNotifier" class="btn btn-outline-dark btn-block text-capitalize test-notifier">
|
||||
<button @click.prevent="testNotifier('failure')" class="btn btn-outline-dark btn-block text-capitalize test-notifier">
|
||||
<i class="fa fa-vial"></i>{{loadingTest ? "Loading..." : "Test Failure"}}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -140,6 +140,7 @@ export default {
|
|||
loadingTest: false,
|
||||
error: null,
|
||||
response: null,
|
||||
request: null,
|
||||
success: false,
|
||||
saved: false,
|
||||
success_data: null,
|
||||
|
@ -183,13 +184,6 @@ export default {
|
|||
setTimeout(function() {
|
||||
cm.refresh();
|
||||
},1);
|
||||
},
|
||||
onCmFocus(cm) {
|
||||
console.log('the editor is focused!', cm)
|
||||
},
|
||||
onCmCodeChange(newCode) {
|
||||
console.log('this is new code', newCode)
|
||||
this.success_data = newCode
|
||||
},
|
||||
async enableToggle() {
|
||||
this.notifier.enabled = !!this.notifier.enabled
|
||||
|
@ -214,14 +208,13 @@ export default {
|
|||
});
|
||||
this.form.success_data = this.success_data
|
||||
this.form.failure_data = this.failure_data
|
||||
window.console.log(this.form)
|
||||
await Api.notifier_save(this.form)
|
||||
const notifiers = await Api.notifiers()
|
||||
await this.$store.commit('setNotifiers', notifiers)
|
||||
this.saved = true
|
||||
this.loading = false
|
||||
},
|
||||
async testNotifier() {
|
||||
async testNotifier(method="success") {
|
||||
this.success = false
|
||||
this.loadingTest = true
|
||||
this.form.method = this.notifier.method
|
||||
|
@ -233,7 +226,11 @@ export default {
|
|||
}
|
||||
this.form[field] = val
|
||||
});
|
||||
const tested = await Api.notifier_test(this.form)
|
||||
let req = {
|
||||
notifier: this.form,
|
||||
method: method,
|
||||
}
|
||||
const tested = await Api.notifier_test(req, this.notifier.method)
|
||||
if (tested.success) {
|
||||
this.success = true
|
||||
} else {
|
||||
|
|
|
@ -190,6 +190,5 @@ func DecodeJSON(r *http.Request, obj interface{}) error {
|
|||
if err != nil {
|
||||
return errors.DecodeJSON
|
||||
}
|
||||
defer r.Body.Close()
|
||||
return nil
|
||||
return r.Body.Close()
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package handlers
|
|||
|
||||
import (
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/statping/statping/types/failures"
|
||||
"github.com/statping/statping/types/notifications"
|
||||
"github.com/statping/statping/types/services"
|
||||
"net/http"
|
||||
|
@ -56,21 +57,33 @@ func apiNotifierUpdateHandler(w http.ResponseWriter, r *http.Request) {
|
|||
sendJsonAction(vars["notifier"], "update", w, r)
|
||||
}
|
||||
|
||||
type testNotificationReq struct {
|
||||
Method string `json:"method"`
|
||||
Notification notifications.Notification `json:"notifier"`
|
||||
}
|
||||
|
||||
func testNotificationHandler(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
notifer, err := notifications.Find(vars["notifier"])
|
||||
_, err := notifications.Find(vars["notifier"])
|
||||
if err != nil {
|
||||
sendErrorJson(err, w, r)
|
||||
return
|
||||
}
|
||||
|
||||
if err := DecodeJSON(r, ¬ifer); err != nil {
|
||||
var req testNotificationReq
|
||||
if err := DecodeJSON(r, &req); err != nil {
|
||||
sendErrorJson(err, w, r)
|
||||
return
|
||||
}
|
||||
|
||||
notif := services.ReturnNotifier(notifer.Method)
|
||||
out, err := notif.OnTest()
|
||||
notif := services.ReturnNotifier(req.Notification.Method)
|
||||
|
||||
var out string
|
||||
if req.Method == "success" {
|
||||
out, err = notif.OnSuccess(services.Example(true))
|
||||
} else {
|
||||
out, err = notif.OnFailure(services.Example(false), failures.Example())
|
||||
}
|
||||
|
||||
resp := ¬ifierTestResp{
|
||||
Success: err == nil,
|
||||
|
|
|
@ -49,22 +49,22 @@ func runCommand(app string, cmd ...string) (string, string, error) {
|
|||
}
|
||||
|
||||
// OnSuccess for commandLine will trigger successful service
|
||||
func (c *commandLine) OnSuccess(s *services.Service) error {
|
||||
func (c *commandLine) OnSuccess(s *services.Service) (string, error) {
|
||||
tmpl := ReplaceVars(c.SuccessData, s, nil)
|
||||
_, _, err := runCommand(c.Host, tmpl)
|
||||
return err
|
||||
out, _, err := runCommand(c.Host, tmpl)
|
||||
return out, err
|
||||
}
|
||||
|
||||
// OnFailure for commandLine will trigger failing service
|
||||
func (c *commandLine) OnFailure(s *services.Service, f *failures.Failure) error {
|
||||
func (c *commandLine) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
|
||||
tmpl := ReplaceVars(c.FailureData, s, f)
|
||||
_, _, err := runCommand(c.Host, tmpl)
|
||||
return err
|
||||
_, ouerr, err := runCommand(c.Host, tmpl)
|
||||
return ouerr, err
|
||||
}
|
||||
|
||||
// OnTest for commandLine triggers when this notifier has been saved
|
||||
func (c *commandLine) OnTest() (string, error) {
|
||||
tmpl := ReplaceVars(c.Var1, exampleService, exampleFailure)
|
||||
tmpl := ReplaceVars(c.Var1, services.Example(true), exampleFailure)
|
||||
in, out, err := runCommand(c.Host, tmpl)
|
||||
utils.Log.Infoln(in)
|
||||
utils.Log.Infoln(out)
|
||||
|
|
|
@ -39,12 +39,12 @@ func TestCommandNotifier(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("Command OnFailure", func(t *testing.T) {
|
||||
err := Command.OnFailure(exampleService, exampleFailure)
|
||||
_, err := Command.OnFailure(exampleService, exampleFailure)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
t.Run("Command OnSuccess", func(t *testing.T) {
|
||||
err := Command.OnSuccess(exampleService)
|
||||
_, err := Command.OnSuccess(exampleService)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
|
|
|
@ -41,9 +41,9 @@ var Discorder = &discord{¬ifications.Notification{
|
|||
}
|
||||
|
||||
// Send will send a HTTP Post to the discord API. It accepts type: []byte
|
||||
func (d *discord) sendRequest(msg string) error {
|
||||
_, _, err := utils.HttpRequest(Discorder.GetValue("host"), "POST", "application/json", nil, strings.NewReader(msg), time.Duration(10*time.Second), true, nil)
|
||||
return err
|
||||
func (d *discord) sendRequest(msg string) (string, error) {
|
||||
out, _, err := utils.HttpRequest(Discorder.GetValue("host"), "POST", "application/json", nil, strings.NewReader(msg), time.Duration(10*time.Second), true, nil)
|
||||
return string(out), err
|
||||
}
|
||||
|
||||
func (d *discord) Select() *notifications.Notification {
|
||||
|
@ -51,15 +51,17 @@ func (d *discord) Select() *notifications.Notification {
|
|||
}
|
||||
|
||||
// OnFailure will trigger failing service
|
||||
func (d *discord) OnFailure(s *services.Service, f *failures.Failure) error {
|
||||
func (d *discord) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
|
||||
msg := `{"content": "Your service '{{.Service.Name}}' is currently failing! Reason: {{.Failure.Issue}}"}`
|
||||
return d.sendRequest(ReplaceVars(msg, s, f))
|
||||
out, err := d.sendRequest(ReplaceVars(msg, s, f))
|
||||
return out, err
|
||||
}
|
||||
|
||||
// OnSuccess will trigger successful service
|
||||
func (d *discord) OnSuccess(s *services.Service) error {
|
||||
func (d *discord) OnSuccess(s *services.Service) (string, error) {
|
||||
msg := `{"content": "Your service '{{.Service.Name}}' is currently online!"}`
|
||||
return d.sendRequest(ReplaceVars(msg, s, nil))
|
||||
out, err := d.sendRequest(ReplaceVars(msg, s, nil))
|
||||
return out, err
|
||||
}
|
||||
|
||||
// OnSave triggers when this notifier has been saved
|
||||
|
|
|
@ -46,12 +46,12 @@ func TestDiscordNotifier(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("discord OnFailure", func(t *testing.T) {
|
||||
err := Discorder.OnFailure(exampleService, exampleFailure)
|
||||
_, err := Discorder.OnFailure(exampleService, exampleFailure)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
t.Run("discord OnSuccess", func(t *testing.T) {
|
||||
err := Discorder.OnSuccess(exampleService)
|
||||
_, err := Discorder.OnSuccess(exampleService)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
|
|
|
@ -164,7 +164,7 @@ type emailOutgoing struct {
|
|||
}
|
||||
|
||||
// OnFailure will trigger failing service
|
||||
func (e *emailer) OnFailure(s *services.Service, f *failures.Failure) error {
|
||||
func (e *emailer) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
|
||||
subject := fmt.Sprintf("Service %s is Offline", s.Name)
|
||||
email := &emailOutgoing{
|
||||
To: e.Var2,
|
||||
|
@ -176,11 +176,11 @@ func (e *emailer) OnFailure(s *services.Service, f *failures.Failure) error {
|
|||
},
|
||||
From: e.Var1,
|
||||
}
|
||||
return e.dialSend(email)
|
||||
return "email failed", e.dialSend(email)
|
||||
}
|
||||
|
||||
// OnSuccess will trigger successful service
|
||||
func (e *emailer) OnSuccess(s *services.Service) error {
|
||||
func (e *emailer) OnSuccess(s *services.Service) (string, error) {
|
||||
subject := fmt.Sprintf("Service %s is Back Online", s.Name)
|
||||
email := &emailOutgoing{
|
||||
To: e.Var2,
|
||||
|
@ -192,7 +192,7 @@ func (e *emailer) OnSuccess(s *services.Service) error {
|
|||
},
|
||||
From: e.Var1,
|
||||
}
|
||||
return e.dialSend(email)
|
||||
return "email sent", e.dialSend(email)
|
||||
}
|
||||
|
||||
// OnTest triggers when this notifier has been saved
|
||||
|
|
|
@ -62,12 +62,12 @@ func TestEmailNotifier(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("email OnFailure", func(t *testing.T) {
|
||||
err := email.OnFailure(exampleService, exampleFailure)
|
||||
_, err := email.OnFailure(exampleService, exampleFailure)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
t.Run("email OnSuccess", func(t *testing.T) {
|
||||
err := email.OnSuccess(exampleService)
|
||||
_, err := email.OnSuccess(exampleService)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
|
@ -76,7 +76,7 @@ func TestEmailNotifier(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("email OnSuccess Again", func(t *testing.T) {
|
||||
err := email.OnSuccess(exampleService)
|
||||
_, err := email.OnSuccess(exampleService)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
|
|
|
@ -52,17 +52,17 @@ func (l *lineNotifier) sendMessage(message string) (string, error) {
|
|||
}
|
||||
|
||||
// OnFailure will trigger failing service
|
||||
func (l *lineNotifier) OnFailure(s *services.Service, f *failures.Failure) error {
|
||||
func (l *lineNotifier) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
|
||||
msg := fmt.Sprintf("Your service '%v' is currently offline!", s.Name)
|
||||
_, err := l.sendMessage(msg)
|
||||
return err
|
||||
out, err := l.sendMessage(msg)
|
||||
return out, err
|
||||
}
|
||||
|
||||
// OnSuccess will trigger successful service
|
||||
func (l *lineNotifier) OnSuccess(s *services.Service) error {
|
||||
func (l *lineNotifier) OnSuccess(s *services.Service) (string, error) {
|
||||
msg := fmt.Sprintf("Service %s is online!", s.Name)
|
||||
_, err := l.sendMessage(msg)
|
||||
return err
|
||||
out, err := l.sendMessage(msg)
|
||||
return out, err
|
||||
}
|
||||
|
||||
// OnTest triggers when this notifier has been saved
|
||||
|
|
|
@ -71,18 +71,18 @@ func dataJson(s *services.Service, f *failures.Failure) map[string]interface{} {
|
|||
}
|
||||
|
||||
// OnFailure will trigger failing service
|
||||
func (m *mobilePush) OnFailure(s *services.Service, f *failures.Failure) error {
|
||||
func (m *mobilePush) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
|
||||
data := dataJson(s, f)
|
||||
msg := &pushArray{
|
||||
Message: fmt.Sprintf("Your service '%v' is currently failing! Reason: %v", s.Name, f.Issue),
|
||||
Title: "Service Offline",
|
||||
Data: data,
|
||||
}
|
||||
return m.Send(msg)
|
||||
return "notification sent", m.Send(msg)
|
||||
}
|
||||
|
||||
// OnSuccess will trigger successful service
|
||||
func (m *mobilePush) OnSuccess(s *services.Service) error {
|
||||
func (m *mobilePush) OnSuccess(s *services.Service) (string, error) {
|
||||
data := dataJson(s, nil)
|
||||
msg := &pushArray{
|
||||
Message: "Service is Online!",
|
||||
|
@ -90,7 +90,7 @@ func (m *mobilePush) OnSuccess(s *services.Service) error {
|
|||
Data: data,
|
||||
Platform: 2,
|
||||
}
|
||||
return m.Send(msg)
|
||||
return "notification sent", m.Send(msg)
|
||||
}
|
||||
|
||||
// OnTest triggers when this notifier has been saved
|
||||
|
|
|
@ -51,12 +51,12 @@ func TestMobileNotifier(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("Mobile OnFailure", func(t *testing.T) {
|
||||
err := Mobile.OnFailure(exampleService, exampleFailure)
|
||||
_, err := Mobile.OnFailure(exampleService, exampleFailure)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
t.Run("Mobile OnSuccess", func(t *testing.T) {
|
||||
err := Mobile.OnSuccess(exampleService)
|
||||
_, err := Mobile.OnSuccess(exampleService)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ import (
|
|||
)
|
||||
|
||||
var log = utils.Log.WithField("type", "notifier")
|
||||
var exampleService = services.Example(true)
|
||||
|
||||
type replacer struct {
|
||||
Core *core.Core
|
||||
|
@ -62,7 +63,7 @@ func ReplaceVars(input string, s *services.Service, f *failures.Failure) string
|
|||
return ReplaceTemplate(input, replacer{Service: s, Failure: f, Core: core.App})
|
||||
}
|
||||
|
||||
var exampleService = &services.Service{
|
||||
var ExampleService = &services.Service{
|
||||
Id: 1,
|
||||
Name: "Statping",
|
||||
Domain: "https://statping.com",
|
||||
|
|
|
@ -70,22 +70,23 @@ func (t *pushover) sendMessage(message string) (string, error) {
|
|||
}
|
||||
|
||||
// OnFailure will trigger failing service
|
||||
func (t *pushover) OnFailure(s *services.Service, f *failures.Failure) error {
|
||||
func (t *pushover) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
|
||||
message := ReplaceVars(t.FailureData, s, f)
|
||||
_, err := t.sendMessage(message)
|
||||
return err
|
||||
out, err := t.sendMessage(message)
|
||||
return out, err
|
||||
}
|
||||
|
||||
// OnSuccess will trigger successful service
|
||||
func (t *pushover) OnSuccess(s *services.Service) error {
|
||||
func (t *pushover) OnSuccess(s *services.Service) (string, error) {
|
||||
message := ReplaceVars(t.SuccessData, s, nil)
|
||||
_, err := t.sendMessage(message)
|
||||
return err
|
||||
out, err := t.sendMessage(message)
|
||||
return out, err
|
||||
}
|
||||
|
||||
// OnTest will test the Pushover SMS messaging
|
||||
func (t *pushover) OnTest() (string, error) {
|
||||
msg := fmt.Sprintf("Testing the Pushover Notifier, Your service '%s' is currently offline! Error: %s", exampleService.Name, exampleFailure.Issue)
|
||||
example := services.Example(true)
|
||||
msg := fmt.Sprintf("Testing the Pushover Notifier, Your service '%s' is currently offline! Error: %s", example.Name, exampleFailure.Issue)
|
||||
content, err := t.sendMessage(msg)
|
||||
return content, err
|
||||
}
|
||||
|
|
|
@ -49,12 +49,12 @@ func TestPushoverNotifier(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("Pushover OnFailure", func(t *testing.T) {
|
||||
err := Pushover.OnFailure(exampleService, exampleFailure)
|
||||
_, err := Pushover.OnFailure(exampleService, exampleFailure)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
t.Run("Pushover OnSuccess", func(t *testing.T) {
|
||||
err := Pushover.OnSuccess(exampleService)
|
||||
_, err := Pushover.OnSuccess(exampleService)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
|
|
|
@ -56,17 +56,17 @@ var slacker = &slack{¬ifications.Notification{
|
|||
}
|
||||
|
||||
// Send will send a HTTP Post to the slack webhooker API. It accepts type: string
|
||||
func (s *slack) sendSlack(msg string) error {
|
||||
_, resp, err := utils.HttpRequest(s.Host, "POST", "application/json", nil, strings.NewReader(msg), time.Duration(10*time.Second), true, nil)
|
||||
func (s *slack) sendSlack(msg string) (string, error) {
|
||||
resp, _, err := utils.HttpRequest(s.Host, "POST", "application/json", nil, strings.NewReader(msg), time.Duration(10*time.Second), true, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
return nil
|
||||
return string(resp), nil
|
||||
}
|
||||
|
||||
func (s *slack) OnTest() (string, error) {
|
||||
testMsg := ReplaceVars(failingTemplate, exampleService, exampleFailure)
|
||||
example := services.Example(true)
|
||||
testMsg := ReplaceVars(failingTemplate, example, nil)
|
||||
contents, resp, err := utils.HttpRequest(s.Host, "POST", "application/json", nil, bytes.NewBuffer([]byte(testMsg)), time.Duration(10*time.Second), true, nil)
|
||||
if err != nil {
|
||||
return "", err
|
||||
|
@ -79,13 +79,15 @@ func (s *slack) OnTest() (string, error) {
|
|||
}
|
||||
|
||||
// OnFailure will trigger failing service
|
||||
func (s *slack) OnFailure(srv *services.Service, f *failures.Failure) error {
|
||||
func (s *slack) OnFailure(srv *services.Service, f *failures.Failure) (string, error) {
|
||||
msg := ReplaceVars(failingTemplate, srv, f)
|
||||
return s.sendSlack(msg)
|
||||
out, err := s.sendSlack(msg)
|
||||
return out, err
|
||||
}
|
||||
|
||||
// OnSuccess will trigger successful service
|
||||
func (s *slack) OnSuccess(srv *services.Service) error {
|
||||
func (s *slack) OnSuccess(srv *services.Service) (string, error) {
|
||||
msg := ReplaceVars(successTemplate, srv, nil)
|
||||
return s.sendSlack(msg)
|
||||
out, err := s.sendSlack(msg)
|
||||
return out, err
|
||||
}
|
||||
|
|
|
@ -47,12 +47,12 @@ func TestSlackNotifier(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("slack OnFailure", func(t *testing.T) {
|
||||
err := slacker.OnFailure(exampleService, exampleFailure)
|
||||
_, err := slacker.OnFailure(exampleService, exampleFailure)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
t.Run("slack OnSuccess", func(t *testing.T) {
|
||||
err := slacker.OnSuccess(exampleService)
|
||||
_, err := slacker.OnSuccess(exampleService)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
|
|
|
@ -74,17 +74,17 @@ func (t *telegram) sendMessage(message string) (string, error) {
|
|||
}
|
||||
|
||||
// OnFailure will trigger failing service
|
||||
func (t *telegram) OnFailure(s *services.Service, f *failures.Failure) error {
|
||||
func (t *telegram) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
|
||||
msg := ReplaceVars(t.FailureData, s, f)
|
||||
_, err := t.sendMessage(msg)
|
||||
return err
|
||||
out, err := t.sendMessage(msg)
|
||||
return out, err
|
||||
}
|
||||
|
||||
// OnSuccess will trigger successful service
|
||||
func (t *telegram) OnSuccess(s *services.Service) error {
|
||||
func (t *telegram) OnSuccess(s *services.Service) (string, error) {
|
||||
msg := ReplaceVars(t.SuccessData, s, nil)
|
||||
_, err := t.sendMessage(msg)
|
||||
return err
|
||||
out, err := t.sendMessage(msg)
|
||||
return out, err
|
||||
}
|
||||
|
||||
// OnTest will test the Twilio SMS messaging
|
||||
|
|
|
@ -53,12 +53,12 @@ func TestTelegramNotifier(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("Telegram OnFailure", func(t *testing.T) {
|
||||
err := Telegram.OnFailure(exampleService, exampleFailure)
|
||||
_, err := Telegram.OnFailure(exampleService, exampleFailure)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
t.Run("Telegram OnSuccess", func(t *testing.T) {
|
||||
err := Telegram.OnSuccess(exampleService)
|
||||
_, err := Telegram.OnSuccess(exampleService)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
|
|
|
@ -90,17 +90,15 @@ func (t *twilio) sendMessage(message string) (string, error) {
|
|||
}
|
||||
|
||||
// OnFailure will trigger failing service
|
||||
func (t *twilio) OnFailure(s *services.Service, f *failures.Failure) error {
|
||||
func (t *twilio) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
|
||||
msg := ReplaceVars(t.FailureData, s, f)
|
||||
_, err := t.sendMessage(msg)
|
||||
return err
|
||||
return t.sendMessage(msg)
|
||||
}
|
||||
|
||||
// OnSuccess will trigger successful service
|
||||
func (t *twilio) OnSuccess(s *services.Service) error {
|
||||
func (t *twilio) OnSuccess(s *services.Service) (string, error) {
|
||||
msg := ReplaceVars(t.SuccessData, s, nil)
|
||||
_, err := t.sendMessage(msg)
|
||||
return err
|
||||
return t.sendMessage(msg)
|
||||
}
|
||||
|
||||
// OnTest will test the Twilio SMS messaging
|
||||
|
|
|
@ -53,12 +53,12 @@ func TestTwilioNotifier(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("Twilio OnFailure", func(t *testing.T) {
|
||||
err := Twilio.OnFailure(exampleService, exampleFailure)
|
||||
_, err := Twilio.OnFailure(exampleService, exampleFailure)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
t.Run("Twilio OnSuccess", func(t *testing.T) {
|
||||
err := Twilio.OnSuccess(exampleService)
|
||||
_, err := Twilio.OnSuccess(exampleService)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
|
|
|
@ -111,7 +111,9 @@ func (w *webhooker) sendHttpWebhook(body string) (*http.Response, error) {
|
|||
}
|
||||
|
||||
func (w *webhooker) OnTest() (string, error) {
|
||||
body := ReplaceVars(w.SuccessData, exampleService, exampleFailure)
|
||||
f := failures.Example()
|
||||
s := services.Example(false)
|
||||
body := ReplaceVars(w.SuccessData, s, f)
|
||||
resp, err := w.sendHttpWebhook(body)
|
||||
if err != nil {
|
||||
return "", err
|
||||
|
@ -124,23 +126,25 @@ func (w *webhooker) OnTest() (string, error) {
|
|||
}
|
||||
|
||||
// OnFailure will trigger failing service
|
||||
func (w *webhooker) OnFailure(s *services.Service, f *failures.Failure) error {
|
||||
func (w *webhooker) OnFailure(s *services.Service, f *failures.Failure) (string, error) {
|
||||
msg := ReplaceVars(w.FailureData, s, f)
|
||||
resp, err := w.sendHttpWebhook(msg)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
return err
|
||||
content, err := ioutil.ReadAll(resp.Body)
|
||||
return string(content), err
|
||||
}
|
||||
|
||||
// OnSuccess will trigger successful service
|
||||
func (w *webhooker) OnSuccess(s *services.Service) error {
|
||||
func (w *webhooker) OnSuccess(s *services.Service) (string, error) {
|
||||
msg := ReplaceVars(w.SuccessData, s, nil)
|
||||
resp, err := w.sendHttpWebhook(msg)
|
||||
if err != nil {
|
||||
return err
|
||||
return "", err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
return err
|
||||
content, err := ioutil.ReadAll(resp.Body)
|
||||
return string(content), err
|
||||
}
|
||||
|
|
|
@ -45,12 +45,12 @@ func TestWebhookNotifier(t *testing.T) {
|
|||
})
|
||||
|
||||
t.Run("webhooker OnFailure", func(t *testing.T) {
|
||||
err := Webhook.OnFailure(exampleService, exampleFailure)
|
||||
_, err := Webhook.OnFailure(exampleService, exampleFailure)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
t.Run("webhooker OnSuccess", func(t *testing.T) {
|
||||
err := Webhook.OnSuccess(exampleService)
|
||||
_, err := Webhook.OnSuccess(exampleService)
|
||||
assert.Nil(t, err)
|
||||
})
|
||||
|
||||
|
|
|
@ -12,6 +12,20 @@ var (
|
|||
log = utils.Log.WithField("type", "failure")
|
||||
)
|
||||
|
||||
func Example() *Failure {
|
||||
return &Failure{
|
||||
Id: 48533,
|
||||
Issue: "Response did not response a 200 status code",
|
||||
Method: "",
|
||||
MethodId: 0,
|
||||
ErrorCode: 404,
|
||||
Service: 1,
|
||||
Checkin: 0,
|
||||
PingTime: 48309,
|
||||
CreatedAt: utils.Now(),
|
||||
}
|
||||
}
|
||||
|
||||
func Samples() error {
|
||||
log.Infoln("Inserting Sample Service Failures...")
|
||||
createdAt := utils.Now().Add(-3 * types.Day)
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
|
||||
// Notifier interface is required to create a new Notifier
|
||||
type Notifier interface {
|
||||
OnSuccess(*services.Service) error // OnSuccess is triggered when a service is successful
|
||||
OnFailure(*services.Service, *failures.Failure) error // OnFailure is triggered when a service is failing
|
||||
OnTest() (string, error) // OnTest is triggered for testing
|
||||
OnSuccess(*services.Service) (string, error) // OnSuccess is triggered when a service is successful
|
||||
OnFailure(*services.Service, *failures.Failure) (string, error) // OnFailure is triggered when a service is failing
|
||||
OnTest() (string, error) // OnTest is triggered for testing
|
||||
}
|
||||
|
|
|
@ -26,8 +26,8 @@ func FindNotifier(method string) *notifications.Notification {
|
|||
}
|
||||
|
||||
type ServiceNotifier interface {
|
||||
OnSuccess(*Service) error // OnSuccess is triggered when a service is successful
|
||||
OnFailure(*Service, *failures.Failure) error // OnFailure is triggered when a service is failing
|
||||
OnTest() (string, error) // OnTest is triggered for testing
|
||||
Select() *notifications.Notification // OnTest is triggered for testing
|
||||
OnSuccess(*Service) (string, error) // OnSuccess is triggered when a service is successful
|
||||
OnFailure(*Service, *failures.Failure) (string, error) // OnFailure is triggered when a service is failing
|
||||
OnTest() (string, error) // OnTest is triggered for testing
|
||||
Select() *notifications.Notification // OnTest is triggered for testing
|
||||
}
|
||||
|
|
|
@ -343,7 +343,7 @@ func sendSuccess(s *Service) {
|
|||
notif := n.Select()
|
||||
if notif.CanSend() {
|
||||
log.Infof("Sending notification to: %s!", notif.Method)
|
||||
if err := n.OnSuccess(s); err != nil {
|
||||
if _, err := n.OnSuccess(s); err != nil {
|
||||
notif.Logger().Errorln(err)
|
||||
}
|
||||
s.UserNotified = true
|
||||
|
@ -394,7 +394,7 @@ func sendFailure(s *Service, f *failures.Failure) {
|
|||
notif := n.Select()
|
||||
if notif.CanSend() {
|
||||
log.Infof("Sending Failure notification to: %s!", notif.Method)
|
||||
if err := n.OnFailure(s, f); err != nil {
|
||||
if _, err := n.OnFailure(s, f); err != nil {
|
||||
notif.Logger().WithField("failure", f.Issue).Errorln(err)
|
||||
}
|
||||
s.UserNotified = true
|
||||
|
|
|
@ -6,6 +6,61 @@ import (
|
|||
"time"
|
||||
)
|
||||
|
||||
func Example(online bool) *Service {
|
||||
return &Service{
|
||||
Id: 6283,
|
||||
Name: "Statping Example",
|
||||
Domain: "https://localhost:8080",
|
||||
Expected: null.NewNullString(""),
|
||||
ExpectedStatus: 200,
|
||||
Interval: int(time.Duration(15 * time.Second).Seconds()),
|
||||
Type: "http",
|
||||
Method: "get",
|
||||
PostData: null.NullString{},
|
||||
Port: 0,
|
||||
Timeout: int(time.Duration(2 * time.Second).Seconds()),
|
||||
Order: 0,
|
||||
VerifySSL: null.NewNullBool(true),
|
||||
Public: null.NewNullBool(true),
|
||||
GroupId: 0,
|
||||
TLSCert: null.NullString{},
|
||||
TLSCertKey: null.NullString{},
|
||||
TLSCertRoot: null.NullString{},
|
||||
Headers: null.NullString{},
|
||||
Permalink: null.NewNullString("example-service"),
|
||||
Redirect: null.NewNullBool(true),
|
||||
CreatedAt: utils.Now().Add(-23 * time.Hour),
|
||||
UpdatedAt: utils.Now().Add(-23 * time.Hour),
|
||||
Online: online,
|
||||
Latency: 393443,
|
||||
PingTime: 83526,
|
||||
Online24Hours: 0.98,
|
||||
Online7Days: 0.99,
|
||||
AvgResponse: 303443,
|
||||
FailuresLast24Hours: 2,
|
||||
Checkpoint: time.Time{},
|
||||
SleepDuration: 5 * time.Second,
|
||||
LastResponse: "The example service is hitting this page",
|
||||
NotifyAfter: 0,
|
||||
notifyAfterCount: 0,
|
||||
AllowNotifications: null.NewNullBool(true),
|
||||
UserNotified: false,
|
||||
UpdateNotify: null.NewNullBool(true),
|
||||
DownText: "The service ws responding with 500 status code",
|
||||
SuccessNotified: false,
|
||||
LastStatusCode: 200,
|
||||
Failures: nil,
|
||||
AllCheckins: nil,
|
||||
LastLookupTime: 4600,
|
||||
LastLatency: 124399,
|
||||
LastCheck: utils.Now().Add(-37 * time.Second),
|
||||
LastOnline: utils.Now().Add(-37 * time.Second),
|
||||
LastOffline: utils.Now().Add((-14 * 24) * time.Hour),
|
||||
SecondsOnline: int64(utils.Now().Add(-24 * time.Hour).Second()),
|
||||
SecondsOffline: int64(utils.Now().Add(-150 * time.Second).Second()),
|
||||
}
|
||||
}
|
||||
|
||||
func Samples() error {
|
||||
log.Infoln("Inserting Sample Services...")
|
||||
createdOn := utils.Now().Add(((-24 * 30) * 3) * time.Hour)
|
||||
|
|
Loading…
Reference in New Issue