From 91a1a823e23b81e2fc7adef246db2461e229aa38 Mon Sep 17 00:00:00 2001 From: bergquist Date: Wed, 13 Apr 2016 10:33:45 +0200 Subject: [PATCH] feat(alerting): add basic tables for alerting definitions --- pkg/api/dashboard.go | 13 +++++ pkg/models/alerts.go | 50 +++++++++++++++++++ pkg/services/sqlstore/alerting.go | 28 +++++++++++ pkg/services/sqlstore/migrations/alert_mig.go | 27 ++++++++++ .../sqlstore/migrations/migrations.go | 1 + 5 files changed, 119 insertions(+) create mode 100644 pkg/models/alerts.go create mode 100644 pkg/services/sqlstore/alerting.go create mode 100644 pkg/services/sqlstore/migrations/alert_mig.go diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go index b55a1377bd8..7929b81a0f0 100644 --- a/pkg/api/dashboard.go +++ b/pkg/api/dashboard.go @@ -149,6 +149,19 @@ func PostDashboard(c *middleware.Context, cmd m.SaveDashboardCommand) { return } + saveAlertCommand := m.SaveAlertsCommand{ + DashboardId: dash.Id, + OrgId: c.OrgId, + UserId: c.UserId, + Alerts: cmd.GetAlertModels(), + } + + err = bus.Dispatch(&saveAlertCommand) + if err != nil { + c.JsonApiErr(500, "Failed to save alerts", err) + return + } + metrics.M_Api_Dashboard_Post.Inc(1) c.JSON(200, util.DynMap{"status": "success", "slug": cmd.Result.Slug, "version": cmd.Result.Version}) diff --git a/pkg/models/alerts.go b/pkg/models/alerts.go new file mode 100644 index 00000000000..624ff7015ea --- /dev/null +++ b/pkg/models/alerts.go @@ -0,0 +1,50 @@ +package models + +import ( +//"github.com/grafana/grafana/pkg/components/simplejson" +) + +type Alert struct { + Id int64 + DashboardId int64 + PanelId int64 + Query string + QueryRefId string + WarnLevel int64 + ErrorLevel int64 + CheckInterval string + Title string + Description string + QueryRange string +} + +func (cmd *SaveDashboardCommand) GetAlertModels() *[]Alert { + dash := NewDashboardFromJson(cmd.Dashboard) + + alerts := make([]Alert, 0) + + alerts = append(alerts, Alert{ + DashboardId: dash.Id, + Id: 1, + PanelId: 1, + Query: "", + QueryRefId: "", + WarnLevel: 0, + ErrorLevel: 0, + CheckInterval: "5s", + Title: dash.Title + " Alert", + Description: dash.Title + " Description", + QueryRange: "10m", + }) + + return &alerts +} + +// Commands +type SaveAlertsCommand struct { + DashboardId int64 + UserId int64 + OrgId int64 + + Alerts *[]Alert +} diff --git a/pkg/services/sqlstore/alerting.go b/pkg/services/sqlstore/alerting.go new file mode 100644 index 00000000000..e9616b6ed9c --- /dev/null +++ b/pkg/services/sqlstore/alerting.go @@ -0,0 +1,28 @@ +package sqlstore + +import ( + "fmt" + + "github.com/go-xorm/xorm" + "github.com/grafana/grafana/pkg/bus" + m "github.com/grafana/grafana/pkg/models" +) + +func init() { + bus.AddHandler("sql", SaveAlerts) +} + +func SaveAlerts(cmd *m.SaveAlertsCommand) error { + return inTransaction(func(sess *xorm.Session) error { + fmt.Printf("Saving alerts for dashboard %v\n", cmd.DashboardId) + + for _, alert := range *cmd.Alerts { + _, err := x.Insert(&alert) + if err != nil { + return err + } + } + + return nil + }) +} diff --git a/pkg/services/sqlstore/migrations/alert_mig.go b/pkg/services/sqlstore/migrations/alert_mig.go new file mode 100644 index 00000000000..1cf6813ce9b --- /dev/null +++ b/pkg/services/sqlstore/migrations/alert_mig.go @@ -0,0 +1,27 @@ +package migrations + +import . "github.com/grafana/grafana/pkg/services/sqlstore/migrator" + +func addAlertMigrations(mg *Migrator) { + mg.AddMigration("Drop old table alert table", NewDropTableMigration("alert")) + + alertV1 := Table{ + Name: "alert", + Columns: []*Column{ + {Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true}, + {Name: "dashboard_id", Type: DB_BigInt, Nullable: false}, + {Name: "panel_id", Type: DB_BigInt, Nullable: false}, + {Name: "query", Type: DB_Text, Nullable: false}, + {Name: "query_ref_id", Type: DB_NVarchar, Length: 255, Nullable: false}, + {Name: "warn_level", Type: DB_NVarchar, Length: 255, Nullable: false}, + {Name: "error_level", Type: DB_NVarchar, Length: 255, Nullable: false}, + {Name: "check_interval", Type: DB_NVarchar, Length: 255, Nullable: false}, + {Name: "title", Type: DB_NVarchar, Length: 255, Nullable: false}, + {Name: "description", Type: DB_NVarchar, Length: 255, Nullable: false}, + {Name: "query_range", Type: DB_NVarchar, Length: 255, Nullable: false}, + }, + } + + // create table + mg.AddMigration("create alert table v1", NewAddTableMigration(alertV1)) +} diff --git a/pkg/services/sqlstore/migrations/migrations.go b/pkg/services/sqlstore/migrations/migrations.go index 7a6ba554246..11be7eceb19 100644 --- a/pkg/services/sqlstore/migrations/migrations.go +++ b/pkg/services/sqlstore/migrations/migrations.go @@ -22,6 +22,7 @@ func AddMigrations(mg *Migrator) { addSessionMigration(mg) addPlaylistMigrations(mg) addPreferencesMigrations(mg) + addAlertMigrations(mg) } func addMigrationLogMigrations(mg *Migrator) {