diff --git a/pkg/api/correlation.go b/pkg/api/correlation.go index 6cf55d10914..14d2a94f5e5 100644 --- a/pkg/api/correlation.go +++ b/pkg/api/correlation.go @@ -1,15 +1,24 @@ package api import ( + "context" + "net/http" "time" + + "github.com/Azure/ARO-RP/pkg/util/uuid" ) // Copyright (c) Microsoft Corporation. // Licensed under the Apache License 2.0. -// CorrelationData represents any data, used for metrics or tracing. -// More on these values: -// https://github.com/Azure/azure-resource-manager-rpc/blob/master/v1.0/common-api-details.md +type contextKey int + +const ( + contextKeyCorrelationData contextKey = iota +) + +// CorrelationData represents data used for metrics or tracing between ARO-RP and ARM. +// https://eng.ms/docs/products/arm/rpaas/contract/requestheaders type CorrelationData struct { // CorrelationID contains value of x-ms-correlation-request-id CorrelationID string `json:"correlationId,omitempty"` @@ -17,6 +26,9 @@ type CorrelationData struct { // ClientRequestID contains value of x-ms-client-request-id ClientRequestID string `json:"clientRequestId,omitempty"` + // OperationID contains the unique ID generated for each operation that the ARO-RP performs + OperationID string `json:"operationID,omitempty"` + // RequestID contains value of x-ms-request-id RequestID string `json:"requestID,omitempty"` @@ -26,3 +38,28 @@ type CorrelationData struct { // RequestTime is the time that the request was received RequestTime time.Time `json:"requestTime,omitempty"` } + +func CtxWithCorrelationData(ctx context.Context, correlationData *CorrelationData) context.Context { + return context.WithValue(ctx, contextKeyCorrelationData, correlationData) +} + +func GetCorrelationDataFromCtx(ctx context.Context) *CorrelationData { + correlationData, ok := ctx.Value(contextKeyCorrelationData).(*CorrelationData) + if !ok { + return nil + } + return correlationData +} + +func CreateCorrelationDataFromReq(req *http.Request) *CorrelationData { + if req == nil { + return nil + } + + return &CorrelationData{ + ClientRequestID: req.Header.Get("X-Ms-Client-Request-Id"), + CorrelationID: req.Header.Get("X-Ms-Correlation-Request-Id"), + RequestID: uuid.DefaultGenerator.Generate(), + OperationID: uuid.DefaultGenerator.Generate(), + } +} diff --git a/pkg/deploy/generator/scripts/rpVMSS.sh b/pkg/deploy/generator/scripts/rpVMSS.sh index e8bf7d29658..6d83fa0f3a9 100644 --- a/pkg/deploy/generator/scripts/rpVMSS.sh +++ b/pkg/deploy/generator/scripts/rpVMSS.sh @@ -163,6 +163,18 @@ cat >/etc/fluentbit/fluentbit.conf <<'EOF' Match journald Rule $LOGKIND ifxaudit ifxaudit false +[FILTER] + Name rewrite_tag + Match journald + Rule $LOGKIND outboundRequests outboundRequests false + +[FILTER] + Name modify + Match outboundRequests + Remove CLIENT_PRINCIPAL_NAME + Remove FILE + Remove COMPONENT + [OUTPUT] Name forward Match * diff --git a/pkg/frontend/clustermanager_putorpatch.go b/pkg/frontend/clustermanager_putorpatch.go index 257af4f2b1d..79a0bdd585c 100644 --- a/pkg/frontend/clustermanager_putorpatch.go +++ b/pkg/frontend/clustermanager_putorpatch.go @@ -55,7 +55,7 @@ func (f *frontend) putOrPatchClusterManagerConfiguration(w http.ResponseWriter, func (f *frontend) _putOrPatchSyncSet(ctx context.Context, log *logrus.Entry, r *http.Request, header *http.Header, converter api.SyncSetConverter, staticValidator api.ClusterManagerStaticValidator) ([]byte, error) { body := r.Context().Value(middleware.ContextKeyBody).([]byte) - correlationData := r.Context().Value(middleware.ContextKeyCorrelationData).(*api.CorrelationData) + correlationData := api.GetCorrelationDataFromCtx(r.Context()) systemData, _ := r.Context().Value(middleware.ContextKeySystemData).(*api.SystemData) // don't panic resType, resName, resGroupName := chi.URLParam(r, "resourceType"), chi.URLParam(r, "resourceName"), chi.URLParam(r, "resourceGroupName") ocmResourceType, ocmResourceName := chi.URLParam(r, "ocmResourceType"), chi.URLParam(r, "ocmResourceName") @@ -127,7 +127,7 @@ func (f *frontend) _putOrPatchSyncSet(ctx context.Context, log *logrus.Entry, r func (f *frontend) _putOrPatchMachinePool(ctx context.Context, log *logrus.Entry, r *http.Request, header *http.Header, converter api.MachinePoolConverter, staticValidator api.ClusterManagerStaticValidator) ([]byte, error) { body := r.Context().Value(middleware.ContextKeyBody).([]byte) - correlationData := r.Context().Value(middleware.ContextKeyCorrelationData).(*api.CorrelationData) + correlationData := api.GetCorrelationDataFromCtx(r.Context()) systemData, _ := r.Context().Value(middleware.ContextKeySystemData).(*api.SystemData) // don't panic resType, resName, resGroupName := chi.URLParam(r, "resourceType"), chi.URLParam(r, "resourceName"), chi.URLParam(r, "resourceGroupName") ocmResourceType, ocmResourceName := chi.URLParam(r, "ocmResourceType"), chi.URLParam(r, "ocmResourceName") @@ -200,7 +200,7 @@ func (f *frontend) _putOrPatchMachinePool(ctx context.Context, log *logrus.Entry func (f *frontend) _putOrPatchSyncIdentityProvider(ctx context.Context, log *logrus.Entry, r *http.Request, header *http.Header, converter api.SyncIdentityProviderConverter, staticValidator api.ClusterManagerStaticValidator) ([]byte, error) { body := r.Context().Value(middleware.ContextKeyBody).([]byte) - correlationData := r.Context().Value(middleware.ContextKeyCorrelationData).(*api.CorrelationData) + correlationData := api.GetCorrelationDataFromCtx(r.Context()) systemData, _ := r.Context().Value(middleware.ContextKeySystemData).(*api.SystemData) // don't panic resType, resName, resGroupName := chi.URLParam(r, "resourceType"), chi.URLParam(r, "resourceName"), chi.URLParam(r, "resourceGroupName") ocmResourceType, ocmResourceName := chi.URLParam(r, "ocmResourceType"), chi.URLParam(r, "ocmResourceName") @@ -273,7 +273,7 @@ func (f *frontend) _putOrPatchSyncIdentityProvider(ctx context.Context, log *log func (f *frontend) _putOrPatchSecret(ctx context.Context, log *logrus.Entry, r *http.Request, header *http.Header, converter api.SecretConverter, staticValidator api.ClusterManagerStaticValidator) ([]byte, error) { body := r.Context().Value(middleware.ContextKeyBody).([]byte) - correlationData := r.Context().Value(middleware.ContextKeyCorrelationData).(*api.CorrelationData) + correlationData := api.GetCorrelationDataFromCtx(r.Context()) systemData, _ := r.Context().Value(middleware.ContextKeySystemData).(*api.SystemData) // don't panic resType, resName, resGroupName := chi.URLParam(r, "resourceType"), chi.URLParam(r, "resourceName"), chi.URLParam(r, "resourceGroupName") ocmResourceType, ocmResourceName := chi.URLParam(r, "ocmResourceType"), chi.URLParam(r, "ocmResourceName") diff --git a/pkg/frontend/middleware/log.go b/pkg/frontend/middleware/log.go index 801d5054778..789d891d8a7 100644 --- a/pkg/frontend/middleware/log.go +++ b/pkg/frontend/middleware/log.go @@ -17,7 +17,6 @@ import ( "github.com/Azure/ARO-RP/pkg/api/admin" utillog "github.com/Azure/ARO-RP/pkg/util/log" "github.com/Azure/ARO-RP/pkg/util/log/audit" - "github.com/Azure/ARO-RP/pkg/util/uuid" ) type logResponseWriter struct { @@ -65,12 +64,8 @@ func (l LogMiddleware) Log(h http.Handler) http.Handler { r.Body = &logReadCloser{ReadCloser: r.Body} w = &logResponseWriter{ResponseWriter: w, statusCode: http.StatusOK} - correlationData := &api.CorrelationData{ - ClientRequestID: r.Header.Get("X-Ms-Client-Request-Id"), - CorrelationID: r.Header.Get("X-Ms-Correlation-Request-Id"), - RequestID: uuid.DefaultGenerator.Generate(), - RequestTime: t, - } + correlationData := api.CreateCorrelationDataFromReq(r) + correlationData.RequestTime = t if r.URL.Query().Get(api.APIVersionKey) == admin.APIVersion || isAdminOp(r) { correlationData.ClientPrincipalName = r.Header.Get("X-Ms-Client-Principal-Name") @@ -88,7 +83,7 @@ func (l LogMiddleware) Log(h http.Handler) http.Handler { ctx := r.Context() ctx = context.WithValue(ctx, ContextKeyLog, log) - ctx = context.WithValue(ctx, ContextKeyCorrelationData, correlationData) + ctx = api.CtxWithCorrelationData(ctx, correlationData) r = r.WithContext(ctx) diff --git a/pkg/frontend/middleware/middleware.go b/pkg/frontend/middleware/middleware.go index f804aa3c5e9..dd4f66f6e6f 100644 --- a/pkg/frontend/middleware/middleware.go +++ b/pkg/frontend/middleware/middleware.go @@ -9,6 +9,5 @@ const ( ContextKeyLog contextKey = iota ContextKeyOriginalPath ContextKeyBody - ContextKeyCorrelationData ContextKeySystemData ) diff --git a/pkg/frontend/openshiftcluster_delete.go b/pkg/frontend/openshiftcluster_delete.go index 18370350c78..28ef0c03284 100644 --- a/pkg/frontend/openshiftcluster_delete.go +++ b/pkg/frontend/openshiftcluster_delete.go @@ -36,7 +36,7 @@ func (f *frontend) deleteOpenShiftCluster(w http.ResponseWriter, r *http.Request } func (f *frontend) _deleteOpenShiftCluster(ctx context.Context, r *http.Request, header *http.Header, doc *api.OpenShiftClusterDocument) error { - correlationData := r.Context().Value(middleware.ContextKeyCorrelationData).(*api.CorrelationData) + correlationData := api.GetCorrelationDataFromCtx(r.Context()) _, err := f.validateSubscriptionState(ctx, doc.Key, api.SubscriptionStateRegistered, api.SubscriptionStateWarned, api.SubscriptionStateSuspended) if err != nil { diff --git a/pkg/frontend/openshiftcluster_putorpatch.go b/pkg/frontend/openshiftcluster_putorpatch.go index 3fe18ab61d4..92d1b249fbc 100644 --- a/pkg/frontend/openshiftcluster_putorpatch.go +++ b/pkg/frontend/openshiftcluster_putorpatch.go @@ -33,7 +33,7 @@ func (f *frontend) putOrPatchOpenShiftCluster(w http.ResponseWriter, r *http.Req var b []byte body := r.Context().Value(middleware.ContextKeyBody).([]byte) - correlationData := r.Context().Value(middleware.ContextKeyCorrelationData).(*api.CorrelationData) + correlationData := api.GetCorrelationDataFromCtx(r.Context()) systemData, _ := r.Context().Value(middleware.ContextKeySystemData).(*api.SystemData) // don't panic originalPath := r.Context().Value(middleware.ContextKeyOriginalPath).(string) referer := r.Header.Get("Referer") diff --git a/pkg/util/azureclient/applens/applens_client_options.go b/pkg/util/azureclient/applens/applens_client_options.go index 4387703c340..ba77d459380 100644 --- a/pkg/util/azureclient/applens/applens_client_options.go +++ b/pkg/util/azureclient/applens/applens_client_options.go @@ -11,6 +11,8 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" + + "github.com/Azure/ARO-RP/pkg/util/azureclient" ) const ( @@ -23,6 +25,19 @@ type ClientOptions struct { } func NewClientOptions(certPool *x509.CertPool) *ClientOptions { + httpTransport := &http.Transport{ + TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper), + TLSClientConfig: &tls.Config{ + RootCAs: certPool, + }, + } + + customRoundTripper := azureclient.NewCustomRoundTripper(httpTransport) + + httpClient := &http.Client{ + Transport: customRoundTripper, + } + return &ClientOptions{ azcore.ClientOptions{ Retry: policy.RetryOptions{ @@ -39,14 +54,7 @@ func NewClientOptions(certPool *x509.CertPool) *ClientOptions { ApplicationID: userAgent, Disabled: false, }, - Transport: &http.Client{ - Transport: &http.Transport{ - TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper), - TLSClientConfig: &tls.Config{ - RootCAs: certPool, - }, - }, - }, + Transport: httpClient, }, } } diff --git a/pkg/util/azureclient/authz/remotepdp/client.go b/pkg/util/azureclient/authz/remotepdp/client.go index 8011bb63c9d..58a58514066 100644 --- a/pkg/util/azureclient/authz/remotepdp/client.go +++ b/pkg/util/azureclient/authz/remotepdp/client.go @@ -12,6 +12,8 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime" + + "github.com/Azure/ARO-RP/pkg/util/azureclient" ) // this asserts that &remotePDPClient{} would always implement RemotePDPClient @@ -35,6 +37,13 @@ type remotePDPClient struct { func NewRemotePDPClient(endpoint, scope string, cred azcore.TokenCredential) *remotePDPClient { authPolicy := runtime.NewBearerTokenPolicy(cred, []string{scope}, nil) + customRoundTripper := azureclient.NewCustomRoundTripper(http.DefaultTransport) + clientOptions := &azcore.ClientOptions{ + Transport: &http.Client{ + Transport: customRoundTripper, + }, + } + pipeline := runtime.NewPipeline( modulename, version, @@ -42,7 +51,7 @@ func NewRemotePDPClient(endpoint, scope string, cred azcore.TokenCredential) *re PerCall: []policy.Policy{}, PerRetry: []policy.Policy{authPolicy}, }, - nil, + clientOptions, ) return &remotePDPClient{endpoint, pipeline} diff --git a/pkg/util/azureclient/decorators.go b/pkg/util/azureclient/decorators.go new file mode 100644 index 00000000000..4af013a4959 --- /dev/null +++ b/pkg/util/azureclient/decorators.go @@ -0,0 +1,37 @@ +package azureclient + +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache License 2.0. + +import ( + "net/http" + + "github.com/Azure/go-autorest/autorest" +) + +func DecorateSenderWithLogging(sender autorest.Sender) autorest.Sender { + loggingDecorator := LoggingDecorator() + return autorest.DecorateSender(sender, loggingDecorator, autorest.DoCloseIfError()) +} + +// LoggingDecorator returns a function which is used to wrap and modify the behaviour of an autorest.Sender. +// Azure Clients will have the sender wrapped by that function +// in order to intercept http calls using our custom RoundTripper (through the adapter). +func LoggingDecorator() autorest.SendDecorator { + return func(s autorest.Sender) autorest.Sender { + rt := NewCustomRoundTripper( + &roundTripperAdapter{Sender: s}, + ) + return autorest.SenderFunc(rt.RoundTrip) + } +} + +// roundTripperAdapter converts from autorest.Sender (internal field) +// to http.RoundTripper (external method). +type roundTripperAdapter struct { + Sender autorest.Sender +} + +func (rta *roundTripperAdapter) RoundTrip(req *http.Request) (*http.Response, error) { + return rta.Sender.Do(req) +} diff --git a/pkg/util/azureclient/keyvault/base.go b/pkg/util/azureclient/keyvault/base.go index a867a959f3c..c7ed31a9f9f 100644 --- a/pkg/util/azureclient/keyvault/base.go +++ b/pkg/util/azureclient/keyvault/base.go @@ -8,6 +8,8 @@ import ( azkeyvault "github.com/Azure/azure-sdk-for-go/services/keyvault/v7.0/keyvault" "github.com/Azure/go-autorest/autorest" + + "github.com/Azure/ARO-RP/pkg/util/azureclient" ) // BaseClient is a minimal interface for azure BaseClient @@ -32,6 +34,7 @@ var _ BaseClient = &baseClient{} func New(authorizer autorest.Authorizer) BaseClient { client := azkeyvault.New() client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &baseClient{ BaseClient: client, diff --git a/pkg/util/azureclient/mgmt/authorization/denyassignment.go b/pkg/util/azureclient/mgmt/authorization/denyassignment.go index 5e4b8e25f2b..5c5f6908cfa 100644 --- a/pkg/util/azureclient/mgmt/authorization/denyassignment.go +++ b/pkg/util/azureclient/mgmt/authorization/denyassignment.go @@ -25,6 +25,7 @@ var _ DenyAssignmentClient = &denyAssignmentClient{} func NewDenyAssignmentsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) DenyAssignmentClient { client := mgmtauthorization.NewDenyAssignmentsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &denyAssignmentClient{ DenyAssignmentsClient: client, diff --git a/pkg/util/azureclient/mgmt/authorization/permissions.go b/pkg/util/azureclient/mgmt/authorization/permissions.go index 478c59317ee..845bebb2b20 100644 --- a/pkg/util/azureclient/mgmt/authorization/permissions.go +++ b/pkg/util/azureclient/mgmt/authorization/permissions.go @@ -25,6 +25,7 @@ var _ PermissionsClient = &permissionsClient{} func NewPermissionsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) PermissionsClient { client := mgmtauthorization.NewPermissionsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &permissionsClient{ PermissionsClient: client, diff --git a/pkg/util/azureclient/mgmt/authorization/roleassignments.go b/pkg/util/azureclient/mgmt/authorization/roleassignments.go index daa98cf2c3f..c0cea695856 100644 --- a/pkg/util/azureclient/mgmt/authorization/roleassignments.go +++ b/pkg/util/azureclient/mgmt/authorization/roleassignments.go @@ -29,6 +29,7 @@ var _ RoleAssignmentsClient = &roleAssignmentsClient{} func NewRoleAssignmentsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) RoleAssignmentsClient { client := mgmtauthorization.NewRoleAssignmentsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &roleAssignmentsClient{ RoleAssignmentsClient: client, diff --git a/pkg/util/azureclient/mgmt/authorization/roledefinitions.go b/pkg/util/azureclient/mgmt/authorization/roledefinitions.go index 29ff633cd4f..c10828361ec 100644 --- a/pkg/util/azureclient/mgmt/authorization/roledefinitions.go +++ b/pkg/util/azureclient/mgmt/authorization/roledefinitions.go @@ -28,6 +28,7 @@ var _ RoleDefinitionsClient = &roleDefinitionsClient{} func NewRoleDefinitionsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) RoleDefinitionsClient { client := mgmtauthorization.NewRoleDefinitionsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &roleDefinitionsClient{ RoleDefinitionsClient: client, diff --git a/pkg/util/azureclient/mgmt/compute/diskencryptionsets.go b/pkg/util/azureclient/mgmt/compute/diskencryptionsets.go index f356836ae07..6a3d1766d58 100644 --- a/pkg/util/azureclient/mgmt/compute/diskencryptionsets.go +++ b/pkg/util/azureclient/mgmt/compute/diskencryptionsets.go @@ -27,6 +27,7 @@ var _ DiskEncryptionSetsClient = &diskEncryptionSetsClient{} func NewDiskEncryptionSetsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) DiskEncryptionSetsClient { client := mgmtcompute.NewDiskEncryptionSetsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &diskEncryptionSetsClient{ DiskEncryptionSetsClient: client, diff --git a/pkg/util/azureclient/mgmt/compute/disks.go b/pkg/util/azureclient/mgmt/compute/disks.go index 4f550adb790..ff66cc6635e 100644 --- a/pkg/util/azureclient/mgmt/compute/disks.go +++ b/pkg/util/azureclient/mgmt/compute/disks.go @@ -28,6 +28,7 @@ var _ DisksClient = &disksClient{} func NewDisksClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) DisksClient { client := mgmtcompute.NewDisksClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &disksClient{ DisksClient: client, diff --git a/pkg/util/azureclient/mgmt/compute/resourceskus.go b/pkg/util/azureclient/mgmt/compute/resourceskus.go index ac0006023b6..34152ab1442 100644 --- a/pkg/util/azureclient/mgmt/compute/resourceskus.go +++ b/pkg/util/azureclient/mgmt/compute/resourceskus.go @@ -25,6 +25,7 @@ var _ ResourceSkusClient = &resourceSkusClient{} func NewResourceSkusClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ResourceSkusClient { client := mgmtcompute.NewResourceSkusClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &resourceSkusClient{ ResourceSkusClient: client, diff --git a/pkg/util/azureclient/mgmt/compute/usage.go b/pkg/util/azureclient/mgmt/compute/usage.go index a3937d405eb..7a0586dc47a 100644 --- a/pkg/util/azureclient/mgmt/compute/usage.go +++ b/pkg/util/azureclient/mgmt/compute/usage.go @@ -25,6 +25,7 @@ var _ UsageClient = &usageClient{} func NewUsageClient(environment *azureclient.AROEnvironment, tenantID string, authorizer autorest.Authorizer) UsageClient { client := mgmtcompute.NewUsageClientWithBaseURI(environment.ResourceManagerEndpoint, tenantID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &usageClient{ UsageClient: client, diff --git a/pkg/util/azureclient/mgmt/compute/virtualmachines.go b/pkg/util/azureclient/mgmt/compute/virtualmachines.go index 4988cc3d82b..484e5005589 100644 --- a/pkg/util/azureclient/mgmt/compute/virtualmachines.go +++ b/pkg/util/azureclient/mgmt/compute/virtualmachines.go @@ -28,6 +28,7 @@ var _ VirtualMachinesClient = &virtualMachinesClient{} func NewVirtualMachinesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualMachinesClient { client := mgmtcompute.NewVirtualMachinesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &virtualMachinesClient{ VirtualMachinesClient: client, diff --git a/pkg/util/azureclient/mgmt/compute/virtualmachinescalesetvms.go b/pkg/util/azureclient/mgmt/compute/virtualmachinescalesetvms.go index 3a59e35e2d1..a19e5359810 100644 --- a/pkg/util/azureclient/mgmt/compute/virtualmachinescalesetvms.go +++ b/pkg/util/azureclient/mgmt/compute/virtualmachinescalesetvms.go @@ -30,6 +30,7 @@ func NewVirtualMachineScaleSetVMsClient(environment *azureclient.AROEnvironment, client := mgmtcompute.NewVirtualMachineScaleSetVMsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer client.PollingDuration = time.Hour + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &virtualMachineScaleSetVMsClient{ VirtualMachineScaleSetVMsClient: client, diff --git a/pkg/util/azureclient/mgmt/compute/virtualmachinesscalesets.go b/pkg/util/azureclient/mgmt/compute/virtualmachinesscalesets.go index 31664dd15ca..887afa4653c 100644 --- a/pkg/util/azureclient/mgmt/compute/virtualmachinesscalesets.go +++ b/pkg/util/azureclient/mgmt/compute/virtualmachinesscalesets.go @@ -24,6 +24,7 @@ var _ VirtualMachineScaleSetsClient = &virtualMachineScaleSetsClient{} func NewVirtualMachineScaleSetsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualMachineScaleSetsClient { client := mgmtcompute.NewVirtualMachineScaleSetsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &virtualMachineScaleSetsClient{ VirtualMachineScaleSetsClient: client, diff --git a/pkg/util/azureclient/mgmt/containerregistry/registries.go b/pkg/util/azureclient/mgmt/containerregistry/registries.go index 97ac2918433..78661e4c515 100644 --- a/pkg/util/azureclient/mgmt/containerregistry/registries.go +++ b/pkg/util/azureclient/mgmt/containerregistry/registries.go @@ -25,6 +25,7 @@ var _ RegistriesClient = ®istriesClient{} func NewRegistriesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) RegistriesClient { client := mgmtcontainerregistry.NewRegistriesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return ®istriesClient{ RegistriesClient: client, diff --git a/pkg/util/azureclient/mgmt/containerregistry/tokens.go b/pkg/util/azureclient/mgmt/containerregistry/tokens.go index f340adcd4f5..d1c35fd5899 100644 --- a/pkg/util/azureclient/mgmt/containerregistry/tokens.go +++ b/pkg/util/azureclient/mgmt/containerregistry/tokens.go @@ -25,6 +25,7 @@ var _ TokensClient = &tokensClient{} func NewTokensClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) TokensClient { client := mgmtcontainerregistry.NewTokensClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &tokensClient{ TokensClient: client, diff --git a/pkg/util/azureclient/mgmt/containerservice/managedclusters.go b/pkg/util/azureclient/mgmt/containerservice/managedclusters.go index 279f2d65e5f..b7bf9fbc7cf 100644 --- a/pkg/util/azureclient/mgmt/containerservice/managedclusters.go +++ b/pkg/util/azureclient/mgmt/containerservice/managedclusters.go @@ -25,6 +25,7 @@ var _ ManagedClustersClient = &managedClustersClient{} func NewManagedClustersClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ManagedClustersClient { client := mgmtcontainerservice.NewManagedClustersClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &managedClustersClient{ ManagedClustersClient: client, diff --git a/pkg/util/azureclient/mgmt/dns/recordsets.go b/pkg/util/azureclient/mgmt/dns/recordsets.go index e688da2d202..6a26b262452 100644 --- a/pkg/util/azureclient/mgmt/dns/recordsets.go +++ b/pkg/util/azureclient/mgmt/dns/recordsets.go @@ -29,6 +29,7 @@ var _ RecordSetsClient = &recordSetsClient{} func NewRecordSetsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) RecordSetsClient { client := mgmtdns.NewRecordSetsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &recordSetsClient{ RecordSetsClient: client, diff --git a/pkg/util/azureclient/mgmt/dns/zones.go b/pkg/util/azureclient/mgmt/dns/zones.go index babd9912dbc..4e8e8c5e42b 100644 --- a/pkg/util/azureclient/mgmt/dns/zones.go +++ b/pkg/util/azureclient/mgmt/dns/zones.go @@ -27,6 +27,7 @@ var _ ZonesClient = &zonesClient{} func NewZonesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ZonesClient { client := mgmtdns.NewZonesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &zonesClient{ ZonesClient: client, diff --git a/pkg/util/azureclient/mgmt/features/deployments.go b/pkg/util/azureclient/mgmt/features/deployments.go index 128d21de005..656e93be538 100644 --- a/pkg/util/azureclient/mgmt/features/deployments.go +++ b/pkg/util/azureclient/mgmt/features/deployments.go @@ -31,6 +31,7 @@ func NewDeploymentsClient(environment *azureclient.AROEnvironment, subscriptionI client.Authorizer = authorizer client.PollingDelay = 10 * time.Second client.PollingDuration = time.Hour + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &deploymentsClient{ DeploymentsClient: client, diff --git a/pkg/util/azureclient/mgmt/features/providers.go b/pkg/util/azureclient/mgmt/features/providers.go index 2464e9e23a6..eec19a16502 100644 --- a/pkg/util/azureclient/mgmt/features/providers.go +++ b/pkg/util/azureclient/mgmt/features/providers.go @@ -25,6 +25,7 @@ var _ ProvidersClient = &providersClient{} func NewProvidersClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ProvidersClient { client := mgmtfeatures.NewProvidersClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &providersClient{ ProvidersClient: client, diff --git a/pkg/util/azureclient/mgmt/features/resourcegroups.go b/pkg/util/azureclient/mgmt/features/resourcegroups.go index a4cc1123dd6..969bf249107 100644 --- a/pkg/util/azureclient/mgmt/features/resourcegroups.go +++ b/pkg/util/azureclient/mgmt/features/resourcegroups.go @@ -33,6 +33,7 @@ func NewResourceGroupsClient(environment *azureclient.AROEnvironment, subscripti client.Authorizer = authorizer client.PollingDelay = 10 * time.Second client.PollingDuration = time.Hour + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &resourceGroupsClient{ ResourceGroupsClient: client, diff --git a/pkg/util/azureclient/mgmt/features/resources.go b/pkg/util/azureclient/mgmt/features/resources.go index b3b3e6210b8..1b8fc3a90bf 100644 --- a/pkg/util/azureclient/mgmt/features/resources.go +++ b/pkg/util/azureclient/mgmt/features/resources.go @@ -29,6 +29,7 @@ var _ ResourcesClient = &resourcesClient{} func NewResourcesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) ResourcesClient { client := mgmtfeatures.NewResourcesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &resourcesClient{ ResourcesClient: client, diff --git a/pkg/util/azureclient/mgmt/keyvault/vaults.go b/pkg/util/azureclient/mgmt/keyvault/vaults.go index 2d2ebf52c70..5b451c797ea 100644 --- a/pkg/util/azureclient/mgmt/keyvault/vaults.go +++ b/pkg/util/azureclient/mgmt/keyvault/vaults.go @@ -27,6 +27,7 @@ var _ VaultsClient = &vaultsClient{} func NewVaultsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VaultsClient { client := mgmtkeyvault.NewVaultsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &vaultsClient{ VaultsClient: client, diff --git a/pkg/util/azureclient/mgmt/msi/userassignedidentities.go b/pkg/util/azureclient/mgmt/msi/userassignedidentities.go index 2c5eee797e0..df75b4f3f6c 100644 --- a/pkg/util/azureclient/mgmt/msi/userassignedidentities.go +++ b/pkg/util/azureclient/mgmt/msi/userassignedidentities.go @@ -27,6 +27,7 @@ var _ UserAssignedIdentitiesClient = &userAssignedIdentitiesClient{} func NewUserAssignedIdentitiesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) UserAssignedIdentitiesClient { client := mgmtmsi.NewUserAssignedIdentitiesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &userAssignedIdentitiesClient{ UserAssignedIdentitiesClient: client, diff --git a/pkg/util/azureclient/mgmt/network/flowlogs.go b/pkg/util/azureclient/mgmt/network/flowlogs.go index 5e9420c06a2..154310905ea 100644 --- a/pkg/util/azureclient/mgmt/network/flowlogs.go +++ b/pkg/util/azureclient/mgmt/network/flowlogs.go @@ -29,6 +29,8 @@ var _ FlowLogsClient = &flowLogsClient{} func NewFlowLogsClient(environment *azureclient.AROEnvironment, tenantID string, authorizer autorest.Authorizer) FlowLogsClient { client := mgmtnetwork.NewFlowLogsClientWithBaseURI(environment.ResourceManagerEndpoint, tenantID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) + return &flowLogsClient{ FlowLogsClient: client, } diff --git a/pkg/util/azureclient/mgmt/network/interfaces.go b/pkg/util/azureclient/mgmt/network/interfaces.go index bece41965fd..bcbc48c4b92 100644 --- a/pkg/util/azureclient/mgmt/network/interfaces.go +++ b/pkg/util/azureclient/mgmt/network/interfaces.go @@ -28,6 +28,7 @@ var _ InterfacesClient = &interfacesClient{} func NewInterfacesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) InterfacesClient { client := mgmtnetwork.NewInterfacesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &interfacesClient{ InterfacesClient: client, diff --git a/pkg/util/azureclient/mgmt/network/loadbalancers.go b/pkg/util/azureclient/mgmt/network/loadbalancers.go index e276cb16172..22fb7b22a82 100644 --- a/pkg/util/azureclient/mgmt/network/loadbalancers.go +++ b/pkg/util/azureclient/mgmt/network/loadbalancers.go @@ -28,6 +28,7 @@ var _ LoadBalancersClient = &loadBalancersClient{} func NewLoadBalancersClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) LoadBalancersClient { client := mgmtnetwork.NewLoadBalancersClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &loadBalancersClient{ LoadBalancersClient: client, @@ -48,6 +49,7 @@ var _ LoadBalancerBackendAddressPoolsClient = &loadBalancerBackendAddressPoolsCl func NewLoadBalancerBackendAddressPoolsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) LoadBalancerBackendAddressPoolsClient { client := mgmtnetwork.NewLoadBalancerBackendAddressPoolsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &loadBalancerBackendAddressPoolsClient{ LoadBalancerBackendAddressPoolsClient: client, diff --git a/pkg/util/azureclient/mgmt/network/privateendpoints.go b/pkg/util/azureclient/mgmt/network/privateendpoints.go index d0f1622379b..48fb2ce90fd 100644 --- a/pkg/util/azureclient/mgmt/network/privateendpoints.go +++ b/pkg/util/azureclient/mgmt/network/privateendpoints.go @@ -28,6 +28,7 @@ var _ PrivateEndpointsClient = &privateEndpointsClient{} func NewPrivateEndpointsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) PrivateEndpointsClient { client := mgmtnetwork.NewPrivateEndpointsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &privateEndpointsClient{ PrivateEndpointsClient: client, diff --git a/pkg/util/azureclient/mgmt/network/privatelinkservices.go b/pkg/util/azureclient/mgmt/network/privatelinkservices.go index 1aa99405e56..b97389584a0 100644 --- a/pkg/util/azureclient/mgmt/network/privatelinkservices.go +++ b/pkg/util/azureclient/mgmt/network/privatelinkservices.go @@ -30,6 +30,7 @@ var _ PrivateLinkServicesClient = &privateLinkServicesClient{} func NewPrivateLinkServicesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) PrivateLinkServicesClient { client := mgmtnetwork.NewPrivateLinkServicesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &privateLinkServicesClient{ PrivateLinkServicesClient: client, diff --git a/pkg/util/azureclient/mgmt/network/publicipaddresses.go b/pkg/util/azureclient/mgmt/network/publicipaddresses.go index 62202db9c16..a820e2a6ebb 100644 --- a/pkg/util/azureclient/mgmt/network/publicipaddresses.go +++ b/pkg/util/azureclient/mgmt/network/publicipaddresses.go @@ -28,6 +28,7 @@ var _ PublicIPAddressesClient = &publicIPAddressesClient{} func NewPublicIPAddressesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) PublicIPAddressesClient { client := mgmtnetwork.NewPublicIPAddressesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &publicIPAddressesClient{ PublicIPAddressesClient: client, diff --git a/pkg/util/azureclient/mgmt/network/routetable.go b/pkg/util/azureclient/mgmt/network/routetable.go index 3d4185f0a7f..623fed159cb 100644 --- a/pkg/util/azureclient/mgmt/network/routetable.go +++ b/pkg/util/azureclient/mgmt/network/routetable.go @@ -28,6 +28,7 @@ var _ RouteTablesClient = &routeTablesClient{} func NewRouteTablesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) RouteTablesClient { client := mgmtnetwork.NewRouteTablesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &routeTablesClient{ RouteTablesClient: client, diff --git a/pkg/util/azureclient/mgmt/network/securitygroups.go b/pkg/util/azureclient/mgmt/network/securitygroups.go index c2d45a00251..fa3546dd752 100644 --- a/pkg/util/azureclient/mgmt/network/securitygroups.go +++ b/pkg/util/azureclient/mgmt/network/securitygroups.go @@ -28,6 +28,7 @@ var _ SecurityGroupsClient = &securityGroupsClient{} func NewSecurityGroupsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) SecurityGroupsClient { client := mgmtnetwork.NewSecurityGroupsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &securityGroupsClient{ SecurityGroupsClient: client, diff --git a/pkg/util/azureclient/mgmt/network/subnets.go b/pkg/util/azureclient/mgmt/network/subnets.go index 02e3a0ccb56..71319b0d0c3 100644 --- a/pkg/util/azureclient/mgmt/network/subnets.go +++ b/pkg/util/azureclient/mgmt/network/subnets.go @@ -28,6 +28,7 @@ var _ SubnetsClient = &subnetsClient{} func NewSubnetsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) SubnetsClient { client := mgmtnetwork.NewSubnetsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &subnetsClient{ SubnetsClient: client, diff --git a/pkg/util/azureclient/mgmt/network/usage.go b/pkg/util/azureclient/mgmt/network/usage.go index da48de2c7f1..72d42d2c1b8 100644 --- a/pkg/util/azureclient/mgmt/network/usage.go +++ b/pkg/util/azureclient/mgmt/network/usage.go @@ -25,6 +25,7 @@ var _ UsageClient = &usageClient{} func NewUsageClient(environment *azureclient.AROEnvironment, tenantID string, authorizer autorest.Authorizer) UsageClient { client := mgmtnetwork.NewUsagesClientWithBaseURI(environment.ResourceManagerEndpoint, tenantID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &usageClient{ UsagesClient: client, diff --git a/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go b/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go index a7673d4119b..81b664c84cc 100644 --- a/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go +++ b/pkg/util/azureclient/mgmt/network/virtualnetworkpeerings.go @@ -28,6 +28,7 @@ var _ VirtualNetworkPeeringsClient = &virtualNetworkPeeringsClient{} func NewVirtualNetworkPeeringsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualNetworkPeeringsClient { client := mgmtnetwork.NewVirtualNetworkPeeringsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &virtualNetworkPeeringsClient{ VirtualNetworkPeeringsClient: client, diff --git a/pkg/util/azureclient/mgmt/network/virtualnetworks.go b/pkg/util/azureclient/mgmt/network/virtualnetworks.go index b90349ea293..aed5a6d26b6 100644 --- a/pkg/util/azureclient/mgmt/network/virtualnetworks.go +++ b/pkg/util/azureclient/mgmt/network/virtualnetworks.go @@ -27,6 +27,7 @@ var _ VirtualNetworksClient = &virtualNetworksClient{} func NewVirtualNetworksClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualNetworksClient { client := mgmtnetwork.NewVirtualNetworksClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &virtualNetworksClient{ VirtualNetworksClient: client, diff --git a/pkg/util/azureclient/mgmt/privatedns/privatezones.go b/pkg/util/azureclient/mgmt/privatedns/privatezones.go index 8fb2c402fc3..427b42eb2dc 100644 --- a/pkg/util/azureclient/mgmt/privatedns/privatezones.go +++ b/pkg/util/azureclient/mgmt/privatedns/privatezones.go @@ -25,6 +25,7 @@ var _ PrivateZonesClient = &privateZonesClient{} func NewPrivateZonesClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) PrivateZonesClient { client := mgmtprivatedns.NewPrivateZonesClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &privateZonesClient{ PrivateZonesClient: client, diff --git a/pkg/util/azureclient/mgmt/privatedns/virtualnetworklinks.go b/pkg/util/azureclient/mgmt/privatedns/virtualnetworklinks.go index 9872e846009..5ad4d679feb 100644 --- a/pkg/util/azureclient/mgmt/privatedns/virtualnetworklinks.go +++ b/pkg/util/azureclient/mgmt/privatedns/virtualnetworklinks.go @@ -25,6 +25,7 @@ var _ VirtualNetworkLinksClient = &virtualNetworkLinksClient{} func NewVirtualNetworkLinksClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) VirtualNetworkLinksClient { client := mgmtprivatedns.NewVirtualNetworkLinksClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) return &virtualNetworkLinksClient{ VirtualNetworkLinksClient: client, diff --git a/pkg/util/azureclient/mgmt/storage/accounts.go b/pkg/util/azureclient/mgmt/storage/accounts.go index ab5f829bf7a..7f090a2f33e 100644 --- a/pkg/util/azureclient/mgmt/storage/accounts.go +++ b/pkg/util/azureclient/mgmt/storage/accounts.go @@ -30,6 +30,8 @@ var _ AccountsClient = &accountsClient{} func NewAccountsClient(environment *azureclient.AROEnvironment, subscriptionID string, authorizer autorest.Authorizer) AccountsClient { client := mgmtstorage.NewAccountsClientWithBaseURI(environment.ResourceManagerEndpoint, subscriptionID) client.Authorizer = authorizer + client.Sender = azureclient.DecorateSenderWithLogging(client.Sender) + return &accountsClient{ AccountsClient: client, } diff --git a/pkg/util/azureclient/roundtripper.go b/pkg/util/azureclient/roundtripper.go new file mode 100644 index 00000000000..e79a14b62ba --- /dev/null +++ b/pkg/util/azureclient/roundtripper.go @@ -0,0 +1,81 @@ +package azureclient + +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache License 2.0. + +import ( + "net/http" + "time" + + "github.com/sirupsen/logrus" + + "github.com/Azure/ARO-RP/pkg/api" + utillog "github.com/Azure/ARO-RP/pkg/util/log" +) + +// genevaOutboundRequestsTable is the table name we configure in Geneva +// to send logs of outgoing requests from ARO-RP to ARM. +// https://docs.google.com/document/d/1RbnKKPNjw7kJZeR-2me4euM5CClGqF62FkaHVlWGxtM/edit?usp=sharing +const genevaOutboundRequestsTable = "outboundRequests" + +func NewCustomRoundTripper(next http.RoundTripper) http.RoundTripper { + return &customRoundTripper{ + next: next, + } +} + +type customRoundTripper struct { + next http.RoundTripper +} + +func (crt *customRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + correlationData := api.GetCorrelationDataFromCtx(req.Context()) + if correlationData == nil { + correlationData = api.CreateCorrelationDataFromReq(req) + } + + requestTime := time.Now() + l := updateCorrelationDataAndEnrichLogWithRequest(correlationData, utillog.GetLogger(), requestTime, req) + + l.Info("HttpRequestStart") + + res, err := crt.next.RoundTrip(req) + + l = updateCorrelationDataAndEnrichLogWithResponse(correlationData, l, res, requestTime) + l.Info("HttpRequestEnd") + + return res, err +} + +// updateCorrelationDataAndEnrichLogWithRequest receives a non nil correlationData and updates the request time. +// It also returns a new logrus entry updated with the new field for the LOGKIND entry (custom DGrep table for outgoing requests). +func updateCorrelationDataAndEnrichLogWithRequest(correlationData *api.CorrelationData, l *logrus.Entry, requestTime time.Time, req *http.Request) *logrus.Entry { + correlationData.RequestTime = requestTime + + l = utillog.EnrichWithCorrelationData(l, correlationData) + l = l.WithFields(logrus.Fields{ + "request_URL": req.URL, + "LOGKIND": genevaOutboundRequestsTable, + }) + + return l +} + +func updateCorrelationDataAndEnrichLogWithResponse(correlationData *api.CorrelationData, l *logrus.Entry, res *http.Response, requestTime time.Time) *logrus.Entry { + if res == nil { + return l.WithFields(logrus.Fields{ + "response_status_code": "0", + "contentLength": "-1", + "durationInMilliseconds": time.Since(requestTime).Milliseconds(), + }) + } + + correlationData.CorrelationID = res.Header.Get("X-Ms-Correlation-Request-Id") + l = utillog.EnrichWithCorrelationData(l, correlationData) + + return l.WithFields(logrus.Fields{ + "response_status_code": res.StatusCode, + "contentLength": res.ContentLength, + "durationInMilliseconds": time.Since(requestTime).Milliseconds(), + }) +} diff --git a/pkg/util/azureclient/roundtripper_test.go b/pkg/util/azureclient/roundtripper_test.go new file mode 100644 index 00000000000..74c03395753 --- /dev/null +++ b/pkg/util/azureclient/roundtripper_test.go @@ -0,0 +1,161 @@ +package azureclient + +// Copyright (c) Microsoft Corporation. +// Licensed under the Apache License 2.0. + +import ( + "fmt" + "net/http" + "net/url" + "testing" + "time" + + "github.com/sirupsen/logrus" + + "github.com/Azure/ARO-RP/pkg/api" + utillog "github.com/Azure/ARO-RP/pkg/util/log" +) + +// fieldsContainsSubfields returns true if all the keys of subfields are contained in fields and the value +// for each key is the same in fields and in subfields. +func fieldsContainsSubfields(fields logrus.Fields, subfields logrus.Fields) (containsSubfields bool) { + for subfieldsKey := range subfields { + fieldsValue, subfieldsKeyIsInFields := fields[subfieldsKey] + if !subfieldsKeyIsInFields { + fmt.Printf("fields does not contain subfieldsKey %v\n", subfieldsKey) + return false + } + + if fieldsValue != subfields[subfieldsKey] { + fmt.Printf("fields value %v != subfields value %v\n", fieldsValue, subfields[subfieldsKey]) + return false + } + } + return true +} + +func TestUpdateCorrelationDataAndEnrichLogWithRequest(t *testing.T) { + type testCase struct { + name string + correlationData *api.CorrelationData + req *http.Request + expectedSubfields logrus.Fields + } + + startTime := time.Now() + url, err := url.Parse("https://example.com/foo%2fbar") + if err != nil { + t.Fatal(err) + } + + testcases := []testCase{ + { + name: "updateCorrelationDataAndEnrichLogWithReq returns appropriate logrus.Entry", + correlationData: &api.CorrelationData{ + ClientRequestID: "ClientRequestID", + CorrelationID: "CorrelationID", + RequestID: "random_request_id", + OperationID: "random_operation_id", + }, + req: &http.Request{ + URL: url, + }, + expectedSubfields: logrus.Fields{ + "client_request_id": "ClientRequestID", + "correlation_id": "CorrelationID", + "request_time": startTime, + "request_id": "random_request_id", + "LOGKIND": "outboundRequests", + }, + }, + } + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + baseLogger := utillog.GetLogger() + l := updateCorrelationDataAndEnrichLogWithRequest(tc.correlationData, baseLogger, startTime, tc.req) + if tc.correlationData.RequestTime != startTime { + t.Fatal("wrong RequestTime registration") + } + + operationId, ok := l.Data["operation_id"].(string) + if !ok { + t.Fatal("generated operation id is not of string type") + } + + if operationId == "" { + t.Fatal("generated operationId should not be empty") + } + + if !fieldsContainsSubfields(l.Data, tc.expectedSubfields) { + t.Fatal("logrus entry does not contain all expectedSubfields") + } + }) + } +} + +func TestUpdateCorrelationDataAndEnrichLogWithResponse(t *testing.T) { + type testCase struct { + name string + res *http.Response + correlationData *api.CorrelationData + expecetdCorrelationIDUpdated string + expectedSubfields logrus.Fields + } + + startTime := time.Now() + testcases := []testCase{ + { + name: "updateCorrelationDataAndEnrichLogWithResponse returns appropriate logrus.Entry when response is nil", + res: nil, + correlationData: &api.CorrelationData{ + ClientRequestID: "ClientRequestID", + CorrelationID: "CorrelationID", + RequestID: "random_request_id", + OperationID: "random_operation_id", + RequestTime: startTime, + }, + expecetdCorrelationIDUpdated: "CorrelationID", + expectedSubfields: logrus.Fields{ + "response_status_code": "0", + "contentLength": "-1", + "durationInMilliseconds": time.Since(startTime).Milliseconds(), + }, + }, + { + name: "updateCorrelationDataAndEnrichLogWithResponse returns appropriate logrus.Entry when response is not nil", + correlationData: &api.CorrelationData{ + ClientRequestID: "ClientRequestID", + CorrelationID: "CorrelationID", + RequestID: "random_request_id", + OperationID: "random_operation_id", + RequestTime: startTime, + }, + expecetdCorrelationIDUpdated: "the_correlation_request_id", + res: &http.Response{ + StatusCode: http.StatusOK, + Header: http.Header{"X-Ms-Correlation-Request-Id": []string{"the_correlation_request_id"}}, + ContentLength: int64(10), + }, + expectedSubfields: logrus.Fields{ + "response_status_code": http.StatusOK, + "correlation_id": "the_correlation_request_id", + "contentLength": int64(10), + }, + }, + } + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + baseLogger := utillog.GetLogger() + + l := updateCorrelationDataAndEnrichLogWithResponse(tc.correlationData, baseLogger, tc.res, startTime) + + if tc.correlationData.CorrelationID != tc.expecetdCorrelationIDUpdated { + t.Fatal("correlationData.CorrelationID not updated properly") + } + + if !fieldsContainsSubfields(l.Data, tc.expectedSubfields) { + t.Fatal("logrus entry does not contain all expectedSubfields") + } + }) + } +} diff --git a/pkg/util/log/log.go b/pkg/util/log/log.go index 82a890d38f7..76300b4ff12 100644 --- a/pkg/util/log/log.go +++ b/pkg/util/log/log.go @@ -143,6 +143,10 @@ func EnrichWithPath(log *logrus.Entry, path string) *logrus.Entry { // EnrichWithCorrelationData sets log fields based on an optional // correlationData struct func EnrichWithCorrelationData(log *logrus.Entry, correlationData *api.CorrelationData) *logrus.Entry { + if log == nil { + log = GetLogger() + } + if correlationData == nil { return log } @@ -150,8 +154,10 @@ func EnrichWithCorrelationData(log *logrus.Entry, correlationData *api.Correlati return log.WithFields(logrus.Fields{ "correlation_id": correlationData.CorrelationID, "client_request_id": correlationData.ClientRequestID, + "operation_id": correlationData.OperationID, "request_id": correlationData.RequestID, "client_principal_name": correlationData.ClientPrincipalName, + "request_time": correlationData.RequestTime, }) }