scenarios.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package testdata
  2. import (
  3. "math/rand"
  4. "strconv"
  5. "strings"
  6. "time"
  7. "github.com/grafana/grafana/pkg/components/null"
  8. "github.com/grafana/grafana/pkg/log"
  9. "github.com/grafana/grafana/pkg/tsdb"
  10. )
  11. type ScenarioHandler func(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.QueryResult
  12. type Scenario struct {
  13. Id string `json:"id"`
  14. Name string `json:"name"`
  15. StringInput string `json:"stringOption"`
  16. Description string `json:"description"`
  17. Handler ScenarioHandler `json:"-"`
  18. }
  19. var ScenarioRegistry map[string]*Scenario
  20. func init() {
  21. ScenarioRegistry = make(map[string]*Scenario)
  22. logger := log.New("tsdb.testdata")
  23. logger.Debug("Initializing TestData Scenario")
  24. registerScenario(&Scenario{
  25. Id: "exponential_heatmap_bucket_data",
  26. Name: "Exponential heatmap bucket data",
  27. Handler: func(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.QueryResult {
  28. to := context.TimeRange.GetToAsMsEpoch()
  29. var series []*tsdb.TimeSeries
  30. start := 1
  31. factor := 2
  32. for i := 0; i < 10; i++ {
  33. timeWalkerMs := context.TimeRange.GetFromAsMsEpoch()
  34. serie := &tsdb.TimeSeries{Name: strconv.Itoa(start)}
  35. start *= factor
  36. points := make(tsdb.TimeSeriesPoints, 0)
  37. for j := int64(0); j < 100 && timeWalkerMs < to; j++ {
  38. v := float64(rand.Int63n(100))
  39. points = append(points, tsdb.NewTimePoint(null.FloatFrom(v), float64(timeWalkerMs)))
  40. timeWalkerMs += query.IntervalMs * 50
  41. }
  42. serie.Points = points
  43. series = append(series, serie)
  44. }
  45. queryRes := tsdb.NewQueryResult()
  46. queryRes.Series = append(queryRes.Series, series...)
  47. return queryRes
  48. },
  49. })
  50. registerScenario(&Scenario{
  51. Id: "linear_heatmap_bucket_data",
  52. Name: "Linear heatmap bucket data",
  53. Handler: func(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.QueryResult {
  54. to := context.TimeRange.GetToAsMsEpoch()
  55. var series []*tsdb.TimeSeries
  56. for i := 0; i < 10; i++ {
  57. timeWalkerMs := context.TimeRange.GetFromAsMsEpoch()
  58. serie := &tsdb.TimeSeries{Name: strconv.Itoa(i * 10)}
  59. points := make(tsdb.TimeSeriesPoints, 0)
  60. for j := int64(0); j < 100 && timeWalkerMs < to; j++ {
  61. v := float64(rand.Int63n(100))
  62. points = append(points, tsdb.NewTimePoint(null.FloatFrom(v), float64(timeWalkerMs)))
  63. timeWalkerMs += query.IntervalMs * 50
  64. }
  65. serie.Points = points
  66. series = append(series, serie)
  67. }
  68. queryRes := tsdb.NewQueryResult()
  69. queryRes.Series = append(queryRes.Series, series...)
  70. return queryRes
  71. },
  72. })
  73. registerScenario(&Scenario{
  74. Id: "random_walk",
  75. Name: "Random Walk",
  76. Handler: func(query *tsdb.Query, tsdbQuery *tsdb.TsdbQuery) *tsdb.QueryResult {
  77. timeWalkerMs := tsdbQuery.TimeRange.GetFromAsMsEpoch()
  78. to := tsdbQuery.TimeRange.GetToAsMsEpoch()
  79. series := newSeriesForQuery(query)
  80. points := make(tsdb.TimeSeriesPoints, 0)
  81. walker := rand.Float64() * 100
  82. for i := int64(0); i < 10000 && timeWalkerMs < to; i++ {
  83. points = append(points, tsdb.NewTimePoint(null.FloatFrom(walker), float64(timeWalkerMs)))
  84. walker += rand.Float64() - 0.5
  85. timeWalkerMs += query.IntervalMs
  86. }
  87. series.Points = points
  88. queryRes := tsdb.NewQueryResult()
  89. queryRes.Series = append(queryRes.Series, series)
  90. return queryRes
  91. },
  92. })
  93. registerScenario(&Scenario{
  94. Id: "no_data_points",
  95. Name: "No Data Points",
  96. Handler: func(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.QueryResult {
  97. return tsdb.NewQueryResult()
  98. },
  99. })
  100. registerScenario(&Scenario{
  101. Id: "datapoints_outside_range",
  102. Name: "Datapoints Outside Range",
  103. Handler: func(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.QueryResult {
  104. queryRes := tsdb.NewQueryResult()
  105. series := newSeriesForQuery(query)
  106. outsideTime := context.TimeRange.MustGetFrom().Add(-1*time.Hour).Unix() * 1000
  107. series.Points = append(series.Points, tsdb.NewTimePoint(null.FloatFrom(10), float64(outsideTime)))
  108. queryRes.Series = append(queryRes.Series, series)
  109. return queryRes
  110. },
  111. })
  112. registerScenario(&Scenario{
  113. Id: "csv_metric_values",
  114. Name: "CSV Metric Values",
  115. StringInput: "1,20,90,30,5,0",
  116. Handler: func(query *tsdb.Query, context *tsdb.TsdbQuery) *tsdb.QueryResult {
  117. queryRes := tsdb.NewQueryResult()
  118. stringInput := query.Model.Get("stringInput").MustString()
  119. stringInput = strings.Replace(stringInput, " ", "", -1)
  120. values := []null.Float{}
  121. for _, strVal := range strings.Split(stringInput, ",") {
  122. if strVal == "null" {
  123. values = append(values, null.FloatFromPtr(nil))
  124. }
  125. if val, err := strconv.ParseFloat(strVal, 64); err == nil {
  126. values = append(values, null.FloatFrom(val))
  127. }
  128. }
  129. if len(values) == 0 {
  130. return queryRes
  131. }
  132. series := newSeriesForQuery(query)
  133. startTime := context.TimeRange.GetFromAsMsEpoch()
  134. endTime := context.TimeRange.GetToAsMsEpoch()
  135. step := (endTime - startTime) / int64(len(values)-1)
  136. for _, val := range values {
  137. series.Points = append(series.Points, tsdb.TimePoint{val, null.FloatFrom(float64(startTime))})
  138. startTime += step
  139. }
  140. queryRes.Series = append(queryRes.Series, series)
  141. return queryRes
  142. },
  143. })
  144. }
  145. func registerScenario(scenario *Scenario) {
  146. ScenarioRegistry[scenario.Id] = scenario
  147. }
  148. func newSeriesForQuery(query *tsdb.Query) *tsdb.TimeSeries {
  149. alias := query.Model.Get("alias").MustString("")
  150. if alias == "" {
  151. alias = query.RefId + "-series"
  152. }
  153. return &tsdb.TimeSeries{Name: alias}
  154. }