prometheus_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package prometheus
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/tsdb"
  7. "github.com/grafana/grafana/pkg/components/simplejson"
  8. p "github.com/prometheus/common/model"
  9. . "github.com/smartystreets/goconvey/convey"
  10. )
  11. func TestPrometheus(t *testing.T) {
  12. Convey("Prometheus", t, func() {
  13. dsInfo := &models.DataSource{
  14. JsonData: simplejson.New(),
  15. }
  16. Convey("converting metric name", func() {
  17. metric := map[p.LabelName]p.LabelValue{
  18. p.LabelName("app"): p.LabelValue("backend"),
  19. p.LabelName("device"): p.LabelValue("mobile"),
  20. }
  21. query := &PrometheusQuery{
  22. LegendFormat: "legend {{app}} {{ device }} {{broken}}",
  23. }
  24. So(formatLegend(metric, query), ShouldEqual, "legend backend mobile {{broken}}")
  25. })
  26. Convey("build full serie name", func() {
  27. metric := map[p.LabelName]p.LabelValue{
  28. p.LabelName(p.MetricNameLabel): p.LabelValue("http_request_total"),
  29. p.LabelName("app"): p.LabelValue("backend"),
  30. p.LabelName("device"): p.LabelValue("mobile"),
  31. }
  32. query := &PrometheusQuery{
  33. LegendFormat: "",
  34. }
  35. So(formatLegend(metric, query), ShouldEqual, `http_request_total{app="backend", device="mobile"}`)
  36. })
  37. Convey("parsing query model with step", func() {
  38. json := `{
  39. "expr": "go_goroutines",
  40. "format": "time_series",
  41. "refId": "A"
  42. }`
  43. jsonModel, _ := simplejson.NewJson([]byte(json))
  44. queryContext := &tsdb.TsdbQuery{}
  45. queryModels := []*tsdb.Query{
  46. {Model: jsonModel},
  47. }
  48. Convey("with 48h time range", func() {
  49. queryContext.TimeRange = tsdb.NewTimeRange("12h", "now")
  50. models, err := parseQuery(dsInfo, queryModels, queryContext)
  51. So(err, ShouldBeNil)
  52. model := models[0]
  53. So(model.Step, ShouldEqual, time.Second*30)
  54. })
  55. })
  56. Convey("parsing query model without step parameter", func() {
  57. json := `{
  58. "expr": "go_goroutines",
  59. "format": "time_series",
  60. "intervalFactor": 1,
  61. "refId": "A"
  62. }`
  63. jsonModel, _ := simplejson.NewJson([]byte(json))
  64. queryContext := &tsdb.TsdbQuery{}
  65. queryModels := []*tsdb.Query{
  66. {Model: jsonModel},
  67. }
  68. Convey("with 48h time range", func() {
  69. queryContext.TimeRange = tsdb.NewTimeRange("48h", "now")
  70. models, err := parseQuery(dsInfo, queryModels, queryContext)
  71. So(err, ShouldBeNil)
  72. model := models[0]
  73. So(model.Step, ShouldEqual, time.Minute*2)
  74. })
  75. Convey("with 1h time range", func() {
  76. queryContext.TimeRange = tsdb.NewTimeRange("1h", "now")
  77. models, err := parseQuery(dsInfo, queryModels, queryContext)
  78. So(err, ShouldBeNil)
  79. model := models[0]
  80. So(model.Step, ShouldEqual, time.Second*15)
  81. })
  82. })
  83. Convey("parsing query model with intervalFactor", func() {
  84. Convey("high intervalFactor", func() {
  85. json := `{
  86. "expr": "go_goroutines",
  87. "format": "time_series",
  88. "intervalFactor": 10,
  89. "refId": "A"
  90. }`
  91. jsonModel, _ := simplejson.NewJson([]byte(json))
  92. queryContext := &tsdb.TsdbQuery{}
  93. queryModels := []*tsdb.Query{
  94. {Model: jsonModel},
  95. }
  96. Convey("with 48h time range", func() {
  97. queryContext.TimeRange = tsdb.NewTimeRange("48h", "now")
  98. models, err := parseQuery(dsInfo, queryModels, queryContext)
  99. So(err, ShouldBeNil)
  100. model := models[0]
  101. So(model.Step, ShouldEqual, time.Minute*20)
  102. })
  103. })
  104. Convey("low intervalFactor", func() {
  105. json := `{
  106. "expr": "go_goroutines",
  107. "format": "time_series",
  108. "intervalFactor": 1,
  109. "refId": "A"
  110. }`
  111. jsonModel, _ := simplejson.NewJson([]byte(json))
  112. queryContext := &tsdb.TsdbQuery{}
  113. queryModels := []*tsdb.Query{
  114. {Model: jsonModel},
  115. }
  116. Convey("with 48h time range", func() {
  117. queryContext.TimeRange = tsdb.NewTimeRange("48h", "now")
  118. models, err := parseQuery(dsInfo, queryModels, queryContext)
  119. So(err, ShouldBeNil)
  120. model := models[0]
  121. So(model.Step, ShouldEqual, time.Minute*2)
  122. })
  123. })
  124. })
  125. })
  126. }