mqe.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. Metric Metric
  37. QueryRef *Query
  38. }
  39. func (e *MQEExecutor) Execute(ctx context.Context, queries tsdb.QuerySlice, queryContext *tsdb.QueryContext) *tsdb.BatchResult {
  40. result := &tsdb.BatchResult{}
  41. availableSeries, err := e.tokenClient.GetTokenData(ctx)
  42. if err != nil {
  43. return result.WithError(err)
  44. }
  45. var mqeQueries []*Query
  46. for _, v := range queries {
  47. q, err := e.queryParser.Parse(v.Model, e.DataSource, queryContext)
  48. if err != nil {
  49. return result.WithError(err)
  50. }
  51. mqeQueries = append(mqeQueries, q)
  52. }
  53. var rawQueries []QueryToSend
  54. for _, v := range mqeQueries {
  55. queries, err := v.Build(availableSeries.Metrics)
  56. if err != nil {
  57. return result.WithError(err)
  58. }
  59. rawQueries = append(rawQueries, queries...)
  60. }
  61. e.log.Debug("Sending request", "url", e.DataSource.Url)
  62. queryResult, err := e.apiClient.PerformRequests(ctx, rawQueries)
  63. if err != nil {
  64. return result.WithError(err)
  65. }
  66. result.QueryResults = make(map[string]*tsdb.QueryResult)
  67. result.QueryResults["A"] = queryResult
  68. return result
  69. }