response_parser.go 2.0 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. rp.parseResult(result.Series, queryRes)
  14. }
  15. /*
  16. for _, serie := range queryRes.Series {
  17. glog.Debug("result", "name", serie.Name, "points", serie.Points)
  18. }
  19. */
  20. return queryRes
  21. }
  22. func (rp *ResponseParser) parseResult(result []Row, queryResult *tsdb.QueryResult) {
  23. for _, r := range result {
  24. for columnIndex, column := range r.Columns {
  25. if column == "time" {
  26. continue
  27. }
  28. var points tsdb.TimeSeriesPoints
  29. for _, k := range r.Values {
  30. points = append(points, rp.parseTimepoint(k, columnIndex))
  31. }
  32. queryResult.Series = append(queryResult.Series, &tsdb.TimeSeries{
  33. Name: rp.formatName(r, column),
  34. Points: points,
  35. })
  36. }
  37. }
  38. }
  39. func (rp *ResponseParser) formatName(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(k []interface{}, valuePosition int) tsdb.TimePoint {
  51. var value null.Float = rp.parseValue(k[valuePosition])
  52. timestampNumber, _ := k[0].(json.Number)
  53. timestamp, err := timestampNumber.Float64()
  54. if err != nil {
  55. glog.Error("Invalid timestamp format. This should never happen!")
  56. }
  57. return tsdb.NewTimePoint(value, timestamp)
  58. }
  59. func (rp *ResponseParser) parseValue(value interface{}) null.Float {
  60. num, ok := value.(json.Number)
  61. if !ok {
  62. return null.FloatFromPtr(nil)
  63. }
  64. fvalue, err := num.Float64()
  65. if err == nil {
  66. return null.FloatFrom(fvalue)
  67. }
  68. ivalue, err := num.Int64()
  69. if err == nil {
  70. return null.FloatFrom(float64(ivalue))
  71. }
  72. return null.FloatFromPtr(nil)
  73. }