feat(alerting): save execution error upon state changed
This commit is contained in:
+6
-9
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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},
|
||||
|
||||
Reference in New Issue
Block a user