From b411aa7266129e3e7b5313317dfc7d0c8a50cdeb Mon Sep 17 00:00:00 2001 From: Andrew Hackmann <5140848+bossinc@users.noreply.github.com> Date: Fri, 26 Jan 2024 14:53:55 -0800 Subject: [PATCH] Azure Monitor: use NewLoggerWith func instead of backend.Logger (#81124) using NewLoggerWith --- .../azuremonitor-resource-handler.go | 6 ++- .../azuremonitor-resource-handler_test.go | 3 ++ pkg/tsdb/azuremonitor/azuremonitor.go | 37 +++++++++++-------- pkg/tsdb/azuremonitor/azuremonitor_test.go | 3 +- .../azure-log-analytics-datasource.go | 10 +++-- .../metrics/azuremonitor-datasource.go | 8 ++-- .../azure-resource-graph-datasource.go | 8 ++-- pkg/tsdb/azuremonitor/types/types.go | 2 + 8 files changed, 49 insertions(+), 28 deletions(-) diff --git a/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go b/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go index e01e6e505d2..13d4c411b87 100644 --- a/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go +++ b/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/log" "github.com/grafana/grafana-plugin-sdk-go/backend/resource/httpadapter" "github.com/grafana/grafana/pkg/tsdb/azuremonitor/types" @@ -24,6 +25,7 @@ func getTarget(original string) (target string, err error) { } type httpServiceProxy struct { + logger log.Logger } func (s *httpServiceProxy) Do(rw http.ResponseWriter, req *http.Request, cli *http.Client) (http.ResponseWriter, error) { @@ -38,7 +40,7 @@ func (s *httpServiceProxy) Do(rw http.ResponseWriter, req *http.Request, cli *ht } defer func() { if err := res.Body.Close(); err != nil { - backend.Logger.Warn("Failed to close response body", "err", err) + s.logger.Warn("Failed to close response body", "err", err) } }() @@ -91,7 +93,7 @@ func writeResponse(rw http.ResponseWriter, code int, msg string) { func (s *Service) handleResourceReq(subDataSource string) func(rw http.ResponseWriter, req *http.Request) { return func(rw http.ResponseWriter, req *http.Request) { - backend.Logger.Debug("Received resource call", "url", req.URL.String(), "method", req.Method) + s.logger.Debug("Received resource call", "url", req.URL.String(), "method", req.Method) newPath, err := getTarget(req.URL.Path) if err != nil { diff --git a/pkg/tsdb/azuremonitor/azuremonitor-resource-handler_test.go b/pkg/tsdb/azuremonitor/azuremonitor-resource-handler_test.go index d5e251f2fef..72794dd8248 100644 --- a/pkg/tsdb/azuremonitor/azuremonitor-resource-handler_test.go +++ b/pkg/tsdb/azuremonitor/azuremonitor-resource-handler_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/grafana/grafana-azure-sdk-go/azsettings" + "github.com/grafana/grafana-plugin-sdk-go/backend/log" "github.com/grafana/grafana/pkg/tsdb/azuremonitor/metrics" "github.com/grafana/grafana/pkg/tsdb/azuremonitor/types" @@ -106,6 +107,7 @@ func Test_handleResourceReq(t *testing.T) { azureMonitor: { URL: routes[azsettings.AzurePublic][azureMonitor].URL, HTTPClient: &http.Client{}, + Logger: log.DefaultLogger, }, }, }, @@ -114,6 +116,7 @@ func Test_handleResourceReq(t *testing.T) { Proxy: proxy, }, }, + logger: log.DefaultLogger, } rw := httptest.NewRecorder() req, err := http.NewRequest(http.MethodGet, "http://foo/azuremonitor/subscriptions/44693801", nil) diff --git a/pkg/tsdb/azuremonitor/azuremonitor.go b/pkg/tsdb/azuremonitor/azuremonitor.go index 11320d52b91..50a2ee276d7 100644 --- a/pkg/tsdb/azuremonitor/azuremonitor.go +++ b/pkg/tsdb/azuremonitor/azuremonitor.go @@ -16,6 +16,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend/datasource" "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt" + "github.com/grafana/grafana-plugin-sdk-go/backend/log" "github.com/grafana/grafana-plugin-sdk-go/backend/resource/httpadapter" "github.com/grafana/grafana/pkg/tsdb/azuremonitor/azmoncredentials" @@ -26,19 +27,23 @@ import ( ) func ProvideService(httpClientProvider *httpclient.Provider) *Service { - proxy := &httpServiceProxy{} + logger := backend.NewLoggerWith("logger", "tsdb.azuremonitor") + proxy := &httpServiceProxy{ + logger: logger, + } executors := map[string]azDatasourceExecutor{ - azureMonitor: &metrics.AzureMonitorDatasource{Proxy: proxy}, - azureLogAnalytics: &loganalytics.AzureLogAnalyticsDatasource{Proxy: proxy}, - azureResourceGraph: &resourcegraph.AzureResourceGraphDatasource{Proxy: proxy}, - azureTraces: &loganalytics.AzureLogAnalyticsDatasource{Proxy: proxy}, + azureMonitor: &metrics.AzureMonitorDatasource{Proxy: proxy, Logger: logger}, + azureLogAnalytics: &loganalytics.AzureLogAnalyticsDatasource{Proxy: proxy, Logger: logger}, + azureResourceGraph: &resourcegraph.AzureResourceGraphDatasource{Proxy: proxy, Logger: logger}, + azureTraces: &loganalytics.AzureLogAnalyticsDatasource{Proxy: proxy, Logger: logger}, } - im := datasource.NewInstanceManager(NewInstanceSettings(httpClientProvider, executors)) + im := datasource.NewInstanceManager(NewInstanceSettings(httpClientProvider, executors, logger)) s := &Service{ im: im, executors: executors, + logger: logger, } s.queryMux = s.newQueryMux() @@ -61,9 +66,10 @@ type Service struct { queryMux *datasource.QueryTypeMux resourceHandler backend.CallResourceHandler + logger log.Logger } -func getDatasourceService(ctx context.Context, settings *backend.DataSourceInstanceSettings, azureSettings *azsettings.AzureSettings, clientProvider *httpclient.Provider, dsInfo types.DatasourceInfo, routeName string) (types.DatasourceService, error) { +func getDatasourceService(ctx context.Context, settings *backend.DataSourceInstanceSettings, azureSettings *azsettings.AzureSettings, clientProvider *httpclient.Provider, dsInfo types.DatasourceInfo, routeName string, logger log.Logger) (types.DatasourceService, error) { route := dsInfo.Routes[routeName] client, err := newHTTPClient(ctx, route, dsInfo, settings, azureSettings, clientProvider) if err != nil { @@ -72,10 +78,11 @@ func getDatasourceService(ctx context.Context, settings *backend.DataSourceInsta return types.DatasourceService{ URL: dsInfo.Routes[routeName].URL, HTTPClient: client, + Logger: logger, }, nil } -func NewInstanceSettings(clientProvider *httpclient.Provider, executors map[string]azDatasourceExecutor) datasource.InstanceFactoryFunc { +func NewInstanceSettings(clientProvider *httpclient.Provider, executors map[string]azDatasourceExecutor, logger log.Logger) datasource.InstanceFactoryFunc { return func(ctx context.Context, settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { jsonData := map[string]any{} err := json.Unmarshal(settings.JSONData, &jsonData) @@ -91,7 +98,7 @@ func NewInstanceSettings(clientProvider *httpclient.Provider, executors map[stri azureSettings, err := azsettings.ReadSettings(ctx) if err != nil { - backend.Logger.Error("failed to read Azure settings from Grafana", "error", err.Error()) + logger.Error("failed to read Azure settings from Grafana", "error", err.Error()) return nil, err } @@ -124,7 +131,7 @@ func NewInstanceSettings(clientProvider *httpclient.Provider, executors map[stri } for routeName := range executors { - service, err := getDatasourceService(ctx, &settings, azureSettings, clientProvider, model, routeName) + service, err := getDatasourceService(ctx, &settings, azureSettings, clientProvider, model, routeName, logger) if err != nil { return nil, err } @@ -300,7 +307,7 @@ func checkAzureMonitorResourceGraphHealth(dsInfo types.DatasourceInfo, subscript return res, nil } -func metricCheckHealth(dsInfo types.DatasourceInfo) (message string, defaultSubscription string, status backend.HealthStatus) { +func metricCheckHealth(dsInfo types.DatasourceInfo, logger log.Logger) (message string, defaultSubscription string, status backend.HealthStatus) { defaultSubscription = dsInfo.Settings.SubscriptionId metricsRes, err := queryMetricHealth(dsInfo) if err != nil { @@ -323,7 +330,7 @@ func metricCheckHealth(dsInfo types.DatasourceInfo) (message string, defaultSubs } return fmt.Sprintf("Error connecting to Azure Monitor endpoint: %s", string(body)), defaultSubscription, backend.HealthStatusError } - subscriptions, err := parseSubscriptions(metricsRes) + subscriptions, err := parseSubscriptions(metricsRes, logger) if err != nil { return err.Error(), defaultSubscription, backend.HealthStatusError } @@ -387,7 +394,7 @@ func graphLogHealthCheck(dsInfo types.DatasourceInfo, defaultSubscription string return "Successfully connected to Azure Resource Graph endpoint.", backend.HealthStatusOk } -func parseSubscriptions(res *http.Response) ([]string, error) { +func parseSubscriptions(res *http.Response, logger log.Logger) ([]string, error) { var target struct { Value []struct { SubscriptionId string `json:"subscriptionId"` @@ -399,7 +406,7 @@ func parseSubscriptions(res *http.Response) ([]string, error) { } defer func() { if err := res.Body.Close(); err != nil { - backend.Logger.Warn("Failed to close response body", "err", err) + logger.Warn("Failed to close response body", "err", err) } }() @@ -422,7 +429,7 @@ func (s *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthReque status := backend.HealthStatusOk - metricsLog, defaultSubscription, metricsStatus := metricCheckHealth(dsInfo) + metricsLog, defaultSubscription, metricsStatus := metricCheckHealth(dsInfo, s.logger) if metricsStatus != backend.HealthStatusOk { status = metricsStatus } diff --git a/pkg/tsdb/azuremonitor/azuremonitor_test.go b/pkg/tsdb/azuremonitor/azuremonitor_test.go index 3983682dbb3..88b8c9bfdd1 100644 --- a/pkg/tsdb/azuremonitor/azuremonitor_test.go +++ b/pkg/tsdb/azuremonitor/azuremonitor_test.go @@ -16,6 +16,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt" + "github.com/grafana/grafana-plugin-sdk-go/backend/log" "github.com/grafana/grafana/pkg/tsdb/azuremonitor/types" @@ -87,7 +88,7 @@ func TestNewInstanceSettings(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - factory := NewInstanceSettings(&httpclient.Provider{}, map[string]azDatasourceExecutor{}) + factory := NewInstanceSettings(&httpclient.Provider{}, map[string]azDatasourceExecutor{}, log.DefaultLogger) instance, err := factory(context.Background(), tt.settings) tt.Err(t, err) if !cmp.Equal(instance, tt.expectedModel) { diff --git a/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go b/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go index edb636b3baf..94c76e46518 100644 --- a/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go +++ b/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go @@ -17,6 +17,7 @@ import ( "time" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/log" "github.com/grafana/grafana-plugin-sdk-go/backend/tracing" "github.com/grafana/grafana-plugin-sdk-go/data" "go.opentelemetry.io/otel/attribute" @@ -30,7 +31,8 @@ import ( // AzureLogAnalyticsDatasource calls the Azure Log Analytics API's type AzureLogAnalyticsDatasource struct { - Proxy types.ServiceProxy + Proxy types.ServiceProxy + Logger log.Logger } // AzureLogAnalyticsQuery is the query request that is built from the saved values for @@ -300,7 +302,7 @@ func (e *AzureLogAnalyticsDatasource) executeQuery(ctx context.Context, query *A defer func() { if err := res.Body.Close(); err != nil { - backend.Logger.Warn("Failed to close response body", "err", err) + e.Logger.Warn("Failed to close response body", "err", err) } }() @@ -610,7 +612,7 @@ func getCorrelationWorkspaces(ctx context.Context, baseResource string, resource defer func() { if err := res.Body.Close(); err != nil { - backend.Logger.Warn("Failed to close response body", "err", err) + azMonService.Logger.Warn("Failed to close response body", "err", err) } }() @@ -714,7 +716,7 @@ func (e *AzureLogAnalyticsDatasource) unmarshalResponse(res *http.Response) (Azu } defer func() { if err := res.Body.Close(); err != nil { - backend.Logger.Warn("Failed to close response body", "err", err) + e.Logger.Warn("Failed to close response body", "err", err) } }() diff --git a/pkg/tsdb/azuremonitor/metrics/azuremonitor-datasource.go b/pkg/tsdb/azuremonitor/metrics/azuremonitor-datasource.go index 5e1eb376804..77bd4a513f5 100644 --- a/pkg/tsdb/azuremonitor/metrics/azuremonitor-datasource.go +++ b/pkg/tsdb/azuremonitor/metrics/azuremonitor-datasource.go @@ -14,6 +14,7 @@ import ( "time" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/log" "github.com/grafana/grafana-plugin-sdk-go/backend/tracing" "github.com/grafana/grafana-plugin-sdk-go/data" "go.opentelemetry.io/otel/attribute" @@ -27,7 +28,8 @@ import ( // AzureMonitorDatasource calls the Azure Monitor API - one of the four API's supported type AzureMonitorDatasource struct { - Proxy types.ServiceProxy + Proxy types.ServiceProxy + Logger log.Logger } var ( @@ -276,7 +278,7 @@ func (e *AzureMonitorDatasource) retrieveSubscriptionDetails(cli *http.Client, c defer func() { if err := res.Body.Close(); err != nil { - backend.Logger.Warn("Failed to close response body", "err", err) + e.Logger.Warn("Failed to close response body", "err", err) } }() @@ -328,7 +330,7 @@ func (e *AzureMonitorDatasource) executeQuery(ctx context.Context, query *types. defer func() { if err := res.Body.Close(); err != nil { - backend.Logger.Warn("Failed to close response body", "err", err) + e.Logger.Warn("Failed to close response body", "err", err) } }() diff --git a/pkg/tsdb/azuremonitor/resourcegraph/azure-resource-graph-datasource.go b/pkg/tsdb/azuremonitor/resourcegraph/azure-resource-graph-datasource.go index c04aecc562e..518ef43ad0f 100644 --- a/pkg/tsdb/azuremonitor/resourcegraph/azure-resource-graph-datasource.go +++ b/pkg/tsdb/azuremonitor/resourcegraph/azure-resource-graph-datasource.go @@ -12,6 +12,7 @@ import ( "time" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/log" "github.com/grafana/grafana-plugin-sdk-go/backend/tracing" "github.com/grafana/grafana-plugin-sdk-go/data" "go.opentelemetry.io/otel/attribute" @@ -30,7 +31,8 @@ type AzureResourceGraphResponse struct { // AzureResourceGraphDatasource calls the Azure Resource Graph API's type AzureResourceGraphDatasource struct { - Proxy types.ServiceProxy + Proxy types.ServiceProxy + Logger log.Logger } // AzureResourceGraphQuery is the query request that is built from the saved values for @@ -160,7 +162,7 @@ func (e *AzureResourceGraphDatasource) executeQuery(ctx context.Context, query * ) defer span.End() - backend.Logger.Debug("azure resource graph query", "traceID", trace.SpanContextFromContext(ctx).TraceID()) + e.Logger.Debug("azure resource graph query", "traceID", trace.SpanContextFromContext(ctx).TraceID()) res, err := client.Do(req) if err != nil { @@ -224,7 +226,7 @@ func (e *AzureResourceGraphDatasource) unmarshalResponse(res *http.Response) (Az defer func() { if err := res.Body.Close(); err != nil { - backend.Logger.Warn("Failed to close response body", "err", err) + e.Logger.Warn("Failed to close response body", "err", err) } }() diff --git a/pkg/tsdb/azuremonitor/types/types.go b/pkg/tsdb/azuremonitor/types/types.go index 36dfa6b70ce..8b11c4e41c3 100644 --- a/pkg/tsdb/azuremonitor/types/types.go +++ b/pkg/tsdb/azuremonitor/types/types.go @@ -11,6 +11,7 @@ import ( "github.com/grafana/grafana-azure-sdk-go/azcredentials" "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/log" "github.com/grafana/grafana/pkg/tsdb/azuremonitor/kinds/dataquery" ) @@ -44,6 +45,7 @@ type AzureMonitorCustomizedCloudSettings struct { type DatasourceService struct { URL string HTTPClient *http.Client + Logger log.Logger } type DatasourceInfo struct {