response_parser.go 1.9 KB

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