package prometheus import ( "context" "fmt" "github.com/grafana/grafana-azure-sdk-go/v2/azsettings" "github.com/grafana/grafana-plugin-sdk-go/backend" sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana/pkg/promlib" "github.com/grafana/grafana/pkg/tsdb/prometheus/azureauth" ) type Service struct { lib *promlib.Service } func ProvideService(httpClientProvider *sdkhttpclient.Provider) *Service { plog := backend.NewLoggerWith("logger", "tsdb.prometheus") plog.Debug("Initializing") return &Service{ lib: promlib.NewService(httpClientProvider, plog, extendClientOpts), } } func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { return s.lib.QueryData(ctx, req) } func (s *Service) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { return s.lib.CallResource(ctx, req, sender) } func (s *Service) GetBuildInfo(ctx context.Context, req promlib.BuildInfoRequest) (*promlib.BuildInfoResponse, error) { return s.lib.GetBuildInfo(ctx, req) } func (s *Service) GetHeuristics(ctx context.Context, req promlib.HeuristicsRequest) (*promlib.Heuristics, error) { return s.lib.GetHeuristics(ctx, req) } func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { return s.lib.CheckHealth(ctx, req) } func extendClientOpts(ctx context.Context, settings backend.DataSourceInstanceSettings, clientOpts *sdkhttpclient.Options) error { // Set SigV4 service namespace if clientOpts.SigV4 != nil { clientOpts.SigV4.Service = "aps" } azureSettings, err := azsettings.ReadSettings(ctx) if err != nil { return fmt.Errorf("failed to read Azure settings from Grafana: %v", err) } // Set Azure authentication if azureSettings.AzureAuthEnabled { err = azureauth.ConfigureAzureAuthentication(settings, azureSettings, clientOpts) if err != nil { return fmt.Errorf("error configuring Azure auth: %v", err) } } return nil }