Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 36 additions & 25 deletions sdk/core/Azure.Core/src/Diagnostics/AzureCoreEventSource.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Diagnostics.Tracing;
using System.Diagnostics.CodeAnalysis;
using System.Text;
using System.ClientModel.Primitives;

namespace Azure.Core.Diagnostics
{
Expand Down Expand Up @@ -36,6 +37,8 @@ internal sealed class AzureCoreEventSource : AzureEventSource
private const int RequestRedirectCountExceededEvent = 22;
private const int PipelineTransportOptionsNotAppliedEvent = 23;

private const string ClientRequestIdHeader = "x-ms-client-request-id";

private AzureCoreEventSource() : base(EventSourceName) { }

public static AzureCoreEventSource Singleton { get; } = new AzureCoreEventSource();
Expand All @@ -47,11 +50,12 @@ public void BackgroundRefreshFailed(string requestId, string exception)
}

[NonEvent]
public void Request(Request request, string? assemblyName, HttpMessageSanitizer sanitizer)
public void Request(PipelineRequest request, string? assemblyName, HttpMessageSanitizer sanitizer)
{
if (IsEnabled(EventLevel.Informational, EventKeywords.None))
{
Request(request.ClientRequestId, request.Method.ToString(), sanitizer.SanitizeUrl(request.Uri.ToString()), FormatHeaders(request.Headers, sanitizer), assemblyName);
Request? rq = request as Request;
Request(rq?.ClientRequestId ?? string.Empty, request.Method.ToString(), sanitizer.SanitizeUrl(request.Uri!.AbsoluteUri), FormatHeaders(request.Headers, sanitizer), assemblyName);
}
}

Expand All @@ -63,17 +67,18 @@ public void Request(string requestId, string method, string uri, string headers,
}

[NonEvent]
public void RequestContent(string requestId, byte[] content, Encoding? textEncoding)
public void RequestContent(PipelineRequest request, byte[] content, Encoding? textEncoding)
{
if (IsEnabled(EventLevel.Verbose, EventKeywords.None))
{
Request? rq = request as Request;
if (textEncoding is not null)
{
RequestContentText(requestId, textEncoding.GetString(content));
RequestContentText(rq?.ClientRequestId ?? string.Empty, textEncoding.GetString(content));
}
else
{
RequestContent(requestId, content);
RequestContent(rq?.ClientRequestId ?? string.Empty, content);
}
}
}
Expand All @@ -92,11 +97,12 @@ public void RequestContentText(string requestId, string content)
}

[NonEvent]
public void Response(Response response, HttpMessageSanitizer sanitizer, double elapsed)
public void Response(PipelineResponse response, HttpMessageSanitizer sanitizer, double elapsed)
{
if (IsEnabled(EventLevel.Informational, EventKeywords.None))
{
Response(response.ClientRequestId, response.Status, response.ReasonPhrase, FormatHeaders(response.Headers, sanitizer), elapsed);
Response? rsp = response as Response;
Response(rsp?.ClientRequestId ?? string.Empty, response.Status, response.ReasonPhrase, FormatHeaders(response.Headers, sanitizer), elapsed);
}
}

Expand All @@ -108,17 +114,18 @@ public void Response(string requestId, int status, string reasonPhrase, string h
}

[NonEvent]
public void ResponseContent(string requestId, byte[] content, Encoding? textEncoding)
public void ResponseContent(PipelineResponse response, byte[] content, Encoding? textEncoding)
{
if (IsEnabled(EventLevel.Verbose, EventKeywords.None))
{
Response? rsp = response as Response;
if (textEncoding is not null)
{
ResponseContentText(requestId, textEncoding.GetString(content));
ResponseContentText(rsp?.ClientRequestId ?? string.Empty, textEncoding.GetString(content));
}
else
{
ResponseContent(requestId, content);
ResponseContent(rsp?.ClientRequestId ?? string.Empty, content);
}
}
}
Expand All @@ -137,17 +144,18 @@ public void ResponseContentText(string requestId, string content)
}

[NonEvent]
public void ResponseContentBlock(string requestId, int blockNumber, byte[] content, Encoding? textEncoding)
public void ResponseContentBlock(PipelineResponse response, int blockNumber, byte[] content, Encoding? textEncoding)
{
if (IsEnabled(EventLevel.Verbose, EventKeywords.None))
{
Response? rsp = response as Response;
if (textEncoding is not null)
{
ResponseContentTextBlock(requestId, blockNumber, textEncoding.GetString(content));
ResponseContentTextBlock(rsp?.ClientRequestId ?? string.Empty, blockNumber, textEncoding.GetString(content));
}
else
{
ResponseContentBlock(requestId, blockNumber, content);
ResponseContentBlock(rsp?.ClientRequestId ?? string.Empty, blockNumber, content);
}
}
}
Expand All @@ -167,11 +175,12 @@ public void ResponseContentTextBlock(string requestId, int blockNumber, string c
}

