From 382f396247b47a66ae10d718e99f1f3fe9673d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Sat, 11 Jun 2016 10:54:24 +0200 Subject: [PATCH] feat(alerting): more model changes --- pkg/services/alerting/commands.go | 10 +-- pkg/services/alerting/extractor.go | 46 ++++++------ pkg/services/alerting/extractor_test.go | 8 +-- pkg/services/sqlstore/alert.go | 19 +++-- pkg/services/sqlstore/alert_rule_changes.go | 4 +- pkg/services/sqlstore/migrations/alert_mig.go | 8 +-- pkg/services/sqlstore/migrator/migrator.go | 2 +- .../app/plugins/panel/graph/alert_tab_ctrl.ts | 72 +++++++++---------- .../panel/graph/partials/tab_alerting.html | 26 +++---- 9 files changed, 97 insertions(+), 98 deletions(-) diff --git a/pkg/services/alerting/commands.go b/pkg/services/alerting/commands.go index f7db18c05ce..38ee4ecf99c 100644 --- a/pkg/services/alerting/commands.go +++ b/pkg/services/alerting/commands.go @@ -18,20 +18,20 @@ func init() { } func updateDashboardAlerts(cmd *UpdateDashboardAlertsCommand) error { - saveRulesCmd := m.SaveAlertsCommand{ + saveAlerts := m.SaveAlertsCommand{ OrgId: cmd.OrgId, UserId: cmd.UserId, } - extractor := NewAlertRuleExtractor(cmd.Dashboard, cmd.OrgId) + extractor := NewDashAlertExtractor(cmd.Dashboard, cmd.OrgId) - rules, err := extractor.GetRuleModels() + alerts, err := extractor.GetRuleModels() if err != nil { return err } - saveRulesCmd.Alerts = rules - if bus.Dispatch(&saveRulesCmd); err != nil { + saveAlerts.Alerts = alerts + if bus.Dispatch(&saveAlerts); err != nil { return err } diff --git a/pkg/services/alerting/extractor.go b/pkg/services/alerting/extractor.go index e15fb4af09e..b7b3b17811e 100644 --- a/pkg/services/alerting/extractor.go +++ b/pkg/services/alerting/extractor.go @@ -9,21 +9,21 @@ import ( m "github.com/grafana/grafana/pkg/models" ) -type AlertRuleExtractor struct { +type DashAlertExtractor struct { Dash *m.Dashboard OrgId int64 log log.Logger } -func NewAlertRuleExtractor(dash *m.Dashboard, orgId int64) *AlertRuleExtractor { - return &AlertRuleExtractor{ +func NewDashAlertExtractor(dash *m.Dashboard, orgId int64) *DashAlertExtractor { + return &DashAlertExtractor{ Dash: dash, OrgId: orgId, log: log.New("alerting.extractor"), } } -func (e *AlertRuleExtractor) lookupDatasourceId(dsName string) (int64, error) { +func (e *DashAlertExtractor) lookupDatasourceId(dsName string) (int64, error) { if dsName == "" { query := &m.GetDataSourcesQuery{OrgId: e.OrgId} if err := bus.Dispatch(query); err != nil { @@ -47,36 +47,36 @@ func (e *AlertRuleExtractor) lookupDatasourceId(dsName string) (int64, error) { return 0, errors.New("Could not find datasource id for " + dsName) } -func (e *AlertRuleExtractor) GetRuleModels() (m.AlertRules, error) { +func (e *DashAlertExtractor) GetRuleModels() ([]*m.Alert, error) { - rules := make(m.AlertRules, 0) + alerts := make([]*m.Alert, 0) for _, rowObj := range e.Dash.Data.Get("rows").MustArray() { row := simplejson.NewFromAny(rowObj) for _, panelObj := range row.Get("panels").MustArray() { panel := simplejson.NewFromAny(panelObj) - jsonRule := panel.Get("alerting") + jsonAlert := panel.Get("alert") // check if marked for deletion - deleted := jsonRule.Get("deleted").MustBool() + deleted := jsonAlert.Get("deleted").MustBool() if deleted { e.log.Info("Deleted alert rule found") continue } - ruleModel := &m.Alert{ + alert := &m.Alert{ DashboardId: e.Dash.Id, OrgId: e.OrgId, PanelId: panel.Get("id").MustInt64(), - Id: jsonRule.Get("id").MustInt64(), - Name: jsonRule.Get("name").MustString(), - Scheduler: jsonRule.Get("scheduler").MustInt64(), - Enabled: jsonRule.Get("enabled").MustBool(), - Description: jsonRule.Get("description").MustString(), + Id: jsonAlert.Get("id").MustInt64(), + Name: jsonAlert.Get("name").MustString(), + Scheduler: jsonAlert.Get("scheduler").MustInt64(), + Enabled: jsonAlert.Get("enabled").MustBool(), + Description: jsonAlert.Get("description").MustString(), } - valueQuery := jsonRule.Get("query") + valueQuery := jsonAlert.Get("query") valueQueryRef := valueQuery.Get("refId").MustString() for _, targetsObj := range panel.Get("targets").MustArray() { target := simplejson.NewFromAny(targetsObj) @@ -97,24 +97,24 @@ func (e *AlertRuleExtractor) GetRuleModels() (m.AlertRules, error) { targetQuery := target.Get("target").MustString() if targetQuery != "" { - jsonRule.SetPath([]string{"query", "query"}, targetQuery) + jsonAlert.SetPath([]string{"query", "query"}, targetQuery) } } } - ruleModel.Expression = jsonRule + alert.Expression = jsonAlert // validate - _, err := NewAlertRuleFromDBModel(ruleModel) - if err == nil && ruleModel.ValidToSave() { - rules = append(rules, ruleModel) + _, err := NewAlertRuleFromDBModel(alert) + if err == nil && alert.ValidToSave() { + alerts = append(alerts, alert) } else { - e.log.Error("Failed to extract alert rules from dashboard", "error", err) - return nil, errors.New("Failed to extract alert rules from dashboard") + e.log.Error("Failed to extract alerts from dashboard", "error", err) + return nil, errors.New("Failed to extract alerts from dashboard") } } } - return rules, nil + return alerts, nil } diff --git a/pkg/services/alerting/extractor_test.go b/pkg/services/alerting/extractor_test.go index 2f40c7e401c..069489dfb23 100644 --- a/pkg/services/alerting/extractor_test.go +++ b/pkg/services/alerting/extractor_test.go @@ -36,7 +36,7 @@ func TestAlertRuleExtraction(t *testing.T) { } ], "datasource": null, - "alerting": { + "alert": { "name": "name1", "description": "desc1", "scheduler": 1, @@ -71,7 +71,7 @@ func TestAlertRuleExtraction(t *testing.T) { } ], "datasource": "graphite2", - "alerting": { + "alert": { "name": "name2", "description": "desc2", "scheduler": 0, @@ -150,7 +150,7 @@ func TestAlertRuleExtraction(t *testing.T) { "title": "Broken influxdb panel", "transform": "table", "type": "table", - "alerting": { + "alert": { "deleted": true } } @@ -164,7 +164,7 @@ func TestAlertRuleExtraction(t *testing.T) { So(err, ShouldBeNil) dash := m.NewDashboardFromJson(dashJson) - extractor := NewAlertRuleExtractor(dash, 1) + extractor := NewDashAlertExtractor(dash, 1) // mock data defaultDs := &m.DataSource{Id: 12, OrgId: 2, Name: "I am default", IsDefault: true} diff --git a/pkg/services/sqlstore/alert.go b/pkg/services/sqlstore/alert.go index 93709988536..e7166c18932 100644 --- a/pkg/services/sqlstore/alert.go +++ b/pkg/services/sqlstore/alert.go @@ -79,7 +79,7 @@ func GetAlertById(query *m.GetAlertByIdQuery) error { func GetAllAlertQueryHandler(query *m.GetAllAlertsQuery) error { var alerts []*m.Alert - err := x.Sql("select * from alert_rule").Find(&alerts) + err := x.Sql("select * from alert").Find(&alerts) if err != nil { return err } @@ -90,7 +90,7 @@ func GetAllAlertQueryHandler(query *m.GetAllAlertsQuery) error { func DeleteAlertById(cmd *m.DeleteAlertCommand) error { return inTransaction(func(sess *xorm.Session) error { - if _, err := sess.Exec("DELETE FROM alert_rule WHERE id = ?", cmd.AlertId); err != nil { + if _, err := sess.Exec("DELETE FROM alert WHERE id = ?", cmd.AlertId); err != nil { return err } @@ -103,7 +103,7 @@ func HandleAlertsQuery(query *m.GetAlertsQuery) error { params := make([]interface{}, 0) sql.WriteString(`SELECT * - from alert_rule + from alert `) sql.WriteString(`WHERE org_id = ?`) @@ -141,15 +141,17 @@ func HandleAlertsQuery(query *m.GetAlertsQuery) error { } func DeleteAlertDefinition(dashboardId int64, sess *xorm.Session) error { - alerts := make(m.Alerts, 0) + alerts := make([]*m.Alert, 0) sess.Where("dashboard_id = ?", dashboardId).Find(&alerts) for _, alert := range alerts { - _, err := sess.Exec("DELETE FROM alert_rule WHERE id = ? ", alert.Id) + _, err := sess.Exec("DELETE FROM alert WHERE id = ? ", alert.Id) if err != nil { return err } + sqlog.Debug("Alert deleted (due to dashboard deletion)", "name", alert.Name, "id", alert.Id) + if err := SaveAlertChange("DELETED", alert, sess); err != nil { return err } @@ -194,6 +196,7 @@ func upsertAlerts(alerts []*m.Alert, posted []*m.Alert, sess *xorm.Session) erro return err } + sqlog.Debug("Alert updated", "name", alert.Name, "id", alert.Id) SaveAlertChange("UPDATED", alert, sess) } @@ -205,6 +208,8 @@ func upsertAlerts(alerts []*m.Alert, posted []*m.Alert, sess *xorm.Session) erro if err != nil { return err } + + sqlog.Debug("Alert inserted", "name", alert.Name, "id", alert.Id) SaveAlertChange("CREATED", alert, sess) } } @@ -223,11 +228,13 @@ func deleteMissingAlerts(alerts []*m.Alert, posted []*m.Alert, sess *xorm.Sessio } if missing { - _, err := sess.Exec("DELETE FROM alert_rule WHERE id = ?", missingAlert.Id) + _, err := sess.Exec("DELETE FROM alert WHERE id = ?", missingAlert.Id) if err != nil { return err } + sqlog.Debug("Alert deleted", "name", missingAlert.Name, "id", missingAlert.Id) + err = SaveAlertChange("DELETED", missingAlert, sess) if err != nil { return err diff --git a/pkg/services/sqlstore/alert_rule_changes.go b/pkg/services/sqlstore/alert_rule_changes.go index b250f9bb641..cb5fe83cab0 100644 --- a/pkg/services/sqlstore/alert_rule_changes.go +++ b/pkg/services/sqlstore/alert_rule_changes.go @@ -39,7 +39,7 @@ func GetAlertRuleChanges(query *m.GetAlertChangesQuery) error { params = append(params, query.Limit) } - alertChanges := make([]*m.AlertRuleChange, 0) + alertChanges := make([]*m.AlertChange, 0) if err := x.Sql(sql.String(), params...).Find(&alertChanges); err != nil { return err } @@ -49,7 +49,7 @@ func GetAlertRuleChanges(query *m.GetAlertChangesQuery) error { } func SaveAlertChange(change string, alert *m.Alert, sess *xorm.Session) error { - _, err := sess.Insert(&m.AlertRuleChange{ + _, err := sess.Insert(&m.AlertChange{ OrgId: alert.OrgId, Type: change, Created: time.Now(), diff --git a/pkg/services/sqlstore/migrations/alert_mig.go b/pkg/services/sqlstore/migrations/alert_mig.go index 855bd92b568..6d2dc489413 100644 --- a/pkg/services/sqlstore/migrations/alert_mig.go +++ b/pkg/services/sqlstore/migrations/alert_mig.go @@ -7,7 +7,7 @@ import ( func addAlertMigrations(mg *Migrator) { alertV1 := Table{ - Name: "alert_rule", + Name: "alert", Columns: []*Column{ {Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true}, {Name: "dashboard_id", Type: DB_BigInt, Nullable: false}, @@ -26,10 +26,10 @@ func addAlertMigrations(mg *Migrator) { } // create table - mg.AddMigration("create alert_rule table v2", NewAddTableMigration(alertV1)) + mg.AddMigration("create alert table v1", NewAddTableMigration(alertV1)) alert_changes := Table{ - Name: "alert_rule_change", + Name: "alert_change", Columns: []*Column{ {Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true}, {Name: "alert_id", Type: DB_BigInt, Nullable: false}, @@ -39,7 +39,7 @@ func addAlertMigrations(mg *Migrator) { }, } - mg.AddMigration("create alert_rules_updates table v1", NewAddTableMigration(alert_changes)) + mg.AddMigration("create alert_change table v1", NewAddTableMigration(alert_changes)) alert_state_log := Table{ Name: "alert_state", diff --git a/pkg/services/sqlstore/migrator/migrator.go b/pkg/services/sqlstore/migrator/migrator.go index 399a87273d5..e704826bed3 100644 --- a/pkg/services/sqlstore/migrator/migrator.go +++ b/pkg/services/sqlstore/migrator/migrator.go @@ -107,7 +107,7 @@ func (mg *Migrator) Start() error { } func (mg *Migrator) exec(m Migration) error { - log.Info("Executing migration", "id", m.Id()) + mg.Logger.Info("Executing migration", "id", m.Id()) err := mg.inTransaction(func(sess *xorm.Session) error { diff --git a/public/app/plugins/panel/graph/alert_tab_ctrl.ts b/public/app/plugins/panel/graph/alert_tab_ctrl.ts index 970e60d6d61..3f83e6db38e 100644 --- a/public/app/plugins/panel/graph/alert_tab_ctrl.ts +++ b/public/app/plugins/panel/graph/alert_tab_ctrl.ts @@ -22,7 +22,6 @@ var alertQueryDef = new QueryPartDef({ export class AlertTabCtrl { panel: any; panelCtrl: any; - alerting: any; metricTargets = [{ refId: '- select query -' } ]; schedulers = [{text: 'Grafana', value: 1}, {text: 'External', value: 0}]; transforms = [ @@ -36,7 +35,7 @@ export class AlertTabCtrl { }, ]; aggregators = ['avg', 'sum', 'min', 'max', 'last']; - rule: any; + alert: any; query: any; queryParams: any; transformDef: any; @@ -71,33 +70,37 @@ export class AlertTabCtrl { $scope.ctrl = this; this.metricTargets = this.panel.targets.map(val => val); - this.rule = this.panel.alerting = this.panel.alerting || {}; + + this.initAlertModel(); + } + + initAlertModel() { + this.alert = this.panel.alert = this.panel.alert || {}; // set defaults - _.defaults(this.rule, this.defaultValues); + _.defaults(this.alert, this.defaultValues); var defaultName = (this.panelCtrl.dashboard.title + ' ' + this.panel.title + ' alert'); - this.rule.name = this.rule.name || defaultName; - this.rule.description = this.rule.description || defaultName; - this.rule.queryRef = this.panel.alerting.queryRef || this.metricTargets[0].refId; + this.alert.name = this.alert.name || defaultName; + this.alert.description = this.alert.description || defaultName; // great temp working model this.queryParams = { params: [ - this.rule.query.refId, - this.rule.query.from, - this.rule.query.to + this.alert.query.refId, + this.alert.query.from, + this.alert.query.to ] }; // init the query part components model this.query = new QueryPart(this.queryParams, alertQueryDef); this.convertThresholdsToAlertThresholds(); - this.transformDef = _.findWhere(this.transforms, {type: this.rule.transform.type}); + this.transformDef = _.findWhere(this.transforms, {type: this.alert.transform.type}); } queryUpdated() { - this.rule.query = { + this.alert.query = { refId: this.query.params[0], from: this.query.params[1], to: this.query.params[2], @@ -106,16 +109,16 @@ export class AlertTabCtrl { transformChanged() { // clear model - this.rule.transform = {type: this.rule.transform.type}; - this.transformDef = _.findWhere(this.transforms, {type: this.rule.transform.type}); + this.alert.transform = {type: this.alert.transform.type}; + this.transformDef = _.findWhere(this.transforms, {type: this.alert.transform.type}); - switch (this.rule.transform.type) { + switch (this.alert.transform.type) { case 'aggregation': { - this.rule.transform.method = 'avg'; + this.alert.transform.method = 'avg'; break; } case "forecast": { - this.rule.transform.timespan = '7d'; + this.alert.transform.timespan = '7d'; break; } } @@ -124,45 +127,34 @@ export class AlertTabCtrl { convertThresholdsToAlertThresholds() { if (this.panel.grid && this.panel.grid.threshold1 - && this.rule.warnLevel === undefined + && this.alert.warnLevel === undefined ) { - this.rule.warning.op = '>'; - this.rule.warning.level = this.panel.grid.threshold1; + this.alert.warning.op = '>'; + this.alert.warning.level = this.panel.grid.threshold1; } if (this.panel.grid && this.panel.grid.threshold2 - && this.rule.critical.level === undefined + && this.alert.critical.level === undefined ) { - this.rule.critical.op = '>'; - this.rule.critical.level = this.panel.grid.threshold2; + this.alert.critical.op = '>'; + this.alert.critical.level = this.panel.grid.threshold2; } } delete() { - this.rule = this.panel.alerting = this.defaultValues; - this.rule.deleted = true; + this.alert = this.panel.alert = {}; + this.alert.deleted = true; + this.initAlertModel(); } enable() { - delete this.rule.deleted; - this.rule.enabled = true; + delete this.alert.deleted; + this.alert.enabled = true; } disable() { - this.rule.enabled = false; - } - - thresholdsUpdated() { - if (this.panel.alerting.warnLevel) { - this.panel.grid.threshold1 = parseInt(this.panel.alerting.warnLevel); - } - - if (this.panel.alerting.critLevel) { - this.panel.grid.threshold2 = parseInt(this.panel.alerting.critLevel); - } - - this.panelCtrl.render(); + this.alert.enabled = false; } } diff --git a/public/app/plugins/panel/graph/partials/tab_alerting.html b/public/app/plugins/panel/graph/partials/tab_alerting.html index 06b8c35e632..2b7b4e112e3 100644 --- a/public/app/plugins/panel/graph/partials/tab_alerting.html +++ b/public/app/plugins/panel/graph/partials/tab_alerting.html @@ -13,7 +13,7 @@ Transform using
Timespan - +
@@ -44,16 +44,16 @@ Warn if - - + +
Critcal if - - + +
@@ -67,14 +67,14 @@ Scheduler
Evaluate every - +
@@ -83,7 +83,7 @@
Groups - +
@@ -109,8 +109,8 @@
- - - + + +