response_parser_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package influxdb
  15. import (
  16. "encoding/json"
  17. "testing"
  18. . "github.com/smartystreets/goconvey/convey"
  19. )
  20. func TestInfluxdbResponseParser(t *testing.T) {
  21. Convey("Influxdb response parser", t, func() {
  22. Convey("Response parser", func() {
  23. parser := &ResponseParser{}
  24. response := &Response{
  25. Results: []Result{
  26. {
  27. Series: []Row{
  28. {
  29. Name: "cpu",
  30. Columns: []string{"time", "mean", "sum"},
  31. Tags: map[string]string{"datacenter": "America"},
  32. Values: [][]interface{}{
  33. {json.Number("111"), json.Number("222"), json.Number("333")},
  34. {json.Number("111"), json.Number("222"), json.Number("333")},
  35. {json.Number("111"), json.Number("null"), json.Number("333")},
  36. },
  37. },
  38. },
  39. },
  40. },
  41. }
  42. query := &Query{}
  43. result := parser.Parse(response, query)
  44. Convey("can parse all series", func() {
  45. So(len(result.Series), ShouldEqual, 1)
  46. })
  47. Convey("can parse all points", func() {
  48. So(len(result.Series[0].Points), ShouldEqual, 3)
  49. //So(len(result.Series[1].Points), ShouldEqual, 3)
  50. })
  51. Convey("can parse multi row result", func() {
  52. So(result.Series[0].Points[1].Value(), ShouldEqual, float64(222))
  53. //So(result.Series[1].Points[1].Value(), ShouldEqual, float64(333))
  54. })
  55. Convey("can parse null points", func() {
  56. So(result.Series[0].Points[2].IsValid(), ShouldBeFalse)
  57. })
  58. Convey("can format serie names", func() {
  59. So(result.Series[0].Name, ShouldEqual, "cpu.mean-sum")
  60. So(result.Series[0].Tags, ShouldResemble, map[string]string{"datacenter": "America"})
  61. //So(result.Series[1].Name, ShouldEqual, "cpu.sum")
  62. //So(result.Series[1].Tags, ShouldResemble, map[string]string{"datacenter": "America"})
  63. })
  64. })
  65. Convey("Response parser with alias", func() {
  66. parser := &ResponseParser{}
  67. response := &Response{
  68. Results: []Result{
  69. {
  70. Series: []Row{
  71. {
  72. Name: "cpu.upc",
  73. Columns: []string{"time", "mean", "sum"},
  74. Tags: map[string]string{
  75. "datacenter": "America",
  76. "dc.region.name": "Northeast",
  77. },
  78. Values: [][]interface{}{
  79. {json.Number("111"), json.Number("222"), json.Number("333")},
  80. },
  81. },
  82. },
  83. },
  84. },
  85. }
  86. Convey("$ alias", func() {
  87. Convey("simple alias", func() {
  88. query := &Query{Alias: "serie alias"}
  89. result := parser.Parse(response, query)
  90. So(result.Series[0].Name, ShouldEqual, "serie alias")
  91. })
  92. Convey("measurement alias", func() {
  93. query := &Query{Alias: "alias $m $measurement", Measurement: "10m"}
  94. result := parser.Parse(response, query)
  95. So(result.Series[0].Name, ShouldEqual, "alias 10m 10m")
  96. })
  97. Convey("column alias", func() {
  98. query := &Query{Alias: "alias $col", Measurement: "10m"}
  99. result := parser.Parse(response, query)
  100. So(result.Series[0].Name, ShouldEqual, "alias mean-sum")
  101. //So(result.Series[1].Name, ShouldEqual, "alias sum")
  102. })
  103. Convey("tag alias", func() {
  104. query := &Query{Alias: "alias $tag_datacenter"}
  105. result := parser.Parse(response, query)
  106. So(result.Series[0].Name, ShouldEqual, "alias America")
  107. })
  108. Convey("segment alias", func() {
  109. query := &Query{Alias: "alias $1"}
  110. result := parser.Parse(response, query)
  111. So(result.Series[0].Name, ShouldEqual, "alias upc")
  112. })
  113. Convey("segment position out of bound", func() {
  114. query := &Query{Alias: "alias $5"}
  115. result := parser.Parse(response, query)
  116. So(result.Series[0].Name, ShouldEqual, "alias $5")
  117. })
  118. })
  119. Convey("[[]] alias", func() {
  120. Convey("simple alias", func() {
  121. query := &Query{Alias: "serie alias"}
  122. result := parser.Parse(response, query)
  123. So(result.Series[0].Name, ShouldEqual, "serie alias")
  124. })
  125. Convey("measurement alias", func() {
  126. query := &Query{Alias: "alias [[m]] [[measurement]]", Measurement: "10m"}
  127. result := parser.Parse(response, query)
  128. So(result.Series[0].Name, ShouldEqual, "alias 10m 10m")
  129. })
  130. Convey("column alias", func() {
  131. query := &Query{Alias: "alias [[col]]", Measurement: "10m"}
  132. result := parser.Parse(response, query)
  133. So(result.Series[0].Name, ShouldEqual, "alias mean-sum")
  134. //So(result.Series[1].Name, ShouldEqual, "alias sum")
  135. })
  136. Convey("tag alias", func() {
  137. query := &Query{Alias: "alias [[tag_datacenter]]"}
  138. result := parser.Parse(response, query)
  139. So(result.Series[0].Name, ShouldEqual, "alias America")
  140. })
  141. Convey("tag alias with periods", func() {
  142. query := &Query{Alias: "alias [[tag_dc.region.name]]"}
  143. result := parser.Parse(response, query)
  144. So(result.Series[0].Name, ShouldEqual, "alias Northeast")
  145. })
  146. })
  147. })
  148. })
  149. }