فهرست منبع

Merge pull request #6467 from utkarshcmu/slack_mention

Added Slack mention feature
Carl Bergquist 9 سال پیش
والد
کامیت
8bc0462877

+ 5 - 2
pkg/services/alerting/notifiers/slack.go

@@ -23,11 +23,13 @@ func NewSlackNotifier(model *m.AlertNotification) (alerting.Notifier, error) {
 	}
 
 	recipient := model.Settings.Get("recipient").MustString()
+	mention := model.Settings.Get("mention").MustString()
 
 	return &SlackNotifier{
 		NotifierBase: NewNotifierBase(model.Id, model.IsDefault, model.Name, model.Type, model.Settings),
 		Url:          url,
 		Recipient:    recipient,
+		Mention:      mention,
 		log:          log.New("alerting.notifier.slack"),
 	}, nil
 }
@@ -36,6 +38,7 @@ type SlackNotifier struct {
 	NotifierBase
 	Url       string
 	Recipient string
+	Mention   string
 	log       log.Logger
 }
 
@@ -70,9 +73,9 @@ func (this *SlackNotifier) Notify(evalContext *alerting.EvalContext) error {
 		})
 	}
 
-	message := ""
+	message := this.Mention
 	if evalContext.Rule.State != m.AlertStateOK { //dont add message when going back to alert state ok.
-		message = evalContext.Rule.Message
+		message += " " + evalContext.Rule.Message
 	}
 
 	body := map[string]interface{}{

+ 81 - 0
pkg/services/alerting/notifiers/slack_test.go

@@ -0,0 +1,81 @@
+package notifiers
+
+import (
+	"testing"
+
+	"github.com/grafana/grafana/pkg/components/simplejson"
+	m "github.com/grafana/grafana/pkg/models"
+	. "github.com/smartystreets/goconvey/convey"
+)
+
+func TestSlackNotifier(t *testing.T) {
+	Convey("Slack notifier tests", t, func() {
+
+		Convey("Parsing alert notification from settings", func() {
+			Convey("empty settings should return error", func() {
+				json := `{ }`
+
+				settingsJSON, _ := simplejson.NewJson([]byte(json))
+				model := &m.AlertNotification{
+					Name:     "ops",
+					Type:     "slack",
+					Settings: settingsJSON,
+				}
+
+				_, err := NewSlackNotifier(model)
+				So(err, ShouldNotBeNil)
+			})
+
+			Convey("from settings", func() {
+				json := `
+				{
+          "url": "http://google.com"
+				}`
+
+				settingsJSON, _ := simplejson.NewJson([]byte(json))
+				model := &m.AlertNotification{
+					Name:     "ops",
+					Type:     "slack",
+					Settings: settingsJSON,
+				}
+
+				not, err := NewSlackNotifier(model)
+				slackNotifier := not.(*SlackNotifier)
+
+				So(err, ShouldBeNil)
+				So(slackNotifier.Name, ShouldEqual, "ops")
+				So(slackNotifier.Type, ShouldEqual, "slack")
+				So(slackNotifier.Url, ShouldEqual, "http://google.com")
+				So(slackNotifier.Recipient, ShouldEqual, "")
+				So(slackNotifier.Mention, ShouldEqual, "")
+			})
+
+			Convey("from settings with Recipient and Mention", func() {
+				json := `
+				{
+          "url": "http://google.com",
+          "recipient": "#ds-opentsdb",
+          "mention": "@carl"
+				}`
+
+				settingsJSON, _ := simplejson.NewJson([]byte(json))
+				model := &m.AlertNotification{
+					Name:     "ops",
+					Type:     "slack",
+					Settings: settingsJSON,
+				}
+
+				not, err := NewSlackNotifier(model)
+				slackNotifier := not.(*SlackNotifier)
+
+				So(err, ShouldBeNil)
+				So(slackNotifier.Name, ShouldEqual, "ops")
+				So(slackNotifier.Type, ShouldEqual, "slack")
+				So(slackNotifier.Url, ShouldEqual, "http://google.com")
+				So(slackNotifier.Recipient, ShouldEqual, "#ds-opentsdb")
+				So(slackNotifier.Mention, ShouldEqual, "@carl")
+			})
+
+		})
+	})
+}

+ 4 - 4
pkg/services/alerting/notifiers/webhook_test.go

@@ -40,12 +40,12 @@ func TestWebhookNotifier(t *testing.T) {
 				}
 
 				not, err := NewWebHookNotifier(model)
-				emailNotifier := not.(*WebhookNotifier)
+				webhookNotifier := not.(*WebhookNotifier)
 
 				So(err, ShouldBeNil)
-				So(emailNotifier.Name, ShouldEqual, "ops")
-				So(emailNotifier.Type, ShouldEqual, "email")
-				So(emailNotifier.Url, ShouldEqual, "http://google.com")
+				So(webhookNotifier.Name, ShouldEqual, "ops")
+				So(webhookNotifier.Type, ShouldEqual, "email")
+				So(webhookNotifier.Url, ShouldEqual, "http://google.com")
 			})
 		})
 	})

+ 11 - 0
public/app/features/alerting/partials/notification_edit.html

@@ -74,6 +74,17 @@
           Override default channel or user, use #channel-name or @username
         </info-popover>
       </div>
+      <div class="gf-form max-width-30">
+        <span class="gf-form-label width-6">Mention</span>
+        <input type="text"
+          class="gf-form-input max-width-30"
+          ng-model="ctrl.model.settings.mention"
+          data-placement="right">
+        </input>
+        <info-popover mode="right-absolute">
+          Mention a user or a group using @ when notifying in a channel
+        </info-popover>
+      </div>
     </div>
 
     <div class="gf-form-group section" ng-if="ctrl.model.type === 'email'">