feat(alerting): save execution error upon state changed

This commit is contained in:
bergquist
2016-08-17 09:27:29 +02:00
parent 9915f15ed0
commit 6497b307c4
5 changed files with 11 additions and 63 deletions
+6 -9
View File
@@ -10,9 +10,11 @@ type AlertStateType string
type AlertSeverityType string
const (
AlertStatePending AlertStateType = "pending"
AlertStateFiring AlertStateType = "firing"
AlertStateOK AlertStateType = "ok"
AlertStatePending AlertStateType = "pending"
AlertStateExeuctionError AlertStateType = "exeuction_error"
AlertStatePaused AlertStateType = "paused"
AlertStateFiring AlertStateType = "firing"
AlertStateOK AlertStateType = "ok"
)
func (s AlertStateType) IsValid() bool {
@@ -41,7 +43,6 @@ type Alert struct {
Severity AlertSeverityType
State AlertStateType
Handler int64
Paused bool
Silenced bool
ExecutionError string
Frequency int64
@@ -115,6 +116,7 @@ type SetAlertStateCommand struct {
AlertId int64
OrgId int64
State AlertStateType
Error string
Timestamp time.Time
}
@@ -122,11 +124,6 @@ type DeleteAlertCommand struct {
AlertId int64
}
type SaveExecutionErrorCommand struct {
AlertId int64
ExecutionError string
}
//Queries
type GetAlertsQuery struct {
OrgId int64
+4 -1
View File
@@ -29,9 +29,11 @@ func NewResultHandler() *DefaultResultHandler {
func (handler *DefaultResultHandler) Handle(ctx *EvalContext) {
oldState := ctx.Rule.State
exeuctionError := ""
if ctx.Error != nil {
handler.log.Error("Alert Rule Result Error", "ruleId", ctx.Rule.Id, "error", ctx.Error)
ctx.Rule.State = m.AlertStatePending
ctx.Rule.State = m.AlertStateExeuctionError
exeuctionError = ctx.Error.Error()
} else if ctx.Firing {
ctx.Rule.State = m.AlertStateFiring
} else {
@@ -47,6 +49,7 @@ func (handler *DefaultResultHandler) Handle(ctx *EvalContext) {
AlertId: ctx.Rule.Id,
OrgId: ctx.Rule.OrgId,
State: ctx.Rule.State,
Error: exeuctionError,
}
if err := bus.Dispatch(cmd); err != nil {
+1 -18
View File
@@ -18,24 +18,6 @@ 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 {
@@ -241,6 +223,7 @@ func SetAlertState(cmd *m.SetAlertStateCommand) error {
alert.State = cmd.State
alert.StateChanges += 1
alert.NewStateDate = time.Now()
alert.ExecutionError = cmd.Error
sess.Id(alert.Id).Update(&alert)
return nil
-34
View File
@@ -175,39 +175,5 @@ 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")
})
})
})
}
@@ -21,7 +21,6 @@ func addAlertMigrations(mg *Migrator) {
{Name: "frequency", Type: DB_BigInt, Nullable: false},
{Name: "handler", Type: DB_BigInt, Nullable: false},
{Name: "severity", Type: DB_Text, Nullable: false},
{Name: "paused", Type: DB_Bool, Nullable: false},
{Name: "silenced", Type: DB_Bool, Nullable: false},
{Name: "execution_error", Type: DB_Text, Nullable: false},
{Name: "eval_data", Type: DB_Text, Nullable: true},