alerting.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package sqlstore
  2. import (
  3. "fmt"
  4. "github.com/go-xorm/xorm"
  5. "github.com/grafana/grafana/pkg/bus"
  6. m "github.com/grafana/grafana/pkg/models"
  7. "time"
  8. )
  9. func init() {
  10. bus.AddHandler("sql", SaveAlerts)
  11. }
  12. func SaveAlertChange(change string, alert m.AlertRule) error {
  13. return inTransaction(func(sess *xorm.Session) error {
  14. _, err := sess.Insert(&m.AlertRuleChange{
  15. OrgId: alert.OrgId,
  16. Type: change,
  17. Created: time.Now(),
  18. AlertId: alert.Id,
  19. })
  20. if err != nil {
  21. return err
  22. }
  23. return nil
  24. })
  25. }
  26. func alertIsDifferent(rule1, rule2 m.AlertRule) bool {
  27. result := false
  28. result = result || rule1.Aggregator != rule2.Aggregator
  29. result = result || rule1.CritLevel != rule2.CritLevel
  30. result = result || rule1.WarnLevel != rule2.WarnLevel
  31. result = result || rule1.Query != rule2.Query
  32. result = result || rule1.QueryRefId != rule2.QueryRefId
  33. result = result || rule1.Interval != rule2.Interval
  34. result = result || rule1.Title != rule2.Title
  35. result = result || rule1.Description != rule2.Description
  36. result = result || rule1.QueryRange != rule2.QueryRange
  37. return result
  38. }
  39. func SaveAlerts(cmd *m.SaveAlertsCommand) error {
  40. //this function should be refactored
  41. fmt.Printf("Saving alerts for dashboard %v\n", cmd.DashboardId)
  42. alerts, err := GetAlertsByDashboardId(cmd.DashboardId)
  43. if err != nil {
  44. return err
  45. }
  46. for _, alert := range *cmd.Alerts {
  47. update := false
  48. var alertToUpdate m.AlertRule
  49. for _, k := range alerts {
  50. if alert.PanelId == k.PanelId {
  51. update = true
  52. alert.Id = k.Id
  53. alertToUpdate = k
  54. }
  55. }
  56. if update {
  57. if alertIsDifferent(alertToUpdate, alert) {
  58. _, err = x.Id(alert.Id).Update(&alert)
  59. if err != nil {
  60. return err
  61. }
  62. SaveAlertChange("UPDATED", alert)
  63. }
  64. } else {
  65. _, err = x.Insert(&alert)
  66. if err != nil {
  67. return err
  68. }
  69. SaveAlertChange("CREATED", alert)
  70. }
  71. }
  72. for _, missingAlert := range alerts {
  73. missing := true
  74. for _, k := range *cmd.Alerts {
  75. if missingAlert.PanelId == k.PanelId {
  76. missing = false
  77. }
  78. }
  79. if missing {
  80. _, err = x.Exec("DELETE FROM alert_rule WHERE id = ?", missingAlert.Id)
  81. if err != nil {
  82. return err
  83. }
  84. err = SaveAlertChange("DELETED", missingAlert)
  85. if err != nil {
  86. return err
  87. }
  88. }
  89. }
  90. return nil
  91. }
  92. func GetAlertsByDashboardId(dashboardId int64) ([]m.AlertRule, error) {
  93. alerts := make([]m.AlertRule, 0)
  94. err := x.Where("dashboard_id = ?", dashboardId).Find(&alerts)
  95. if err != nil {
  96. return []m.AlertRule{}, err
  97. }
  98. return alerts, nil
  99. }
  100. func GetAlertsByDashboardAndPanelId(dashboardId, panelId int64) (m.AlertRule, error) {
  101. // this code should be refactored!!
  102. // uniqueness should be garanted!
  103. alerts := make([]m.AlertRule, 0)
  104. err := x.Where("dashboard_id = ? and panel_id = ?", dashboardId, panelId).Find(&alerts)
  105. if err != nil {
  106. return m.AlertRule{}, err
  107. }
  108. if len(alerts) != 1 {
  109. return m.AlertRule{}, err
  110. }
  111. return alerts[0], nil
  112. }
  113. func GetAlertRuleChanges(orgid int64) ([]m.AlertRuleChange, error) {
  114. alertChanges := make([]m.AlertRuleChange, 0)
  115. err := x.Where("org_id = ?", orgid).Find(&alertChanges)
  116. if err != nil {
  117. return []m.AlertRuleChange{}, err
  118. }
  119. return alertChanges, nil
  120. }