diff --git a/pkg/models/alert.go b/pkg/models/alert.go index d8e6c5fc899..8d7d338ca06 100644 --- a/pkg/models/alert.go +++ b/pkg/models/alert.go @@ -31,17 +31,22 @@ func (s AlertSeverityType) IsValid() bool { } type Alert struct { - Id int64 - OrgId int64 - DashboardId int64 - PanelId int64 - Name string - Message string - Severity AlertSeverityType - State AlertStateType - Handler int64 - Enabled bool - Frequency int64 + Id int64 + OrgId int64 + DashboardId int64 + PanelId int64 + Name string + Message string + Severity AlertSeverityType + State AlertStateType + Handler int64 + Paused bool + Silenced bool + ExecutionError string + Frequency int64 + + LastEvalData *simplejson.Json + LastEvalTime time.Time CreatedBy int64 UpdatedBy int64 diff --git a/pkg/services/alerting/conditions/query.go b/pkg/services/alerting/conditions/query.go index f76ccf608b0..19fd46db629 100644 --- a/pkg/services/alerting/conditions/query.go +++ b/pkg/services/alerting/conditions/query.go @@ -40,16 +40,16 @@ func (c *QueryCondition) Eval(context *alerting.EvalContext) { for _, series := range seriesList { reducedValue := c.Reducer.Reduce(series) - pass := c.Evaluator.Eval(series, reducedValue) + evalMatch := c.Evaluator.Eval(series, reducedValue) if context.IsTestRun { context.Logs = append(context.Logs, &alerting.ResultLogEntry{ - Message: fmt.Sprintf("Condition[%d]: Eval: %v, Metric: %s, Value: %1.3f", c.Index, pass, series.Name, reducedValue), + Message: fmt.Sprintf("Condition[%d]: Eval: %v, Metric: %s, Value: %1.3f", c.Index, evalMatch, series.Name, reducedValue), }) } - if pass { - context.Events = append(context.Events, &alerting.Event{ + if evalMatch { + context.EvalMatches = append(context.EvalMatches, &alerting.EvalMatch{ Metric: series.Name, Value: reducedValue, }) diff --git a/pkg/services/alerting/eval_context.go b/pkg/services/alerting/eval_context.go index 1c94f80842d..70dc6b17a2f 100644 --- a/pkg/services/alerting/eval_context.go +++ b/pkg/services/alerting/eval_context.go @@ -13,7 +13,7 @@ import ( type EvalContext struct { Firing bool IsTestRun bool - Events []*Event + EvalMatches []*EvalMatch Logs []*ResultLogEntry Error error Description string @@ -94,12 +94,12 @@ func (c *EvalContext) GetImageUrl() (string, error) { func NewEvalContext(rule *Rule) *EvalContext { return &EvalContext{ - StartTime: time.Now(), - Rule: rule, - Logs: make([]*ResultLogEntry, 0), - Events: make([]*Event, 0), - DoneChan: make(chan bool, 1), - CancelChan: make(chan bool, 1), - log: log.New("alerting.evalContext"), + StartTime: time.Now(), + Rule: rule, + Logs: make([]*ResultLogEntry, 0), + EvalMatches: make([]*EvalMatch, 0), + DoneChan: make(chan bool, 1), + CancelChan: make(chan bool, 1), + log: log.New("alerting.evalContext"), } } diff --git a/pkg/services/alerting/extractor.go b/pkg/services/alerting/extractor.go index a5704fd15bb..7d3b800fb31 100644 --- a/pkg/services/alerting/extractor.go +++ b/pkg/services/alerting/extractor.go @@ -87,7 +87,6 @@ func (e *DashAlertExtractor) GetAlerts() ([]*m.Alert, error) { Id: jsonAlert.Get("id").MustInt64(), Name: jsonAlert.Get("name").MustString(), Handler: jsonAlert.Get("handler").MustInt64(), - Enabled: jsonAlert.Get("enabled").MustBool(), Message: jsonAlert.Get("message").MustString(), Severity: m.AlertSeverityType(jsonAlert.Get("severity").MustString()), Frequency: getTimeDurationStringToSeconds(jsonAlert.Get("frequency").MustString()), diff --git a/pkg/services/alerting/models.go b/pkg/services/alerting/models.go index 7b90403667f..e11e1e1aaaf 100644 --- a/pkg/services/alerting/models.go +++ b/pkg/services/alerting/models.go @@ -12,10 +12,9 @@ type ResultLogEntry struct { Data interface{} } -type Event struct { +type EvalMatch struct { Value float64 Metric string - State string Tags map[string]string } diff --git a/pkg/services/alerting/notifiers/email.go b/pkg/services/alerting/notifiers/email.go index fb2af7fa47a..20b0bc06463 100644 --- a/pkg/services/alerting/notifiers/email.go +++ b/pkg/services/alerting/notifiers/email.go @@ -59,7 +59,7 @@ func (this *EmailNotifier) Notify(context *alerting.EvalContext) { "RuleUrl": ruleUrl, "ImageLink": context.ImagePublicUrl, "AlertPageUrl": setting.AppUrl + "alerting", - "Events": context.Events, + "EvalMatches": context.EvalMatches, }, To: this.Addresses, Template: "alert_notification.html", diff --git a/pkg/services/alerting/notifiers/slack.go b/pkg/services/alerting/notifiers/slack.go index c311840f488..d6335221b63 100644 --- a/pkg/services/alerting/notifiers/slack.go +++ b/pkg/services/alerting/notifiers/slack.go @@ -50,7 +50,7 @@ func (this *SlackNotifier) Notify(context *alerting.EvalContext) { fields := make([]map[string]interface{}, 0) fieldLimitCount := 4 - for index, evt := range context.Events { + for index, evt := range context.EvalMatches { fields = append(fields, map[string]interface{}{ "title": evt.Metric, "value": evt.Value, diff --git a/pkg/services/sqlstore/migrations/alert_mig.go b/pkg/services/sqlstore/migrations/alert_mig.go index fa54fe9ece0..336d290cb62 100644 --- a/pkg/services/sqlstore/migrations/alert_mig.go +++ b/pkg/services/sqlstore/migrations/alert_mig.go @@ -20,28 +20,30 @@ 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: "enabled", Type: DB_Bool, 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: "last_eval_data", Type: DB_Text, Nullable: false}, + {Name: "last_eval_time", Type: DB_DateTime, Nullable: false}, {Name: "created", Type: DB_DateTime, Nullable: false}, {Name: "updated", Type: DB_DateTime, Nullable: false}, {Name: "updated_by", Type: DB_BigInt, Nullable: false}, {Name: "created_by", Type: DB_BigInt, Nullable: false}, }, + Indices: []*Index{ + {Cols: []string{"org_id", "id"}, Type: IndexType}, + {Cols: []string{"state"}, Type: IndexType}, + {Cols: []string{"dashboard_id"}, Type: IndexType}, + }, } // create table mg.AddMigration("create alert table v1", NewAddTableMigration(alertV1)) - alert_heartbeat := Table{ - Name: "alert_heartbeat", - Columns: []*Column{ - {Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true}, - {Name: "server_id", Type: DB_NVarchar, Length: 50, Nullable: false}, - {Name: "created", Type: DB_DateTime, Nullable: false}, - {Name: "updated", Type: DB_DateTime, Nullable: false}, - }, - } - - mg.AddMigration("create alert_heartbeat table v1", NewAddTableMigration(alert_heartbeat)) + // create indices + mg.AddMigration("add index alert org_id & id ", NewAddIndexMigration(alertV1, alertV1.Indices[0])) + mg.AddMigration("add index alert state", NewAddIndexMigration(alertV1, alertV1.Indices[1])) + mg.AddMigration("add index alert dashboard_id", NewAddIndexMigration(alertV1, alertV1.Indices[2])) alert_notification := Table{ Name: "alert_notification", @@ -54,7 +56,12 @@ func addAlertMigrations(mg *Migrator) { {Name: "created", Type: DB_DateTime, Nullable: false}, {Name: "updated", Type: DB_DateTime, Nullable: false}, }, + Indices: []*Index{ + {Cols: []string{"org_id", "name"}, Type: UniqueIndex}, + }, } mg.AddMigration("create alert_notification table v1", NewAddTableMigration(alert_notification)) + + mg.AddMigration("add index alert_notification org_id & name", NewAddIndexMigration(alert_notification, alert_notification.Indices[0])) } diff --git a/pkg/services/sqlstore/migrations/heartbeat_mig.go b/pkg/services/sqlstore/migrations/heartbeat_mig.go new file mode 100644 index 00000000000..e0ee7a5f88f --- /dev/null +++ b/pkg/services/sqlstore/migrations/heartbeat_mig.go @@ -0,0 +1,18 @@ +package migrations + +// // create table +// mg.AddMigration("create alert table v1", NewAddTableMigration(alertV1)) +// +// alert_heartbeat := Table{ +// Name: "alert_heartbeat", +// Columns: []*Column{ +// {Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true}, +// {Name: "server_id", Type: DB_NVarchar, Length: 50, Nullable: false}, +// {Name: "created", Type: DB_DateTime, Nullable: false}, +// {Name: "updated", Type: DB_DateTime, Nullable: false}, +// }, +// } +// +// mg.AddMigration("create alert_heartbeat table v1", NewAddTableMigration(alert_heartbeat)) +// +//