index_pattern_test.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package es
  2. import (
  3. "fmt"
  4. "testing"
  5. "time"
  6. "github.com/grafana/grafana/pkg/tsdb"
  7. . "github.com/smartystreets/goconvey/convey"
  8. )
  9. func TestIndexPattern(t *testing.T) {
  10. Convey("Static index patterns", t, func() {
  11. indexPatternScenario(noInterval, "data-*", nil, func(indices []string) {
  12. So(indices, ShouldHaveLength, 1)
  13. So(indices[0], ShouldEqual, "data-*")
  14. })
  15. indexPatternScenario(noInterval, "es-index-name", nil, func(indices []string) {
  16. So(indices, ShouldHaveLength, 1)
  17. So(indices[0], ShouldEqual, "es-index-name")
  18. })
  19. })
  20. Convey("Dynamic index patterns", t, func() {
  21. from := fmt.Sprintf("%d", time.Date(2018, 5, 15, 17, 50, 0, 0, time.UTC).UnixNano()/int64(time.Millisecond))
  22. to := fmt.Sprintf("%d", time.Date(2018, 5, 15, 17, 55, 0, 0, time.UTC).UnixNano()/int64(time.Millisecond))
  23. indexPatternScenario(intervalHourly, "[data-]YYYY.MM.DD.HH", tsdb.NewTimeRange(from, to), func(indices []string) {
  24. //So(indices, ShouldHaveLength, 1)
  25. So(indices[0], ShouldEqual, "data-2018.05.15.17")
  26. })
  27. indexPatternScenario(intervalDaily, "[data-]YYYY.MM.DD", tsdb.NewTimeRange(from, to), func(indices []string) {
  28. So(indices, ShouldHaveLength, 1)
  29. So(indices[0], ShouldEqual, "data-2018.05.15")
  30. })
  31. indexPatternScenario(intervalWeekly, "[data-]GGGG.WW", tsdb.NewTimeRange(from, to), func(indices []string) {
  32. So(indices, ShouldHaveLength, 1)
  33. So(indices[0], ShouldEqual, "data-2018.20")
  34. })
  35. indexPatternScenario(intervalMonthly, "[data-]YYYY.MM", tsdb.NewTimeRange(from, to), func(indices []string) {
  36. So(indices, ShouldHaveLength, 1)
  37. So(indices[0], ShouldEqual, "data-2018.05")
  38. })
  39. indexPatternScenario(intervalYearly, "[data-]YYYY", tsdb.NewTimeRange(from, to), func(indices []string) {
  40. So(indices, ShouldHaveLength, 1)
  41. So(indices[0], ShouldEqual, "data-2018")
  42. })
  43. })
  44. Convey("Hourly interval", t, func() {
  45. Convey("Should return 1 interval", func() {
  46. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  47. to := time.Date(2018, 1, 1, 23, 6, 0, 0, time.UTC)
  48. intervals := (&hourlyInterval{}).Generate(from, to)
  49. So(intervals, ShouldHaveLength, 1)
  50. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 23, 0, 0, 0, time.UTC))
  51. })
  52. Convey("Should return 2 intervals", func() {
  53. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  54. to := time.Date(2018, 1, 2, 0, 6, 0, 0, time.UTC)
  55. intervals := (&hourlyInterval{}).Generate(from, to)
  56. So(intervals, ShouldHaveLength, 2)
  57. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 23, 0, 0, 0, time.UTC))
  58. So(intervals[1], ShouldEqual, time.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC))
  59. })
  60. Convey("Should return 10 intervals", func() {
  61. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  62. to := time.Date(2018, 1, 2, 8, 6, 0, 0, time.UTC)
  63. intervals := (&hourlyInterval{}).Generate(from, to)
  64. So(intervals, ShouldHaveLength, 10)
  65. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 23, 0, 0, 0, time.UTC))
  66. So(intervals[4], ShouldEqual, time.Date(2018, 1, 2, 3, 0, 0, 0, time.UTC))
  67. So(intervals[9], ShouldEqual, time.Date(2018, 1, 2, 8, 0, 0, 0, time.UTC))
  68. })
  69. })
  70. Convey("Daily interval", t, func() {
  71. Convey("Should return 1 day", func() {
  72. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  73. to := time.Date(2018, 1, 1, 23, 6, 0, 0, time.UTC)
  74. intervals := (&dailyInterval{}).Generate(from, to)
  75. So(intervals, ShouldHaveLength, 1)
  76. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  77. })
  78. Convey("Should return 2 days", func() {
  79. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  80. to := time.Date(2018, 1, 2, 0, 6, 0, 0, time.UTC)
  81. intervals := (&dailyInterval{}).Generate(from, to)
  82. So(intervals, ShouldHaveLength, 2)
  83. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  84. So(intervals[1], ShouldEqual, time.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC))
  85. })
  86. Convey("Should return 32 days", func() {
  87. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  88. to := time.Date(2018, 2, 1, 8, 6, 0, 0, time.UTC)
  89. intervals := (&dailyInterval{}).Generate(from, to)
  90. So(intervals, ShouldHaveLength, 32)
  91. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  92. So(intervals[30], ShouldEqual, time.Date(2018, 1, 31, 0, 0, 0, 0, time.UTC))
  93. So(intervals[31], ShouldEqual, time.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC))
  94. })
  95. })
  96. Convey("Weekly interval", t, func() {
  97. Convey("Should return 1 week (1)", func() {
  98. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  99. to := time.Date(2018, 1, 1, 23, 6, 0, 0, time.UTC)
  100. intervals := (&weeklyInterval{}).Generate(from, to)
  101. So(intervals, ShouldHaveLength, 1)
  102. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  103. })
  104. Convey("Should return 1 week (2)", func() {
  105. from := time.Date(2017, 1, 1, 23, 1, 1, 0, time.UTC)
  106. to := time.Date(2017, 1, 1, 23, 6, 0, 0, time.UTC)
  107. intervals := (&weeklyInterval{}).Generate(from, to)
  108. So(intervals, ShouldHaveLength, 1)
  109. So(intervals[0], ShouldEqual, time.Date(2016, 12, 26, 0, 0, 0, 0, time.UTC))
  110. })
  111. Convey("Should return 2 weeks (1)", func() {
  112. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  113. to := time.Date(2018, 1, 10, 23, 6, 0, 0, time.UTC)
  114. intervals := (&weeklyInterval{}).Generate(from, to)
  115. So(intervals, ShouldHaveLength, 2)
  116. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  117. So(intervals[1], ShouldEqual, time.Date(2018, 1, 8, 0, 0, 0, 0, time.UTC))
  118. })
  119. Convey("Should return 2 weeks (2)", func() {
  120. from := time.Date(2017, 1, 1, 23, 1, 1, 0, time.UTC)
  121. to := time.Date(2017, 1, 8, 23, 6, 0, 0, time.UTC)
  122. intervals := (&weeklyInterval{}).Generate(from, to)
  123. So(intervals, ShouldHaveLength, 2)
  124. So(intervals[0], ShouldEqual, time.Date(2016, 12, 26, 0, 0, 0, 0, time.UTC))
  125. So(intervals[1], ShouldEqual, time.Date(2017, 1, 2, 0, 0, 0, 0, time.UTC))
  126. })
  127. Convey("Should return 3 weeks (1)", func() {
  128. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  129. to := time.Date(2018, 1, 21, 23, 6, 0, 0, time.UTC)
  130. intervals := (&weeklyInterval{}).Generate(from, to)
  131. So(intervals, ShouldHaveLength, 3)
  132. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  133. So(intervals[1], ShouldEqual, time.Date(2018, 1, 8, 0, 0, 0, 0, time.UTC))
  134. So(intervals[2], ShouldEqual, time.Date(2018, 1, 15, 0, 0, 0, 0, time.UTC))
  135. })
  136. Convey("Should return 3 weeks (2)", func() {
  137. from := time.Date(2017, 1, 1, 23, 1, 1, 0, time.UTC)
  138. to := time.Date(2017, 1, 9, 23, 6, 0, 0, time.UTC)
  139. intervals := (&weeklyInterval{}).Generate(from, to)
  140. So(intervals, ShouldHaveLength, 3)
  141. So(intervals[0], ShouldEqual, time.Date(2016, 12, 26, 0, 0, 0, 0, time.UTC))
  142. So(intervals[1], ShouldEqual, time.Date(2017, 1, 2, 0, 0, 0, 0, time.UTC))
  143. So(intervals[2], ShouldEqual, time.Date(2017, 1, 9, 0, 0, 0, 0, time.UTC))
  144. })
  145. })
  146. Convey("Monthly interval", t, func() {
  147. Convey("Should return 1 month", func() {
  148. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  149. to := time.Date(2018, 1, 1, 23, 6, 0, 0, time.UTC)
  150. intervals := (&monthlyInterval{}).Generate(from, to)
  151. So(intervals, ShouldHaveLength, 1)
  152. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  153. })
  154. Convey("Should return 2 months", func() {
  155. from := time.Date(2018, 1, 1, 23, 1, 1, 0, time.UTC)
  156. to := time.Date(2018, 2, 2, 0, 6, 0, 0, time.UTC)
  157. intervals := (&monthlyInterval{}).Generate(from, to)
  158. So(intervals, ShouldHaveLength, 2)
  159. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  160. So(intervals[1], ShouldEqual, time.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC))
  161. })
  162. Convey("Should return 14 months", func() {
  163. from := time.Date(2017, 1, 1, 23, 1, 1, 0, time.UTC)
  164. to := time.Date(2018, 2, 1, 8, 6, 0, 0, time.UTC)
  165. intervals := (&monthlyInterval{}).Generate(from, to)
  166. So(intervals, ShouldHaveLength, 14)
  167. So(intervals[0], ShouldEqual, time.Date(2017, 1, 1, 0, 0, 0, 0, time.UTC))
  168. So(intervals[13], ShouldEqual, time.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC))
  169. })
  170. })
  171. Convey("Yearly interval", t, func() {
  172. Convey("Should return 1 year (hour diff)", func() {
  173. from := time.Date(2018, 2, 1, 23, 1, 1, 0, time.UTC)
  174. to := time.Date(2018, 2, 1, 23, 6, 0, 0, time.UTC)
  175. intervals := (&yearlyInterval{}).Generate(from, to)
  176. So(intervals, ShouldHaveLength, 1)
  177. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  178. })
  179. Convey("Should return 1 year (month diff)", func() {
  180. from := time.Date(2018, 2, 1, 23, 1, 1, 0, time.UTC)
  181. to := time.Date(2018, 12, 31, 23, 59, 59, 0, time.UTC)
  182. intervals := (&yearlyInterval{}).Generate(from, to)
  183. So(intervals, ShouldHaveLength, 1)
  184. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  185. })
  186. Convey("Should return 2 years", func() {
  187. from := time.Date(2018, 2, 1, 23, 1, 1, 0, time.UTC)
  188. to := time.Date(2019, 1, 1, 23, 59, 59, 0, time.UTC)
  189. intervals := (&yearlyInterval{}).Generate(from, to)
  190. So(intervals, ShouldHaveLength, 2)
  191. So(intervals[0], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  192. So(intervals[1], ShouldEqual, time.Date(2019, 1, 1, 0, 0, 0, 0, time.UTC))
  193. })
  194. Convey("Should return 5 years", func() {
  195. from := time.Date(2014, 1, 1, 23, 1, 1, 0, time.UTC)
  196. to := time.Date(2018, 11, 1, 23, 59, 59, 0, time.UTC)
  197. intervals := (&yearlyInterval{}).Generate(from, to)
  198. So(intervals, ShouldHaveLength, 5)
  199. So(intervals[0], ShouldEqual, time.Date(2014, 1, 1, 0, 0, 0, 0, time.UTC))
  200. So(intervals[4], ShouldEqual, time.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC))
  201. })
  202. })
  203. }
  204. func indexPatternScenario(interval string, pattern string, timeRange *tsdb.TimeRange, fn func(indices []string)) {
  205. Convey(fmt.Sprintf("Index pattern (interval=%s, index=%s", interval, pattern), func() {
  206. ip, err := newIndexPattern(interval, pattern)
  207. So(err, ShouldBeNil)
  208. So(ip, ShouldNotBeNil)
  209. indices, err := ip.GetIndices(timeRange)
  210. So(err, ShouldBeNil)
  211. fn(indices)
  212. })
  213. }