scenarios.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package testdata
  2. import (
  3. "math/rand"
  4. "strconv"
  5. "strings"
  6. "time"
  7. "gopkg.in/guregu/null.v3"
  8. "github.com/grafana/grafana/pkg/log"
  9. "github.com/grafana/grafana/pkg/tsdb"
  10. )
  11. type ScenarioHandler func(query *tsdb.Query, context *tsdb.QueryContext) *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: "random_walk",
  26. Name: "Random Walk",
  27. Handler: func(query *tsdb.Query, context *tsdb.QueryContext) *tsdb.QueryResult {
  28. timeWalkerMs := context.TimeRange.GetFromAsMsEpoch()
  29. to := context.TimeRange.GetToAsMsEpoch()
  30. series := newSeriesForQuery(query)
  31. points := make(tsdb.TimeSeriesPoints, 0)
  32. walker := rand.Float64() * 100
  33. for i := int64(0); i < 10000 && timeWalkerMs < to; i++ {
  34. points = append(points, tsdb.NewTimePoint(null.FloatFrom(walker), float64(timeWalkerMs)))
  35. walker += rand.Float64() - 0.5
  36. timeWalkerMs += query.IntervalMs
  37. }
  38. series.Points = points
  39. queryRes := tsdb.NewQueryResult()
  40. queryRes.Series = append(queryRes.Series, series)
  41. return queryRes
  42. },
  43. })
  44. registerScenario(&Scenario{
  45. Id: "no_data_points",
  46. Name: "No Data Points",
  47. Handler: func(query *tsdb.Query, context *tsdb.QueryContext) *tsdb.QueryResult {
  48. return tsdb.NewQueryResult()
  49. },
  50. })
  51. registerScenario(&Scenario{
  52. Id: "datapoints_outside_range",
  53. Name: "Datapoints Outside Range",
  54. Handler: func(query *tsdb.Query, context *tsdb.QueryContext) *tsdb.QueryResult {
  55. queryRes := tsdb.NewQueryResult()
  56. series := newSeriesForQuery(query)
  57. outsideTime := context.TimeRange.MustGetFrom().Add(-1*time.Hour).Unix() * 1000
  58. series.Points = append(series.Points, tsdb.NewTimePoint(null.FloatFrom(10), float64(outsideTime)))
  59. queryRes.Series = append(queryRes.Series, series)
  60. return queryRes
  61. },
  62. })
  63. registerScenario(&Scenario{
  64. Id: "csv_metric_values",
  65. Name: "CSV Metric Values",
  66. StringInput: "1,20,90,30,5,0",
  67. Handler: func(query *tsdb.Query, context *tsdb.QueryContext) *tsdb.QueryResult {
  68. queryRes := tsdb.NewQueryResult()
  69. stringInput := query.Model.Get("stringInput").MustString()
  70. stringInput = strings.Replace(stringInput, " ", "", -1)
  71. values := []null.Float{}
  72. for _, strVal := range strings.Split(stringInput, ",") {
  73. if strVal == "null" {
  74. values = append(values, null.FloatFromPtr(nil))
  75. }
  76. if val, err := strconv.ParseFloat(strVal, 64); err == nil {
  77. values = append(values, null.FloatFrom(val))
  78. }
  79. }
  80. if len(values) == 0 {
  81. return queryRes
  82. }
  83. series := newSeriesForQuery(query)
  84. startTime := context.TimeRange.GetFromAsMsEpoch()
  85. endTime := context.TimeRange.GetToAsMsEpoch()
  86. step := (endTime - startTime) / int64(len(values)-1)
  87. for _, val := range values {
  88. series.Points = append(series.Points, tsdb.TimePoint{val, null.FloatFrom(float64(startTime))})
  89. startTime += step
  90. }
  91. queryRes.Series = append(queryRes.Series, series)
  92. return queryRes
  93. },
  94. })
  95. }
  96. func registerScenario(scenario *Scenario) {
  97. ScenarioRegistry[scenario.Id] = scenario
  98. }
  99. func newSeriesForQuery(query *tsdb.Query) *tsdb.TimeSeries {
  100. alias := query.Model.Get("alias").MustString("")
  101. if alias == "" {
  102. alias = query.RefId + "-series"
  103. }
  104. return &tsdb.TimeSeries{Name: alias}
  105. }