rule_reader.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package alerting
  2. import (
  3. "sync"
  4. "time"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/log"
  7. m "github.com/grafana/grafana/pkg/models"
  8. )
  9. type RuleReader interface {
  10. Fetch() []*AlertRule
  11. }
  12. type AlertRuleReader struct {
  13. sync.RWMutex
  14. serverID string
  15. serverPosition int
  16. clusterSize int
  17. }
  18. func NewRuleReader() *AlertRuleReader {
  19. ruleReader := &AlertRuleReader{}
  20. go ruleReader.initReader()
  21. return ruleReader
  22. }
  23. func (arr *AlertRuleReader) initReader() {
  24. heartbeat := time.NewTicker(time.Second * 10)
  25. for {
  26. select {
  27. case <-heartbeat.C:
  28. arr.heartbeat()
  29. }
  30. }
  31. }
  32. func (arr *AlertRuleReader) Fetch() []*AlertRule {
  33. cmd := &m.GetAllAlertsQuery{}
  34. err := bus.Dispatch(cmd)
  35. if err != nil {
  36. log.Error(1, "Alerting: ruleReader.fetch(): Could not load alerts", err)
  37. return []*AlertRule{}
  38. }
  39. res := make([]*AlertRule, len(cmd.Result))
  40. for i, ruleDef := range cmd.Result {
  41. model := &AlertRule{}
  42. model.Id = ruleDef.Id
  43. model.OrgId = ruleDef.OrgId
  44. model.DatasourceId = ruleDef.DatasourceId
  45. model.Query = ruleDef.Query
  46. model.QueryRefId = ruleDef.QueryRefId
  47. model.WarnLevel = ruleDef.WarnLevel
  48. model.WarnOperator = ruleDef.WarnOperator
  49. model.CritLevel = ruleDef.CritLevel
  50. model.CritOperator = ruleDef.CritOperator
  51. model.Frequency = ruleDef.Frequency
  52. model.Name = ruleDef.Name
  53. model.Description = ruleDef.Description
  54. model.Aggregator = ruleDef.Aggregator
  55. model.State = ruleDef.State
  56. model.QueryRange = ruleDef.QueryRange
  57. res[i] = model
  58. }
  59. return res
  60. }
  61. func (arr *AlertRuleReader) heartbeat() {
  62. //Lets cheat on this until we focus on clustering
  63. //log.Info("Heartbeat: Sending heartbeat from " + this.serverId)
  64. arr.clusterSize = 1
  65. arr.serverPosition = 1
  66. /*
  67. cmd := &m.HeartBeatCommand{ServerId: this.serverId}
  68. err := bus.Dispatch(cmd)
  69. if err != nil {
  70. log.Error(1, "Failed to send heartbeat.")
  71. } else {
  72. this.clusterSize = cmd.Result.ClusterSize
  73. this.serverPosition = cmd.Result.UptimePosition
  74. }
  75. */
  76. }