Browse Source

feat(alerting): add alert message to slack integration

bergquist 9 years ago
parent
commit
16e75a3036

+ 1 - 1
pkg/api/alerting.go

@@ -47,7 +47,7 @@ func GetAlerts(c *middleware.Context) Response {
 			DashboardId: alert.DashboardId,
 			DashboardId: alert.DashboardId,
 			PanelId:     alert.PanelId,
 			PanelId:     alert.PanelId,
 			Name:        alert.Name,
 			Name:        alert.Name,
-			Description: alert.Description,
+			Message:     alert.Message,
 			State:       alert.State,
 			State:       alert.State,
 			Severity:    alert.Severity,
 			Severity:    alert.Severity,
 		})
 		})

+ 1 - 1
pkg/api/dtos/alerting.go

@@ -12,7 +12,7 @@ type AlertRule struct {
 	DashboardId int64               `json:"dashboardId"`
 	DashboardId int64               `json:"dashboardId"`
 	PanelId     int64               `json:"panelId"`
 	PanelId     int64               `json:"panelId"`
 	Name        string              `json:"name"`
 	Name        string              `json:"name"`
-	Description string              `json:"description"`
+	Message     string              `json:"message"`
 	State       m.AlertStateType    `json:"state"`
 	State       m.AlertStateType    `json:"state"`
 	Severity    m.AlertSeverityType `json:"severity"`
 	Severity    m.AlertSeverityType `json:"severity"`
 
 

+ 3 - 3
pkg/metrics/graphite_test.go

@@ -19,7 +19,7 @@ func TestGraphitePublisher(t *testing.T) {
 		So(err, ShouldBeNil)
 		So(err, ShouldBeNil)
 
 
 		sec, err := setting.Cfg.NewSection("metrics.graphite")
 		sec, err := setting.Cfg.NewSection("metrics.graphite")
-		sec.NewKey("prefix", "service.grafana.%(instance_name)s")
+		sec.NewKey("prefix", "service.grafana.%(instance_name)s.")
 		sec.NewKey("address", "localhost:2003")
 		sec.NewKey("address", "localhost:2003")
 
 
 		So(err, ShouldBeNil)
 		So(err, ShouldBeNil)
@@ -30,7 +30,7 @@ func TestGraphitePublisher(t *testing.T) {
 		So(err, ShouldBeNil)
 		So(err, ShouldBeNil)
 		So(publisher, ShouldNotBeNil)
 		So(publisher, ShouldNotBeNil)
 
 
-		So(publisher.prefix, ShouldEqual, "service.grafana.hostname_with_dots_com")
+		So(publisher.prefix, ShouldEqual, "service.grafana.hostname_with_dots_com.")
 	})
 	})
 
 
 	Convey("Test graphite publisher default values", t, func() {
 	Convey("Test graphite publisher default values", t, func() {
@@ -49,7 +49,7 @@ func TestGraphitePublisher(t *testing.T) {
 		So(err, ShouldBeNil)
 		So(err, ShouldBeNil)
 		So(publisher, ShouldNotBeNil)
 		So(publisher, ShouldNotBeNil)
 
 
-		So(publisher.prefix, ShouldEqual, "service.grafana.hostname_with_dots_com")
+		So(publisher.prefix, ShouldEqual, "service.grafana.hostname_with_dots_com.")
 		So(publisher.address, ShouldEqual, "localhost:2003")
 		So(publisher.address, ShouldEqual, "localhost:2003")
 	})
 	})
 }
 }

+ 2 - 2
pkg/models/alert.go

