response_parser.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package influxdb
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. "github.com/grafana/grafana/pkg/tsdb"
  7. "gopkg.in/guregu/null.v3"
  8. )
  9. type ResponseParser struct{}
  10. func (rp *ResponseParser) Parse(response *Response) *tsdb.QueryResult {
  11. queryRes := tsdb.NewQueryResult()
  12. for _, result := range response.Results {
  13. queryRes.Series = append(queryRes.Series, rp.transformRows(result.Series, queryRes)...)
  14. }
  15. return queryRes
  16. }
  17. func (rp *ResponseParser) transformRows(rows []Row, queryResult *tsdb.QueryResult) tsdb.TimeSeriesSlice {
  18. var result tsdb.TimeSeriesSlice
  19. for _, row := range rows {
  20. for columnIndex, column := range row.Columns {
  21. if column == "time" {
  22. continue
  23. }
  24. var points tsdb.TimeSeriesPoints
  25. for _, valuePair := range row.Values {
  26. point, err := rp.parseTimepoint(valuePair, columnIndex)
  27. if err == nil {
  28. points = append(points, point)
  29. }
  30. }
  31. result = append(result, &tsdb.TimeSeries{
  32. Name: rp.formatSerieName(row, column),
  33. Points: points,
  34. })
  35. }
  36. }
  37. return result
  38. }
  39. func (rp *ResponseParser) formatSerieName(row Row, column string) string {
  40. var tags []string
  41. for k, v := range row.Tags {
  42. tags = append(tags, fmt.Sprintf("%s: %s", k, v))
  43. }
  44. tagText := ""
  45. if len(tags) > 0 {
  46. tagText = fmt.Sprintf(" { %s }", strings.Join(tags, " "))
  47. }
  48. return fmt.Sprintf("%s.%s%s", row.Name, column, tagText)
  49. }
  50. func (rp *ResponseParser) parseTimepoint(valuePair []interface{}, valuePosition int) (tsdb.TimePoint, error) {
  51. var value null.Float = rp.parseValue(valuePair[valuePosition])
  52. timestampNumber, _ := valuePair[0].(json.Number)
  53. timestamp, err := timestampNumber.Float64()
  54. if err != nil {
  55. return tsdb.TimePoint{}, err
  56. }
  57. return tsdb.NewTimePoint(value, timestamp), nil
  58. }
  59. func (rp *ResponseParser) parseValue(value interface{}) null.Float {
  60. number, ok := value.(json.Number)
  61. if !ok {
  62. return null.FloatFromPtr(nil)
  63. }
  64. fvalue, err := number.Float64()
  65. if err == nil {
  66. return null.FloatFrom(fvalue)
  67. }
  68. ivalue, err := number.Int64()
  69. if err == nil {
  70. return null.FloatFrom(float64(ivalue))
  71. }
  72. return null.FloatFromPtr(nil)
  73. }