[NonEvent]
public void ErrorResponse(Response response, HttpMessageSanitizer sanitizer, double elapsed)
public void ErrorResponse(PipelineResponse response, HttpMessageSanitizer sanitizer, double elapsed)
{
if (IsEnabled(EventLevel.Warning, EventKeywords.None))
{
ErrorResponse(response.ClientRequestId, response.Status, response.ReasonPhrase, FormatHeaders(response.Headers, sanitizer), elapsed);
Response? rsp = response as Response;
ErrorResponse(rsp?.ClientRequestId ?? string.Empty, response.Status, response.ReasonPhrase, FormatHeaders(response.Headers, sanitizer), elapsed);
}
}

Expand All @@ -183,17 +192,18 @@ public void ErrorResponse(string requestId, int status, string reasonPhrase, str
}

[NonEvent]
public void ErrorResponseContent(string requestId, byte[] content, Encoding? textEncoding)
public void ErrorResponseContent(PipelineResponse response, byte[] content, Encoding? textEncoding)
{
if (IsEnabled(EventLevel.Informational, EventKeywords.None))
{
Response? rsp = response as Response;
if (textEncoding is not null)
{
ErrorResponseContentText(requestId, textEncoding.GetString(content));
ErrorResponseContentText(rsp?.ClientRequestId ?? string.Empty, textEncoding.GetString(content));
}
else
{
ErrorResponseContent(requestId, content);
ErrorResponseContent(rsp?.ClientRequestId ?? string.Empty, content);
}
}
}
Expand All @@ -212,17 +222,18 @@ public void ErrorResponseContentText(string requestId, string content)
}

[NonEvent]
public void ErrorResponseContentBlock(string requestId, int blockNumber, byte[] content, Encoding? textEncoding)
public void ErrorResponseContentBlock(PipelineResponse response, int blockNumber, byte[] content, Encoding? textEncoding)
{
if (IsEnabled(EventLevel.Informational, EventKeywords.None))
{
Response? rsp = response as Response;
if (textEncoding is not null)
{
ErrorResponseContentTextBlock(requestId, blockNumber, textEncoding.GetString(content));
ErrorResponseContentTextBlock(rsp?.ClientRequestId ?? string.Empty, blockNumber, textEncoding.GetString(content));
}
else
{
ErrorResponseContentBlock(requestId, blockNumber, content);
ErrorResponseContentBlock(rsp?.ClientRequestId ?? string.Empty, blockNumber, content);
}
}
}
Expand Down Expand Up @@ -305,14 +316,14 @@ public void PipelineTransportOptionsNotApplied(string optionsType)
}

[NonEvent]
private static string FormatHeaders(IEnumerable<HttpHeader> headers, HttpMessageSanitizer sanitizer)
private static string FormatHeaders(IEnumerable<KeyValuePair<string, string>> headers, HttpMessageSanitizer sanitizer)
{
var stringBuilder = new StringBuilder();
foreach (HttpHeader header in headers)
foreach (var header in headers)
{
stringBuilder.Append(header.Name);
stringBuilder.Append(header.Key);
stringBuilder.Append(':');
stringBuilder.Append(sanitizer.SanitizeHeader(header.Name, header.Value));
stringBuilder.Append(sanitizer.SanitizeHeader(header.Key, header.Value));
stringBuilder.Append(Environment.NewLine);
}
return stringBuilder.ToString();
Expand Down
2 changes: 1 addition & 1 deletion sdk/core/Azure.Core/src/Pipeline/HttpPipelineBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ void AddNonNullPolicies(HttpPipelinePolicy[] policiesToAdd)
{
string assemblyName = buildOptions.ClientOptions.GetType().Assembly!.GetName().Name!;

policies.Add(new LoggingPolicy(diagnostics.IsLoggingContentEnabled, diagnostics.LoggedContentSizeLimit, sanitizer, assemblyName));
policies.Add(new LoggingPolicy(diagnostics.IsLoggingContentEnabled, diagnostics.LoggedContentSizeLimit, diagnostics.LoggedHeaderNames.ToArray(), diagnostics.LoggedQueryParameters.ToArray(), assemblyName));
}

policies.Add(new RequestActivityPolicy(isDistributedTracingEnabled, ClientDiagnostics.GetResourceProviderNamespace(buildOptions.ClientOptions.GetType().Assembly), sanitizer));
Expand Down
Loading