executor_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package alerting
  2. import (
  3. "testing"
  4. "github.com/grafana/grafana/pkg/services/alerting/alertstates"
  5. "github.com/grafana/grafana/pkg/tsdb"
  6. . "github.com/smartystreets/goconvey/convey"
  7. )
  8. func TestAlertingExecutor(t *testing.T) {
  9. Convey("Test alert execution", t, func() {
  10. executor := NewExecutor()
  11. Convey("single time serie", func() {
  12. Convey("Show return ok since avg is above 2", func() {
  13. rule := &AlertRule{
  14. Critical: Level{Level: 10, Operator: ">"},
  15. Transformer: &AggregationTransformer{Method: "avg"},
  16. }
  17. timeSeries := []*tsdb.TimeSeries{
  18. tsdb.NewTimeSeries("test1", [][2]float64{{2, 0}}),
  19. }
  20. result := executor.evaluateRule(rule, timeSeries)
  21. So(result.State, ShouldEqual, alertstates.Ok)
  22. })
  23. Convey("Show return critical since below 2", func() {
  24. rule := &AlertRule{
  25. Critical: Level{Level: 10, Operator: "<"},
  26. Transformer: &AggregationTransformer{Method: "avg"},
  27. }
  28. timeSeries := []*tsdb.TimeSeries{
  29. tsdb.NewTimeSeries("test1", [][2]float64{{2, 0}}),
  30. }
  31. result := executor.evaluateRule(rule, timeSeries)
  32. So(result.State, ShouldEqual, alertstates.Critical)
  33. })
  34. Convey("Show return critical since sum is above 10", func() {
  35. rule := &AlertRule{
  36. Critical: Level{Level: 10, Operator: ">"},
  37. Transformer: &AggregationTransformer{Method: "sum"},
  38. }
  39. timeSeries := []*tsdb.TimeSeries{
  40. tsdb.NewTimeSeries("test1", [][2]float64{{9, 0}, {9, 0}}),
  41. }
  42. result := executor.evaluateRule(rule, timeSeries)
  43. So(result.State, ShouldEqual, alertstates.Critical)
  44. })
  45. Convey("Show return ok since avg is below 10", func() {
  46. rule := &AlertRule{
  47. Critical: Level{Level: 10, Operator: ">"},
  48. Transformer: &AggregationTransformer{Method: "avg"},
  49. }
  50. timeSeries := []*tsdb.TimeSeries{
  51. tsdb.NewTimeSeries("test1", [][2]float64{{9, 0}, {9, 0}}),
  52. }
  53. result := executor.evaluateRule(rule, timeSeries)
  54. So(result.State, ShouldEqual, alertstates.Ok)
  55. })
  56. Convey("Show return ok since min is below 10", func() {
  57. rule := &AlertRule{
  58. Critical: Level{Level: 10, Operator: ">"},
  59. Transformer: &AggregationTransformer{Method: "avg"},
  60. }
  61. timeSeries := []*tsdb.TimeSeries{
  62. tsdb.NewTimeSeries("test1", [][2]float64{{11, 0}, {9, 0}}),
  63. }
  64. result := executor.evaluateRule(rule, timeSeries)
  65. So(result.State, ShouldEqual, alertstates.Ok)
  66. })
  67. Convey("Show return ok since max is above 10", func() {
  68. rule := &AlertRule{
  69. Critical: Level{Level: 10, Operator: ">"},
  70. Transformer: &AggregationTransformer{Method: "max"},
  71. }
  72. timeSeries := []*tsdb.TimeSeries{
  73. tsdb.NewTimeSeries("test1", [][2]float64{{1, 0}, {11, 0}}),
  74. }
  75. result := executor.evaluateRule(rule, timeSeries)
  76. So(result.State, ShouldEqual, alertstates.Critical)
  77. })
  78. })
  79. Convey("muliple time series", func() {
  80. Convey("both are ok", func() {
  81. rule := &AlertRule{
  82. Critical: Level{Level: 10, Operator: ">"},
  83. Transformer: &AggregationTransformer{Method: "avg"},
  84. }
  85. timeSeries := []*tsdb.TimeSeries{
  86. tsdb.NewTimeSeries("test1", [][2]float64{{2, 0}}),
  87. tsdb.NewTimeSeries("test1", [][2]float64{{2, 0}}),
  88. }
  89. result := executor.evaluateRule(rule, timeSeries)
  90. So(result.State, ShouldEqual, alertstates.Ok)
  91. })
  92. Convey("first serie is good, second is critical", func() {
  93. rule := &AlertRule{
  94. Critical: Level{Level: 10, Operator: ">"},
  95. Transformer: &AggregationTransformer{Method: "avg"},
  96. }
  97. timeSeries := []*tsdb.TimeSeries{
  98. tsdb.NewTimeSeries("test1", [][2]float64{{2, 0}}),
  99. tsdb.NewTimeSeries("test1", [][2]float64{{11, 0}}),
  100. }
  101. result := executor.evaluateRule(rule, timeSeries)
  102. So(result.State, ShouldEqual, alertstates.Critical)
  103. })
  104. })
  105. })
  106. }