public void ApiVersionIsNotSanitizedByDefault()
        {
            HttpMessageSanitizer sanitizer = ClientDiagnostics.CreateMessageSanitizer(ClientOptions.Default.Diagnostics);
            var uriBuilder = new RequestUriBuilder();

            uriBuilder.Reset(new Uri("http://localhost/"));
            uriBuilder.AppendQuery("api-version", "2021-11-01");

            Assert.AreEqual("http://localhost/?api-version=2021-11-01", sanitizer.SanitizeUrl(uriBuilder.ToString()));
        }
        public void QueryIsSanitizedAppendQuery()
        {
            var sanitizer = new HttpMessageSanitizer(Array.Empty <string>(), Array.Empty <string>(), "*");

            var uriBuilder = new RequestUriBuilder();

            uriBuilder.Reset(new Uri("http://localhost/"));
            uriBuilder.AppendQuery("a", "b");

            Assert.AreEqual("http://localhost/?a=*", sanitizer.SanitizeUrl(uriBuilder.ToString()));
        }
        public void QueryIsSanitized(string input, string expected)
        {
            var sanitizer = new HttpMessageSanitizer(new[]
            {
                "A",
                "a1",
                "a-2"
            }, Array.Empty <string>(), "*");

            Assert.AreEqual("http://localhost/" + expected, sanitizer.SanitizeUrl("http://localhost/" + input));
        }
        public void CanRemoveApiVersionFromLoggedQueryParams()
        {
            var options = new DefaultClientOptions();

            options.Diagnostics.LoggedQueryParameters.Remove("api-version");

            HttpMessageSanitizer sanitizer = ClientDiagnostics.CreateMessageSanitizer(options.Diagnostics);
            var uriBuilder = new RequestUriBuilder();

            uriBuilder.Reset(new Uri("http://localhost/"));
            uriBuilder.AppendQuery("api-version", "2021-11-01");

            Assert.AreEqual("http://localhost/?api-version=REDACTED", sanitizer.SanitizeUrl(uriBuilder.ToString()));
        }
        private async ValueTask ProcessAsync(HttpMessage message, ReadOnlyMemory <HttpPipelinePolicy> pipeline, bool async)
        {
            using var scope = new DiagnosticScope("Azure.Core.Http.Request", s_diagnosticSource, message, s_activitySource, DiagnosticScope.ActivityKind.Client);
            scope.AddAttribute("http.method", message.Request.Method.Method);
            scope.AddAttribute("http.url", _sanitizer.SanitizeUrl(message.Request.Uri.ToString()));
            scope.AddAttribute("requestId", message.Request.ClientRequestId);

            if (_resourceProviderNamespace != null)
            {
                scope.AddAttribute("az.namespace", _resourceProviderNamespace);
            }

            if (message.Request.Headers.TryGetValue("User-Agent", out string?userAgent))
            {
                scope.AddAttribute("http.user_agent", userAgent);
            }

            scope.Start();

            if (async)
            {
                await ProcessNextAsync(message, pipeline, true).ConfigureAwait(false);
            }
            else
            {
                ProcessNextAsync(message, pipeline, false).EnsureCompleted();
            }

            scope.AddAttribute("http.status_code", message.Response.Status, static i => i.ToString(CultureInfo.InvariantCulture));
            if (message.Response.Headers.RequestId is string serviceRequestId)
            {
                scope.AddAttribute("serviceRequestId", serviceRequestId);
            }

            // Set the status to UNSET so the AppInsights doesn't try to infer it from the status code
            scope.AddAttribute("otel.status_code", message.Response.IsError ? "ERROR" : "UNSET");
        }
 private string FormatUri(RequestUriBuilder requestUri)
 {
     return(_sanitizer.SanitizeUrl(requestUri.ToString()));
 }