alerting.go 1.7 KB

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