response_parser_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package influxdb
  2. import (
  3. "encoding/json"
  4. "testing"
  5. "github.com/grafana/grafana/pkg/setting"
  6. . "github.com/smartystreets/goconvey/convey"
  7. )
  8. func TestInfluxdbResponseParser(t *testing.T) {
  9. Convey("Influxdb response parser", t, func() {
  10. Convey("Response parser", func() {
  11. parser := &ResponseParser{}
  12. cfg := setting.NewCfg()
  13. cfg.Load(&setting.CommandLineArgs{
  14. HomePath: "../../../",
  15. })
  16. response := &Response{
  17. Results: []Result{
  18. {
  19. Series: []Row{
  20. {
  21. Name: "cpu",
  22. Columns: []string{"time", "mean", "sum"},
  23. Tags: map[string]string{"datacenter": "America"},
  24. Values: [][]interface{}{
  25. {json.Number("111"), json.Number("222"), json.Number("333")},
  26. {json.Number("111"), json.Number("222"), json.Number("333")},
  27. {json.Number("111"), json.Number("null"), json.Number("333")},
  28. },
  29. },
  30. },
  31. },
  32. },
  33. }
  34. query := &Query{}
  35. result := parser.Parse(response, query)
  36. Convey("can parse all series", func() {
  37. So(len(result.Series), ShouldEqual, 2)
  38. })
  39. Convey("can parse all points", func() {
  40. So(len(result.Series[0].Points), ShouldEqual, 3)
  41. So(len(result.Series[1].Points), ShouldEqual, 3)
  42. })
  43. Convey("can parse multi row result", func() {
  44. So(result.Series[0].Points[1][0].Float64, ShouldEqual, float64(222))
  45. So(result.Series[1].Points[1][0].Float64, ShouldEqual, float64(333))
  46. })
  47. Convey("can parse null points", func() {
  48. So(result.Series[0].Points[2][0].Valid, ShouldBeFalse)
  49. })
  50. Convey("can format serie names", func() {
  51. So(result.Series[0].Name, ShouldEqual, "cpu.mean { datacenter: America }")
  52. So(result.Series[1].Name, ShouldEqual, "cpu.sum { datacenter: America }")
  53. })
  54. })
  55. Convey("Response parser with alias", func() {
  56. parser := &ResponseParser{}
  57. response := &Response{
  58. Results: []Result{
  59. {
  60. Series: []Row{
  61. {
  62. Name: "cpu.upc",
  63. Columns: []string{"time", "mean", "sum"},
  64. Tags: map[string]string{
  65. "datacenter": "America",
  66. "dc.region.name": "Northeast",
  67. },
  68. Values: [][]interface{}{
  69. {json.Number("111"), json.Number("222"), json.Number("333")},
  70. },
  71. },
  72. },
  73. },
  74. },
  75. }
  76. Convey("$ alias", func() {
  77. Convey("simple alias", func() {
  78. query := &Query{Alias: "serie alias"}
  79. result := parser.Parse(response, query)
  80. So(result.Series[0].Name, ShouldEqual, "serie alias")
  81. })
  82. Convey("measurement alias", func() {
  83. query := &Query{Alias: "alias $m $measurement", Measurement: "10m"}
  84. result := parser.Parse(response, query)
  85. So(result.Series[0].Name, ShouldEqual, "alias 10m 10m")
  86. })
  87. Convey("column alias", func() {
  88. query := &Query{Alias: "alias $col", Measurement: "10m"}
  89. result := parser.Parse(response, query)
  90. So(result.Series[0].Name, ShouldEqual, "alias mean")
  91. So(result.Series[1].Name, ShouldEqual, "alias sum")
  92. })
  93. Convey("tag alias", func() {
  94. query := &Query{Alias: "alias $tag_datacenter"}
  95. result := parser.Parse(response, query)
  96. So(result.Series[0].Name, ShouldEqual, "alias America")
  97. })
  98. Convey("segment alias", func() {
  99. query := &Query{Alias: "alias $1"}
  100. result := parser.Parse(response, query)
  101. So(result.Series[0].Name, ShouldEqual, "alias upc")
  102. })
  103. Convey("segment position out of bound", func() {
  104. query := &Query{Alias: "alias $5"}
  105. result := parser.Parse(response, query)
  106. So(result.Series[0].Name, ShouldEqual, "alias $5")
  107. })
  108. })
  109. Convey("[[]] alias", func() {
  110. Convey("simple alias", func() {
  111. query := &Query{Alias: "serie alias"}
  112. result := parser.Parse(response, query)
  113. So(result.Series[0].Name, ShouldEqual, "serie alias")
  114. })
  115. Convey("measurement alias", func() {
  116. query := &Query{Alias: "alias [[m]] [[measurement]]", Measurement: "10m"}
  117. result := parser.Parse(response, query)
  118. So(result.Series[0].Name, ShouldEqual, "alias 10m 10m")
  119. })
  120. Convey("column alias", func() {
  121. query := &Query{Alias: "alias [[col]]", Measurement: "10m"}
  122. result := parser.Parse(response, query)
  123. So(result.Series[0].Name, ShouldEqual, "alias mean")
  124. So(result.Series[1].Name, ShouldEqual, "alias sum")
  125. })
  126. Convey("tag alias", func() {
  127. query := &Query{Alias: "alias [[tag_datacenter]]"}
  128. result := parser.Parse(response, query)
  129. So(result.Series[0].Name, ShouldEqual, "alias America")
  130. })
  131. Convey("tag alias with periods", func() {
  132. query := &Query{Alias: "alias [[tag_dc.region.name]]"}
  133. result := parser.Parse(response, query)
  134. So(result.Series[0].Name, ShouldEqual, "alias Northeast")
  135. })
  136. })
  137. })
  138. })
  139. }