Pārlūkot izejas kodu

feat(webhook): add httpmethod to webhook

closes #6255
bergquist 9 gadi atpakaļ
vecāks
revīzija
d1eceedf55

+ 10 - 8
pkg/models/notifications.go

@@ -17,17 +17,19 @@ type SendEmailCommandSync struct {
 }
 
 type SendWebhook struct {
-	Url      string
-	User     string
-	Password string
-	Body     string
+	Url        string
+	User       string
+	Password   string
+	Body       string
+	HttpMethod string
 }
 
 type SendWebhookSync struct {
-	Url      string
-	User     string
-	Password string
-	Body     string
+	Url        string
+	User       string
+	Password   string
+	Body       string
+	HttpMethod string
 }
 
 type SendResetPasswordEmailCommand struct {

+ 11 - 8
pkg/services/alerting/notifiers/webhook.go

@@ -24,16 +24,18 @@ func NewWebHookNotifier(model *m.AlertNotification) (alerting.Notifier, error) {
 		Url:          url,
 		User:         model.Settings.Get("user").MustString(),
 		Password:     model.Settings.Get("password").MustString(),
+		HttpMethod:   model.Settings.Get("httpMethod").MustString("POST"),
 		log:          log.New("alerting.notifier.webhook"),
 	}, nil
 }
 
 type WebhookNotifier struct {
 	NotifierBase
-	Url      string
-	User     string
-	Password string
-	log      log.Logger
+	Url        string
+	User       string
+	Password   string
+	HttpMethod string
+	log        log.Logger
 }
 
 func (this *WebhookNotifier) Notify(evalContext *alerting.EvalContext) error {
@@ -59,10 +61,11 @@ func (this *WebhookNotifier) Notify(evalContext *alerting.EvalContext) error {
 	body, _ := bodyJSON.MarshalJSON()
 
 	cmd := &m.SendWebhookSync{
-		Url:      this.Url,
-		User:     this.User,
-		Password: this.Password,
-		Body:     string(body),
+		Url:        this.Url,
+		User:       this.User,
+		Password:   this.Password,
+		Body:       string(body),
+		HttpMethod: this.HttpMethod,
 	}
 
 	if err := bus.DispatchCtx(evalContext.Ctx, cmd); err != nil {

+ 10 - 8
pkg/services/notifications/notifications.go

@@ -61,19 +61,21 @@ func Init() error {
 
 func SendWebhookSync(ctx context.Context, cmd *m.SendWebhookSync) error {
 	return sendWebRequestSync(ctx, &Webhook{
-		Url:      cmd.Url,
-		User:     cmd.User,
-		Password: cmd.Password,
-		Body:     cmd.Body,
+		Url:        cmd.Url,
+		User:       cmd.User,
+		Password:   cmd.Password,
+		Body:       cmd.Body,
+		HttpMethod: cmd.HttpMethod,
 	})
 }
 
 func sendWebhook(cmd *m.SendWebhook) error {
 	addToWebhookQueue(&Webhook{
-		Url:      cmd.Url,
-		User:     cmd.User,
-		Password: cmd.Password,
-		Body:     cmd.Body,
+		Url:        cmd.Url,
+		User:       cmd.User,
+		Password:   cmd.Password,
+		Body:       cmd.Body,
+		HttpMethod: cmd.HttpMethod,
 	})
 
 	return nil

+ 11 - 6
pkg/services/notifications/webhook.go

@@ -15,10 +15,11 @@ import (
 )
 
 type Webhook struct {
-	Url      string
-	User     string
-	Password string
-	Body     string
+	Url        string
+	User       string
+	Password   string
+	Body       string
+	HttpMethod string
 }
 
 var webhookQueue chan *Webhook
@@ -44,13 +45,17 @@ func processWebhookQueue() {
 }
 
 func sendWebRequestSync(ctx context.Context, webhook *Webhook) error {
-	webhookLog.Debug("Sending webhook", "url", webhook.Url)
+	webhookLog.Debug("Sending webhook", "url", webhook.Url, "http method", webhook.HttpMethod)
 
 	client := &http.Client{
 		Timeout: time.Duration(10 * time.Second),
 	}
 
-	request, err := http.NewRequest(http.MethodPost, webhook.Url, bytes.NewReader([]byte(webhook.Body)))
+	if webhook.HttpMethod == "" {
+		webhook.HttpMethod = http.MethodPost
+	}
+
+	request, err := http.NewRequest(webhook.HttpMethod, webhook.Url, bytes.NewReader([]byte(webhook.Body)))
 	if webhook.User != "" && webhook.Password != "" {
 		request.Header.Add("Authorization", util.GetBasicAuthHeader(webhook.User, webhook.Password))
 	}

+ 1 - 1
public/app/features/alerting/notification_edit_ctrl.ts

@@ -18,7 +18,7 @@ export class AlertNotificationEditCtrl {
       this.model = {
         type: 'email',
         settings: {
-          severityFilter: 'none'
+          httpMethod: 'POST'
         },
         isDefault: false
       };

+ 14 - 9
public/app/features/alerting/partials/notification_edit.html

@@ -32,19 +32,24 @@
     <div class="gf-form-group" ng-if="ctrl.model.type === 'webhook'">
       <h3 class="page-heading">Webhook settings</h3>
       <div class="gf-form">
-        <span class="gf-form-label width-6">Url</span>
+        <span class="gf-form-label width-10">Url</span>
         <input type="text" required class="gf-form-input max-width-26" ng-model="ctrl.model.settings.url"></input>
       </div>
-      <div class="gf-form-inline">
-        <div class="gf-form">
-          <span class="gf-form-label width-6">Username</span>
-          <input type="text" class="gf-form-input max-width-10" ng-model="ctrl.model.settings.username"></input>
-        </div>
-        <div class="gf-form">
-          <span class="gf-form-label width-6">Password</span>
-          <input type="text" class="gf-form-input max-width-10" ng-model="ctrl.model.settings.password"></input>
+      <div class="gf-form">
+        <span class="gf-form-label width-10">Http Method</span>
+        <div class="gf-form-select-wrapper width-14">
+          <select class="gf-form-input" ng-model="ctrl.model.settings.httpMethod" ng-options="t for t in ['POST', 'PUT']">
+          </select>
         </div>
       </div>
+      <div class="gf-form">
+        <span class="gf-form-label width-10">Username</span>
+        <input type="text" class="gf-form-input max-width-14" ng-model="ctrl.model.settings.username"></input>
+      </div>
+      <div class="gf-form">
+        <span class="gf-form-label width-10">Password</span>
+        <input type="text" class="gf-form-input max-width-14" ng-model="ctrl.model.settings.password"></input>
+      </div>
     </div>
 
     <div class="gf-form-group" ng-if="ctrl.model.type === 'slack'">