@@ -36,7 +36,7 @@ type Alert struct {
 	DashboardId int64
 	DashboardId int64
 	PanelId     int64
 	PanelId     int64
 	Name        string
 	Name        string
-	Description string
+	Message     string
 	Severity    AlertSeverityType
 	Severity    AlertSeverityType
 	State       AlertStateType
 	State       AlertStateType
 	Handler     int64
 	Handler     int64
@@ -63,7 +63,7 @@ func (alert *Alert) ShouldUpdateState(newState AlertStateType) bool {
 func (this *Alert) ContainsUpdates(other *Alert) bool {
 func (this *Alert) ContainsUpdates(other *Alert) bool {
 	result := false
 	result := false
 	result = result || this.Name != other.Name
 	result = result || this.Name != other.Name
-	result = result || this.Description != other.Description
+	result = result || this.Message != other.Message
 
 
 	if this.Settings != nil && other.Settings != nil {
 	if this.Settings != nil && other.Settings != nil {
 		json1, err1 := this.Settings.Encode()
 		json1, err1 := this.Settings.Encode()

+ 6 - 6
pkg/models/alert_test.go

@@ -14,15 +14,15 @@ func TestAlertingModelTest(t *testing.T) {
 		json2, _ := simplejson.NewJson([]byte(`{ "field": "value" }`))
 		json2, _ := simplejson.NewJson([]byte(`{ "field": "value" }`))
 
 
 		rule1 := &Alert{
 		rule1 := &Alert{
-			Settings:    json1,
-			Name:        "Namn",
-			Description: "Description",
+			Settings: json1,
+			Name:     "Namn",
+			Message:  "Message",
 		}
 		}
 
 
 		rule2 := &Alert{
 		rule2 := &Alert{
-			Settings:    json2,
-			Name:        "Namn",
-			Description: "Description",
+			Settings: json2,
+			Name:     "Namn",
+			Message:  "Message",
 		}
 		}
 
 
 		Convey("Testing AlertRule equals", func() {
 		Convey("Testing AlertRule equals", func() {

+ 1 - 1
pkg/services/alerting/extractor.go

@@ -88,7 +88,7 @@ func (e *DashAlertExtractor) GetAlerts() ([]*m.Alert, error) {
 				Name:        jsonAlert.Get("name").MustString(),
 				Name:        jsonAlert.Get("name").MustString(),
 				Handler:     jsonAlert.Get("handler").MustInt64(),
 				Handler:     jsonAlert.Get("handler").MustInt64(),
 				Enabled:     jsonAlert.Get("enabled").MustBool(),
 				Enabled:     jsonAlert.Get("enabled").MustBool(),
-				Description: jsonAlert.Get("description").MustString(),
+				Message:     jsonAlert.Get("message").MustString(),
 				Severity:    m.AlertSeverityType(jsonAlert.Get("severity").MustString()),
 				Severity:    m.AlertSeverityType(jsonAlert.Get("severity").MustString()),
 				Frequency:   getTimeDurationStringToSeconds(jsonAlert.Get("frequency").MustString()),
 				Frequency:   getTimeDurationStringToSeconds(jsonAlert.Get("frequency").MustString()),
 			}
 			}

+ 5 - 5
pkg/services/alerting/extractor_test.go

@@ -40,7 +40,7 @@ func TestAlertRuleExtraction(t *testing.T) {
             "datasource": null,
             "datasource": null,
             "alert": {
             "alert": {
               "name": "name1",
               "name": "name1",
-              "description": "desc1",
+              "message": "desc1",
               "handler": 1,
               "handler": 1,
               "enabled": true,
               "enabled": true,
               "frequency": "60s",
               "frequency": "60s",
@@ -65,7 +65,7 @@ func TestAlertRuleExtraction(t *testing.T) {
             "datasource": "graphite2",
             "datasource": "graphite2",
             "alert": {
             "alert": {
               "name": "name2",
               "name": "name2",
-              "description": "desc2",
+              "message": "desc2",
               "handler": 0,
               "handler": 0,
               "enabled": true,
               "enabled": true,
               "frequency": "60s",
               "frequency": "60s",
@@ -121,7 +121,7 @@ func TestAlertRuleExtraction(t *testing.T) {
 				for _, v := range alerts {
 				for _, v := range alerts {
 					So(v.DashboardId, ShouldEqual, 57)
 					So(v.DashboardId, ShouldEqual, 57)
 					So(v.Name, ShouldNotBeEmpty)
 					So(v.Name, ShouldNotBeEmpty)
-					So(v.Description, ShouldNotBeEmpty)
+					So(v.Message, ShouldNotBeEmpty)
 				}
 				}
 
 
 				Convey("should extract handler property", func() {
 				Convey("should extract handler property", func() {
@@ -146,9 +146,9 @@ func TestAlertRuleExtraction(t *testing.T) {
 
 
 				Convey("should extract name and desc", func() {
 				Convey("should extract name and desc", func() {
 					So(alerts[0].Name, ShouldEqual, "name1")
 					So(alerts[0].Name, ShouldEqual, "name1")
-					So(alerts[0].Description, ShouldEqual, "desc1")
+					So(alerts[0].Message, ShouldEqual, "desc1")
 					So(alerts[1].Name, ShouldEqual, "name2")
 					So(alerts[1].Name, ShouldEqual, "name2")
-					So(alerts[1].Description, ShouldEqual, "desc2")
+					So(alerts[1].Message, ShouldEqual, "desc2")
 				})
 				})
 
 
 				Convey("should set datasourceId", func() {
 				Convey("should set datasourceId", func() {

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

@@ -9,6 +9,7 @@ import (
 	"github.com/grafana/grafana/pkg/metrics"
 	"github.com/grafana/grafana/pkg/metrics"
 	m "github.com/grafana/grafana/pkg/models"
 	m "github.com/grafana/grafana/pkg/models"
 	"github.com/grafana/grafana/pkg/services/alerting"
 	"github.com/grafana/grafana/pkg/services/alerting"
+	"github.com/grafana/grafana/pkg/setting"
 )
 )
 
 
 func init() {
 func init() {
@@ -70,11 +71,11 @@ func (this *SlackNotifier) Notify(context *alerting.EvalContext) {
 				// "author_icon": "http://flickr.com/icons/bobby.jpg",
 				// "author_icon": "http://flickr.com/icons/bobby.jpg",
 				"title":      context.GetNotificationTitle(),
 				"title":      context.GetNotificationTitle(),
 				"title_link": ruleUrl,
 				"title_link": ruleUrl,
-				// "text":       "Optional text that appears within the attachment",
-				"fields":    fields,
-				"image_url": context.ImagePublicUrl,
+				"text":       context.Rule.Message,
+				"fields":     fields,
+				"image_url":  context.ImagePublicUrl,
 				// "thumb_url":   "http://example.com/path/to/thumb.png",
 				// "thumb_url":   "http://example.com/path/to/thumb.png",
-				"footer":      "Grafana v4.0.0",
+				"footer":      "Grafana v" + setting.BuildVersion,
 				"footer_icon": "http://grafana.org/assets/img/fav32.png",
 				"footer_icon": "http://grafana.org/assets/img/fav32.png",
 				"ts":          time.Now().Unix(),
 				"ts":          time.Now().Unix(),
 			},
 			},

+ 2 - 2
pkg/services/alerting/rule.go

@@ -17,7 +17,7 @@ type Rule struct {
 	PanelId       int64
 	PanelId       int64
 	Frequency     int64
 	Frequency     int64
 	Name          string
 	Name          string
-	Description   string
+	Message       string
 	State         m.AlertStateType
 	State         m.AlertStateType
 	Severity      m.AlertSeverityType
 	Severity      m.AlertSeverityType
 	Conditions    []Condition
 	Conditions    []Condition
@@ -63,7 +63,7 @@ func NewRuleFromDBAlert(ruleDef *m.Alert) (*Rule, error) {
 	model.DashboardId = ruleDef.DashboardId
 	model.DashboardId = ruleDef.DashboardId
 	model.PanelId = ruleDef.PanelId
 	model.PanelId = ruleDef.PanelId
 	model.Name = ruleDef.Name
 	model.Name = ruleDef.Name
-	model.Description = ruleDef.Description
+	model.Message = ruleDef.Message
 	model.Frequency = ruleDef.Frequency
 	model.Frequency = ruleDef.Frequency
 	model.Severity = ruleDef.Severity
 	model.Severity = ruleDef.Severity
 	model.State = ruleDef.State
 	model.State = ruleDef.State

+ 3 - 3
pkg/services/sqlstore/alert_test.go

@@ -20,7 +20,7 @@ func TestAlertingDataAccess(t *testing.T) {
 				DashboardId: testDash.Id,
 				DashboardId: testDash.Id,
 				OrgId:       testDash.OrgId,
 				OrgId:       testDash.OrgId,
 				Name:        "Alerting title",
 				Name:        "Alerting title",
-				Description: "Alerting description",
+				Message:     "Alerting message",
 				Settings:    simplejson.New(),
 				Settings:    simplejson.New(),
 				Frequency:   1,
 				Frequency:   1,
 			},
 			},
@@ -46,7 +46,7 @@ func TestAlertingDataAccess(t *testing.T) {
 			alert := alertQuery.Result[0]
 			alert := alertQuery.Result[0]
 			So(err2, ShouldBeNil)
 			So(err2, ShouldBeNil)
 			So(alert.Name, ShouldEqual, "Alerting title")
 			So(alert.Name, ShouldEqual, "Alerting title")
-			So(alert.Description, ShouldEqual, "Alerting description")
+			So(alert.Message, ShouldEqual, "Alerting message")
 			So(alert.State, ShouldEqual, "pending")
 			So(alert.State, ShouldEqual, "pending")
 			So(alert.Frequency, ShouldEqual, 1)
 			So(alert.Frequency, ShouldEqual, 1)
 		})
 		})
@@ -146,7 +146,7 @@ func TestAlertingDataAccess(t *testing.T) {
 					PanelId:     1,
 					PanelId:     1,
 					DashboardId: testDash.Id,
 					DashboardId: testDash.Id,
 					Name:        "Alerting title",
 					Name:        "Alerting title",
-					Description: "Alerting description",
+					Message:     "Alerting message",
 				},
 				},
 			}
 			}
 
 

+ 1 - 1
pkg/services/sqlstore/migrations/alert_mig.go

@@ -14,7 +14,7 @@ func addAlertMigrations(mg *Migrator) {
 			{Name: "panel_id", Type: DB_BigInt, Nullable: false},
 			{Name: "panel_id", Type: DB_BigInt, Nullable: false},
 			{Name: "org_id", Type: DB_BigInt, Nullable: false},
 			{Name: "org_id", Type: DB_BigInt, Nullable: false},
 			{Name: "name", Type: DB_NVarchar, Length: 255, Nullable: false},
 			{Name: "name", Type: DB_NVarchar, Length: 255, Nullable: false},
-			{Name: "description", Type: DB_Text, Nullable: false},
+			{Name: "message", Type: DB_Text, Nullable: false},
 			{Name: "state", Type: DB_NVarchar, Length: 255, Nullable: false},
 			{Name: "state", Type: DB_NVarchar, Length: 255, Nullable: false},
 			{Name: "settings", Type: DB_Text, Nullable: false},
 			{Name: "settings", Type: DB_Text, Nullable: false},
 			{Name: "frequency", Type: DB_BigInt, Nullable: false},
 			{Name: "frequency", Type: DB_BigInt, Nullable: false},

+ 0 - 1
public/app/features/alerting/alert_tab_ctrl.ts

@@ -111,7 +111,6 @@ export class AlertTabCtrl {
 
 
     var defaultName = this.panel.title + ' alert';
     var defaultName = this.panel.title + ' alert';
     alert.name = alert.name || defaultName;
     alert.name = alert.name || defaultName;
-    alert.description = alert.description || defaultName;
 
 
     this.conditionModels = _.reduce(alert.conditions, (memo, value) => {
     this.conditionModels = _.reduce(alert.conditions, (memo, value) => {
       memo.push(this.buildConditionModel(value));
       memo.push(this.buildConditionModel(value));