alert_rule_reader.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package alerting
  2. import (
  3. "sync"
  4. "time"
  5. "github.com/grafana/grafana/pkg/bus"
  6. m "github.com/grafana/grafana/pkg/models"
  7. )
  8. type RuleReader interface {
  9. Fetch() []m.AlertRule
  10. }
  11. type AlertRuleReader struct {
  12. sync.RWMutex
  13. serverID string
  14. serverPosition int
  15. clusterSize int
  16. }
  17. func NewRuleReader() *AlertRuleReader {
  18. rrr := &AlertRuleReader{}
  19. go rrr.initReader()
  20. return rrr
  21. }
  22. var (
  23. alertJobs []m.AlertRule
  24. )
  25. func (arr *AlertRuleReader) Fetch() []m.AlertRule {
  26. return alertJobs
  27. }
  28. func (arr *AlertRuleReader) initReader() {
  29. alertJobs = make([]m.AlertRule, 0)
  30. heartbeat := time.NewTicker(time.Second * 10)
  31. arr.updateRules()
  32. for {
  33. select {
  34. case <-heartbeat.C:
  35. arr.updateRules()
  36. }
  37. }
  38. }
  39. func (arr *AlertRuleReader) updateRules() {
  40. arr.Lock()
  41. defer arr.Unlock()
  42. /*
  43. rules = []m.AlertRule{
  44. //{Id: 1, Title: "alert rule 1", Interval: "10s", Frequency: 10},
  45. //{Id: 2, Title: "alert rule 2", Interval: "10s", Frequency: 10},
  46. //{Id: 3, Title: "alert rule 3", Interval: "10s", Frequency: 10},
  47. //{Id: 4, Title: "alert rule 4", Interval: "10s", Frequency: 5},
  48. //{Id: 5, Title: "alert rule 5", Interval: "10s", Frequency: 5},
  49. {
  50. Id: 1,
  51. OrgId: 1,
  52. Title: "alert rule 1",
  53. Frequency: 3,
  54. DatasourceId: 1,
  55. WarnOperator: ">",
  56. WarnLevel: 3,
  57. CritOperator: ">",
  58. CritLevel: 4,
  59. Aggregator: "avg",
  60. //Query: `{"refId":"A","target":"statsd.fakesite.counters.session_start.*.count","textEditor":true}"`,
  61. Query: `{"hide":false,"refId":"A","target":"aliasByNode(statsd.fakesite.counters.session_start.*.count, 4)","textEditor":false}`,
  62. QueryRange: 3600,
  63. },
  64. }
  65. */
  66. cmd := &m.GetAlertsQuery{
  67. OrgId: 1,
  68. }
  69. err := bus.Dispatch(cmd)
  70. if err == nil {
  71. alertJobs = cmd.Result
  72. }
  73. }
  74. func (arr *AlertRuleReader) heartBeat() {
  75. //Lets cheat on this until we focus on clustering
  76. //log.Info("Heartbeat: Sending heartbeat from " + this.serverId)
  77. arr.clusterSize = 1
  78. arr.serverPosition = 1
  79. /*
  80. cmd := &m.HeartBeatCommand{ServerId: this.serverId}
  81. err := bus.Dispatch(cmd)
  82. if err != nil {
  83. log.Error(1, "Failed to send heartbeat.")
  84. } else {
  85. this.clusterSize = cmd.Result.ClusterSize
  86. this.serverPosition = cmd.Result.UptimePosition
  87. }
  88. */
  89. }