wrapper.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package proxy
  2. import (
  3. "github.com/golang/protobuf/ptypes"
  4. "github.com/grafana/grafana/pkg/components/null"
  5. "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/tsdb"
  7. proto "github.com/grafana/grafana/pkg/tsdb/models"
  8. "golang.org/x/net/context"
  9. )
  10. type TsdbWrapper struct {
  11. TsdbPlugin
  12. }
  13. func (tw *TsdbWrapper) Query(ctx context.Context, ds *models.DataSource, query *tsdb.TsdbQuery) (*tsdb.Response, error) {
  14. jsonData, err := ds.JsonData.MarshalJSON()
  15. if err != nil {
  16. return nil, err
  17. }
  18. now, err := ptypes.TimestampProto(query.TimeRange.Now)
  19. if err != nil {
  20. return nil, err
  21. }
  22. pbQuery := &proto.TsdbQuery{
  23. Datasource: &proto.DatasourceInfo{
  24. Access: string(ds.Access),
  25. BasicAuth: ds.BasicAuth,
  26. BasicAuthUser: ds.BasicAuthUser,
  27. BasicAuthPassword: ds.BasicAuthPassword,
  28. JsonData: string(jsonData),
  29. Name: ds.Name,
  30. Type: ds.Type,
  31. Url: ds.Url,
  32. Id: ds.Id,
  33. OrgId: ds.OrgId,
  34. },
  35. Timerange: &proto.Timerange{
  36. From: query.TimeRange.From,
  37. To: query.TimeRange.To,
  38. Now: now,
  39. },
  40. Queries: []*proto.Query{},
  41. }
  42. for _, q := range query.Queries {
  43. modelJson, _ := q.Model.MarshalJSON()
  44. pbQuery.Queries = append(pbQuery.Queries, &proto.Query{
  45. ModelJson: string(modelJson),
  46. IntervalMs: q.IntervalMs,
  47. RefId: q.RefId,
  48. MaxDataPoints: q.MaxDataPoints,
  49. })
  50. }
  51. pbres, err := tw.TsdbPlugin.Query(ctx, pbQuery)
  52. if err != nil {
  53. return nil, err
  54. }
  55. res := &tsdb.Response{
  56. Message: pbres.Message,
  57. Results: map[string]*tsdb.QueryResult{},
  58. }
  59. for _, r := range pbres.Results {
  60. res.Results[r.RefId] = &tsdb.QueryResult{
  61. RefId: r.RefId,
  62. Series: []*tsdb.TimeSeries{},
  63. }
  64. for _, s := range r.Series {
  65. points := tsdb.TimeSeriesPoints{}
  66. for _, p := range s.Points {
  67. if p.Timestamp != nil {
  68. po := tsdb.NewTimePoint(null.FloatFrom(p.Value), float64(p.Timestamp.Seconds))
  69. points = append(points, po)
  70. }
  71. }
  72. res.Results[r.RefId].Series = append(res.Results[r.RefId].Series, &tsdb.TimeSeries{
  73. Name: s.Name,
  74. Tags: s.Tags,
  75. Points: points,
  76. })
  77. }
  78. }
  79. return res, nil
  80. }