瀏覽代碼

feat(alerting): skeleton commit for webhook

bergquist 9 年之前
父節點
當前提交
efea3bc9cb

+ 8 - 0
pkg/models/emails.go → 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
 }

+ 2 - 1
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!")
 	}

+ 20 - 3
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"),

+ 15 - 0
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 ""

+ 62 - 0
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
+}