azuremonitor.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package azuremonitor
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "regexp"
  7. "github.com/grafana/grafana/pkg/infra/log"
  8. "github.com/grafana/grafana/pkg/models"
  9. "github.com/grafana/grafana/pkg/tsdb"
  10. )
  11. var (
  12. azlog log.Logger
  13. legendKeyFormat *regexp.Regexp
  14. )
  15. // AzureMonitorExecutor executes queries for the Azure Monitor datasource - all four services
  16. type AzureMonitorExecutor struct {
  17. httpClient *http.Client
  18. dsInfo *models.DataSource
  19. }
  20. // NewAzureMonitorExecutor initializes a http client
  21. func NewAzureMonitorExecutor(dsInfo *models.DataSource) (tsdb.TsdbQueryEndpoint, error) {
  22. httpClient, err := dsInfo.GetHttpClient()
  23. if err != nil {
  24. return nil, err
  25. }
  26. return &AzureMonitorExecutor{
  27. httpClient: httpClient,
  28. dsInfo: dsInfo,
  29. }, nil
  30. }
  31. func init() {
  32. azlog = log.New("tsdb.azuremonitor")
  33. tsdb.RegisterTsdbQueryEndpoint("grafana-azure-monitor-datasource", NewAzureMonitorExecutor)
  34. legendKeyFormat = regexp.MustCompile(`\{\{\s*(.+?)\s*\}\}`)
  35. }
  36. // Query takes in the frontend queries, parses them into the query format
  37. // expected by chosen Azure Monitor service (Azure Monitor, App Insights etc.)
  38. // executes the queries against the API and parses the response into
  39. // the right format
  40. func (e *AzureMonitorExecutor) Query(ctx context.Context, dsInfo *models.DataSource, tsdbQuery *tsdb.TsdbQuery) (*tsdb.Response, error) {
  41. var result *tsdb.Response
  42. var err error
  43. var azureMonitorQueries []*tsdb.Query
  44. for _, query := range tsdbQuery.Queries {
  45. queryType := query.Model.Get("queryType").MustString("")
  46. switch queryType {
  47. case "Azure Monitor":
  48. azureMonitorQueries = append(azureMonitorQueries, query)
  49. default:
  50. return nil, fmt.Errorf("Alerting not supported for %s", queryType)
  51. }
  52. }
  53. azDatasource := &AzureMonitorDatasource{
  54. httpClient: e.httpClient,
  55. dsInfo: e.dsInfo,
  56. }
  57. result, err = azDatasource.executeTimeSeriesQuery(ctx, azureMonitorQueries, tsdbQuery.TimeRange)
  58. return result, err
  59. }