handler_test.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package alerting
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/components/simplejson"
  5. "github.com/grafana/grafana/pkg/models"
  6. . "github.com/smartystreets/goconvey/convey"
  7. )
  8. func TestAlertingExecutor(t *testing.T) {
  9. Convey("Test alert execution", t, func() {
  10. handler := NewHandler()
  11. Convey("single time serie", func() {
  12. Convey("Show return ok since avg is above 2", func() {
  13. json := `
  14. {
  15. "name": "name2",
  16. "description": "desc2",
  17. "handler": 0,
  18. "enabled": true,
  19. "frequency": "60s",
  20. "conditions": [
  21. {
  22. "type": "query",
  23. "query": {
  24. "params": ["A", "5m", "now"],
  25. "datasourceId": 1,
  26. "model": {"target": "aliasByNode(statsd.fakesite.counters.session_start.mobile.count, 4)"}
  27. },
  28. "reducer": {"type": "avg", "params": []},
  29. "evaluator": {"type": ">", "params": [100]}
  30. }
  31. ]
  32. }
  33. `
  34. alertJSON, jsonErr := simplejson.NewJson([]byte(json))
  35. So(jsonErr, ShouldBeNil)
  36. alert := &models.Alert{Settings: alertJSON}
  37. rule, _ := NewAlertRuleFromDBModel(alert)
  38. // timeSeries := []*tsdb.TimeSeries{
  39. // tsdb.NewTimeSeries("test1", [][2]float64{{2, 0}}),
  40. // }
  41. result := handler.eval(rule)
  42. So(result.Triggered, ShouldEqual, true)
  43. })
  44. // Convey("Show return critical since below 2", func() {
  45. // rule := &AlertRule{
  46. // Critical: Level{Value: 10, Operator: "<"},
  47. // Transformer: transformers.NewAggregationTransformer("avg"),
  48. // }
  49. //
  50. // timeSeries := []*tsdb.TimeSeries{
  51. // tsdb.NewTimeSeries("test1", [][2]float64{{2, 0}}),
  52. // }
  53. //
  54. // result := executor.evaluateRule(rule, timeSeries)
  55. // So(result.State, ShouldEqual, alertstates.Critical)
  56. // })
  57. //
  58. // Convey("Show return critical since sum is above 10", func() {
  59. // rule := &AlertRule{
  60. // Critical: Level{Value: 10, Operator: ">"},
  61. // Transformer: transformers.NewAggregationTransformer("sum"),
  62. // }
  63. //
  64. // timeSeries := []*tsdb.TimeSeries{
  65. // tsdb.NewTimeSeries("test1", [][2]float64{{9, 0}, {9, 0}}),
  66. // }
  67. //
  68. // result := executor.evaluateRule(rule, timeSeries)
  69. // So(result.State, ShouldEqual, alertstates.Critical)
  70. // })
  71. //
  72. // Convey("Show return ok since avg is below 10", func() {
  73. // rule := &AlertRule{
  74. // Critical: Level{Value: 10, Operator: ">"},
  75. // Transformer: transformers.NewAggregationTransformer("avg"),
  76. // }
  77. //
  78. // timeSeries := []*tsdb.TimeSeries{
  79. // tsdb.NewTimeSeries("test1", [][2]float64{{9, 0}, {9, 0}}),
  80. // }
  81. //
  82. // result := executor.evaluateRule(rule, timeSeries)
  83. // So(result.State, ShouldEqual, alertstates.Ok)
  84. // })
  85. //
  86. // Convey("Show return ok since min is below 10", func() {
  87. // rule := &AlertRule{
  88. // Critical: Level{Value: 10, Operator: ">"},
  89. // Transformer: transformers.NewAggregationTransformer("avg"),
  90. // }
  91. //
  92. // timeSeries := []*tsdb.TimeSeries{
  93. // tsdb.NewTimeSeries("test1", [][2]float64{{11, 0}, {9, 0}}),
  94. // }
  95. //
  96. // result := executor.evaluateRule(rule, timeSeries)
  97. // So(result.State, ShouldEqual, alertstates.Ok)
  98. // })
  99. //
  100. // Convey("Show return ok since max is above 10", func() {
  101. // rule := &AlertRule{
  102. // Critical: Level{Value: 10, Operator: ">"},
  103. // Transformer: transformers.NewAggregationTransformer("max"),
  104. // }
  105. //
  106. // timeSeries := []*tsdb.TimeSeries{
  107. // tsdb.NewTimeSeries("test1", [][2]float64{{6, 0}, {11, 0}}),
  108. // }
  109. //
  110. // result := executor.evaluateRule(rule, timeSeries)
  111. // So(result.State, ShouldEqual, alertstates.Critical)
  112. // })
  113. //
  114. // })
  115. //
  116. // Convey("muliple time series", func() {
  117. // Convey("both are ok", func() {
  118. // rule := &AlertRule{
  119. // Critical: Level{Value: 10, Operator: ">"},
  120. // Transformer: transformers.NewAggregationTransformer("avg"),
  121. // }
  122. //
  123. // timeSeries := []*tsdb.TimeSeries{
  124. // tsdb.NewTimeSeries("test1", [][2]float64{{2, 0}}),
  125. // tsdb.NewTimeSeries("test1", [][2]float64{{2, 0}}),
  126. // }
  127. //
  128. // result := executor.evaluateRule(rule, timeSeries)
  129. // So(result.State, ShouldEqual, alertstates.Ok)
  130. // })
  131. //
  132. // Convey("first serie is good, second is critical", func() {
  133. // rule := &AlertRule{
  134. // Critical: Level{Value: 10, Operator: ">"},
  135. // Transformer: transformers.NewAggregationTransformer("avg"),
  136. // }
  137. //
  138. // timeSeries := []*tsdb.TimeSeries{
  139. // tsdb.NewTimeSeries("test1", [][2]float64{{2, 0}}),
  140. // tsdb.NewTimeSeries("test1", [][2]float64{{11, 0}}),
  141. // }
  142. //
  143. // result := executor.evaluateRule(rule, timeSeries)
  144. // So(result.State, ShouldEqual, alertstates.Critical)
  145. // })
  146. //
  147. // Convey("first serie is warn, second is critical", func() {
  148. // rule := &AlertRule{
  149. // Critical: Level{Value: 10, Operator: ">"},
  150. // Warning: Level{Value: 5, Operator: ">"},
  151. // Transformer: transformers.NewAggregationTransformer("avg"),
  152. // }
  153. //
  154. // timeSeries := []*tsdb.TimeSeries{
  155. // tsdb.NewTimeSeries("test1", [][2]float64{{6, 0}}),
  156. // tsdb.NewTimeSeries("test1", [][2]float64{{11, 0}}),
  157. // }
  158. //
  159. // result := executor.evaluateRule(rule, timeSeries)
  160. // So(result.State, ShouldEqual, alertstates.Critical)
  161. // })
  162. })
  163. })
  164. }