alerting.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package sqlstore
  2. import (
  3. "fmt"
  4. "github.com/grafana/grafana/pkg/bus"
  5. m "github.com/grafana/grafana/pkg/models"
  6. )
  7. func init() {
  8. bus.AddHandler("sql", SaveAlerts)
  9. }
  10. func SaveAlerts(cmd *m.SaveAlertsCommand) error {
  11. fmt.Printf("Saving alerts for dashboard %v\n", cmd.DashboardId)
  12. alerts, err := GetAlertsByDashboardId(cmd.DashboardId)
  13. if err != nil {
  14. return err
  15. }
  16. for _, alert := range *cmd.Alerts {
  17. update := false
  18. for _, k := range alerts {
  19. if alert.PanelId == k.PanelId {
  20. update = true
  21. alert.Id = k.Id
  22. }
  23. }
  24. if update {
  25. _, err = x.Id(alert.Id).Update(&alert)
  26. if err != nil {
  27. return err
  28. }
  29. } else {
  30. _, err = x.Insert(&alert)
  31. if err != nil {
  32. return err
  33. }
  34. }
  35. }
  36. for _, missingAlert := range alerts {
  37. missing := true
  38. for _, k := range *cmd.Alerts {
  39. if missingAlert.PanelId == k.PanelId {
  40. missing = false
  41. }
  42. }
  43. if missing {
  44. _, err = x.Exec("DELETE FROM alert WHERE id = ?", missingAlert.Id)
  45. if err != nil {
  46. return err
  47. }
  48. if err != nil {
  49. return err
  50. }
  51. }
  52. }
  53. return nil
  54. }
  55. func GetAlertsByDashboardId(dashboardId int64) ([]m.Alert, error) {
  56. alerts := make([]m.Alert, 0)
  57. err := x.Where("dashboard_id = ?", dashboardId).Find(&alerts)
  58. if err != nil {
  59. return []m.Alert{}, err
  60. }
  61. return alerts, nil
  62. }
  63. func GetAlertsByDashboardAndPanelId(dashboardId, panelId int64) (m.Alert, error) {
  64. // this code should be refactored!!
  65. // uniqueness should be garanted!
  66. alerts := make([]m.Alert, 0)
  67. err := x.Where("dashboard_id = ? and panel_id = ?", dashboardId, panelId).Find(&alerts)
  68. if err != nil {
  69. return m.Alert{}, err
  70. }
  71. if len(alerts) != 1 {
  72. return m.Alert{}, err
  73. }
  74. return alerts[0], nil
  75. }