mqe.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package mqe
  2. import (
  3. "context"
  4. "net/http"
  5. "github.com/grafana/grafana/pkg/log"
  6. "github.com/grafana/grafana/pkg/models"
  7. "github.com/grafana/grafana/pkg/tsdb"
  8. )
  9. type MQEExecutor struct {
  10. *models.DataSource
  11. queryParser *QueryParser
  12. apiClient *apiClient
  13. httpClient *http.Client
  14. log log.Logger
  15. tokenClient *TokenClient
  16. }
  17. func NewMQEExecutor(dsInfo *models.DataSource) (tsdb.Executor, error) {
  18. httpclient, err := dsInfo.GetHttpClient()
  19. if err != nil {
  20. return nil, err
  21. }
  22. return &MQEExecutor{
  23. DataSource: dsInfo,
  24. httpClient: httpclient,
  25. log: log.New("tsdb.mqe"),
  26. queryParser: NewQueryParser(),
  27. apiClient: NewApiClient(httpclient, dsInfo),
  28. tokenClient: NewTokenClient(dsInfo),
  29. }, nil
  30. }
  31. func init() {
  32. tsdb.RegisterExecutor("mqe-datasource", NewMQEExecutor)
  33. }
  34. type QueryToSend struct {
  35. RawQuery string
  36. QueryRef *Query
  37. }
  38. func (e *MQEExecutor) Execute(ctx context.Context, queries tsdb.QuerySlice, queryContext *tsdb.QueryContext) *tsdb.BatchResult {
  39. result := &tsdb.BatchResult{}
  40. availableSeries, err := e.tokenClient.GetTokenData(ctx)
  41. if err != nil {
  42. return result.WithError(err)
  43. }
  44. var mqeQueries []*Query
  45. for _, v := range queries {
  46. q, err := e.queryParser.Parse(v.Model, e.DataSource, queryContext)
  47. if err != nil {
  48. return result.WithError(err)
  49. }
  50. mqeQueries = append(mqeQueries, q)
  51. }
  52. var rawQueries []QueryToSend
  53. for _, v := range mqeQueries {
  54. queries, err := v.Build(availableSeries.Metrics)
  55. if err != nil {
  56. return result.WithError(err)
  57. }
  58. rawQueries = append(rawQueries, queries...)
  59. }
  60. e.log.Debug("Sending request", "url", e.DataSource.Url)
  61. queryResult, err := e.apiClient.PerformRequests(ctx, rawQueries)
  62. if err != nil {
  63. return result.WithError(err)
  64. }
  65. result.QueryResults = make(map[string]*tsdb.QueryResult)
  66. result.QueryResults["A"] = queryResult
  67. return result
  68. }