Просмотр исходного кода

feat(alerting): adds sql layer for saving execution errors

bergquist 9 лет назад
Родитель
Сommit
9915f15ed0

+ 5 - 0
pkg/models/alert.go

@@ -122,6 +122,11 @@ type DeleteAlertCommand struct {
 	AlertId int64
 }
 
+type SaveExecutionErrorCommand struct {
+	AlertId        int64
+	ExecutionError string
+}
+
 //Queries
 type GetAlertsQuery struct {
 	OrgId       int64

+ 9 - 9
pkg/services/alerting/notifiers/slack.go

@@ -64,20 +64,20 @@ func (this *SlackNotifier) Notify(context *alerting.EvalContext) {
 	body := map[string]interface{}{
 		"attachments": []map[string]interface{}{
 			{
-				"color": context.GetColor(),
+				"color":       context.GetColor(),
+				"title":       context.GetNotificationTitle(),
+				"title_link":  ruleUrl,
+				"text":        context.Rule.Message,
+				"fields":      fields,
+				"image_url":   context.ImagePublicUrl,
+				"footer":      "Grafana v" + setting.BuildVersion,
+				"footer_icon": "http://grafana.org/assets/img/fav32.png",
+				"ts":          time.Now().Unix(),
 				//"pretext":     "Optional text that appears above the attachment block",
 				// "author_name": "Bobby Tables",
 				// "author_link": "http://flickr.com/bobby/",
 				// "author_icon": "http://flickr.com/icons/bobby.jpg",
-				"title":      context.GetNotificationTitle(),
-				"title_link": ruleUrl,
-				"text":       context.Rule.Message,
-				"fields":     fields,
-				"image_url":  context.ImagePublicUrl,
 				// "thumb_url":   "http://example.com/path/to/thumb.png",
-				"footer":      "Grafana v" + setting.BuildVersion,
-				"footer_icon": "http://grafana.org/assets/img/fav32.png",
-				"ts":          time.Now().Unix(),
 			},
 		},
 	}

+ 18 - 0
pkg/services/sqlstore/alert.go

@@ -18,6 +18,24 @@ func init() {
 	bus.AddHandler("sql", DeleteAlertById)
 	bus.AddHandler("sql", GetAllAlertQueryHandler)
 	bus.AddHandler("sql", SetAlertState)
+	bus.AddHandler("sql", SaveExecutionErrorForAlert)
+}
+
+func SaveExecutionErrorForAlert(cmd *m.SaveExecutionErrorCommand) error {
+	return inTransaction(func(sess *xorm.Session) error {
+		alert := m.Alert{}
+
+		if has, err := sess.Id(cmd.AlertId).Get(&alert); err != nil {
+			return err
+		} else if !has {
+			return fmt.Errorf("Could not find alert")
+		}
+
+		alert.ExecutionError = cmd.ExecutionError
+
+		sess.Id(alert.Id).Update(&alert)
+		return nil
+	})
 }
 
 func GetAlertById(query *m.GetAlertByIdQuery) error {

+ 34 - 0
pkg/services/sqlstore/alert_test.go

@@ -175,5 +175,39 @@ func TestAlertingDataAccess(t *testing.T) {
 				So(len(query.Result), ShouldEqual, 0)
 			})
 		})
+
+		Convey("Can set new execution error", func() {
+			items := []*m.Alert{
+				{
+					PanelId:     1,
+					DashboardId: testDash.Id,
+					Name:        "Alerting title",
+					Message:     "Alerting message",
+				},
+			}
+
+			cmd := m.SaveAlertsCommand{
+				Alerts:      items,
+				DashboardId: testDash.Id,
+				OrgId:       1,
+				UserId:      1,
+			}
+
+			SaveAlerts(&cmd)
+
+			So(SaveExecutionErrorForAlert(&m.SaveExecutionErrorCommand{
+				AlertId:        1,
+				ExecutionError: "the slacker is broken",
+			}), ShouldBeNil)
+
+			Convey("Alerts should be removed", func() {
+				query := &m.GetAlertByIdQuery{Id: 1}
+				err2 := GetAlertById(query)
+
+				So(testDash.Id, ShouldEqual, 1)
+				So(err2, ShouldBeNil)
+				So(query.Result.ExecutionError, ShouldEqual, "the slacker is broken")
+			})
+		})
 	})
 }