response_parser.go 2.0 KB

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