alerting.go 4.0 KB

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