From efea3bc9cbf4f0a6a8592e458e422f5dc42b2add Mon Sep 17 00:00:00 2001 From: bergquist Date: Wed, 15 Jun 2016 14:45:05 +0200 Subject: [PATCH] feat(alerting): skeleton commit for webhook --- pkg/models/{emails.go => notifications.go} | 8 +++ pkg/services/alerting/engine.go | 3 +- pkg/services/alerting/notifier.go | 23 +++++++- pkg/services/notifications/notifications.go | 15 +++++ pkg/services/notifications/webhook.go | 62 +++++++++++++++++++++ 5 files changed, 107 insertions(+), 4 deletions(-) rename pkg/models/{emails.go => notifications.go} (73%) create mode 100644 pkg/services/notifications/webhook.go diff --git a/pkg/models/emails.go b/pkg/models/notifications.go similarity index 73% rename from pkg/models/emails.go rename to pkg/models/notifications.go index 74da180f7d8..cd62a4c046d 100644 --- a/pkg/models/emails.go +++ b/pkg/models/notifications.go @@ -12,6 +12,14 @@ type SendEmailCommand struct { Info string } +type SendWebhook struct { + Url string + AuthUser string + AuthPassword string + Body string + Method string +} + type SendResetPasswordEmailCommand struct { User *User } diff --git a/pkg/services/alerting/engine.go b/pkg/services/alerting/engine.go index 458fabd2f6b..88d39929efe 100644 --- a/pkg/services/alerting/engine.go +++ b/pkg/services/alerting/engine.go @@ -134,6 +134,7 @@ func (e *Engine) saveState(result *AlertResult) { query := &m.GetAlertByIdQuery{Id: result.AlertJob.Rule.Id} bus.Dispatch(query) + e.notifier.Notify(result) if query.Result.ShouldUpdateState(result.State) { cmd := &m.UpdateAlertStateCommand{ AlertId: result.AlertJob.Rule.Id, @@ -146,7 +147,7 @@ func (e *Engine) saveState(result *AlertResult) { } e.log.Debug("will notify! about", "new state", result.State) - e.notifier.Notify(result) + } else { e.log.Debug("state remains the same!") } diff --git a/pkg/services/alerting/notifier.go b/pkg/services/alerting/notifier.go index 48fa4767437..7378ff45fda 100644 --- a/pkg/services/alerting/notifier.go +++ b/pkg/services/alerting/notifier.go @@ -51,20 +51,36 @@ type EmailNotifier struct { } func (this *EmailNotifier) Dispatch(alertResult *AlertResult) { - //bus.dispath to notification package in grafana - this.log.Info("Sending email") + /* + this.log.Info("Sending email") + cmd := &m.SendEmailCommand{ + Data: map[string]interface{}{}, + To: []string{}, + Info: "", + Massive: false, + Template: "", + } + + bus.Dispatch(cmd) + */ } type WebhookNotifier struct { Url string + Method string AuthUser string AuthPassword string log log.Logger } func (this *WebhookNotifier) Dispatch(alertResult *AlertResult) { - //bus.dispath to notification package in grafana this.log.Info("Sending webhook") + cmd := &m.SendWebhook{ + Url: this.Url, + Method: this.Method, + } + + bus.Dispatch(cmd) } type NotificationDispatcher interface { @@ -115,6 +131,7 @@ var createNotifier = func(notificationType string, settings *simplejson.Json) No return &WebhookNotifier{ Url: settings.Get("url").MustString(), + Method: settings.Get("method").MustString(), AuthUser: settings.Get("user").MustString(), AuthPassword: settings.Get("password").MustString(), log: log.New("alerting.notification.webhook"), diff --git a/pkg/services/notifications/notifications.go b/pkg/services/notifications/notifications.go index 63ce7219618..a22acbc2d36 100644 --- a/pkg/services/notifications/notifications.go +++ b/pkg/services/notifications/notifications.go @@ -23,11 +23,14 @@ var tmplWelcomeOnSignUp = "welcome_on_signup.html" func Init() error { initMailQueue() + initWebhookQueue() bus.AddHandler("email", sendResetPasswordEmail) bus.AddHandler("email", validateResetPasswordCode) bus.AddHandler("email", sendEmailCommandHandler) + bus.AddHandler("webhook", sendWebhook) + bus.AddEventListener(signUpStartedHandler) bus.AddEventListener(signUpCompletedHandler) @@ -53,6 +56,18 @@ func Init() error { return nil } +func sendWebhook(cmd *m.SendWebhook) error { + addToWebhookQueue(&Webhook{ + Url: cmd.Url, + AuthUser: cmd.AuthUser, + AuthPassword: cmd.AuthPassword, + Method: cmd.Method, + Body: cmd.Body, + }) + + return nil +} + func subjectTemplateFunc(obj map[string]interface{}, value string) string { obj["value"] = value return "" diff --git a/pkg/services/notifications/webhook.go b/pkg/services/notifications/webhook.go new file mode 100644 index 00000000000..7d591ddb26b --- /dev/null +++ b/pkg/services/notifications/webhook.go @@ -0,0 +1,62 @@ +package notifications + +import ( + "net/http" + "time" + + "github.com/grafana/grafana/pkg/log" +) + +type Webhook struct { + Url string + AuthUser string + AuthPassword string + Body string + Method string +} + +var webhookQueue chan *Webhook +var webhookLog log.Logger + +func initWebhookQueue() { + webhookLog = log.New("notifications.webhook") + webhookQueue = make(chan *Webhook, 10) + go processWebhookQueue() +} + +func processWebhookQueue() { + for { + select { + case webhook := <-webhookQueue: + err := sendWebRequest(webhook) + + if err != nil { + webhookLog.Error("Failed to send webrequest ") + } + } + } +} + +func sendWebRequest(webhook *Webhook) error { + webhookLog.Error("Sending stuff! ", "url", webhook.Url) + + client := http.Client{Timeout: time.Duration(3 * time.Second)} + + request, err := http.NewRequest(webhook.Method, webhook.Url, nil /*io.reader*/) + + if err != nil { + return err + } + + resp, err := client.Do(request) + if err != nil { + return err + } + defer resp.Body.Close() + + return nil +} + +var addToWebhookQueue = func(msg *Webhook) { + webhookQueue <- msg +}