Skip to content

Commit 94a860d

Browse files
committed
Added correlation id to http client trace
1 parent baf432d commit 94a860d

1 file changed

Lines changed: 27 additions & 21 deletions

File tree

src/Dibix.Http.Client/Client/Handlers/TracingHttpMessageHandler.cs

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,31 @@ public sealed class TracingHttpMessageHandler : DelegatingHandler
1818
private readonly Stopwatch _requestDurationTracker = new Stopwatch();
1919
private readonly HttpRequestTracer _tracer;
2020
private readonly DibixHttpClientTraceSource _traceSource;
21+
private readonly Random _random;
2122
#endregion
2223

2324
#region Constructor
2425
public TracingHttpMessageHandler(HttpRequestTracer tracer)
2526
{
2627
_tracer = tracer;
2728
_traceSource = new DibixHttpClientTraceSource("Dibix.Http.Client");
29+
_random = new Random();
2830
}
2931
#endregion
3032

3133
#region Overrides
3234
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
3335
{
34-
await TraceRequest(request).ConfigureAwait(false);
36+
int requestId = _random.Next(minValue: 1000, maxValue: 10000);
37+
await TraceRequest(request, requestId).ConfigureAwait(false);
3538

3639
try
3740
{
3841
StartTracking();
3942
HttpResponseMessage responseMessage = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
4043
FinishTracking();
4144

42-
await TraceResponse(responseMessage).ConfigureAwait(false);
45+
await TraceResponse(responseMessage, requestId).ConfigureAwait(false);
4346

4447
return responseMessage;
4548
}
@@ -51,17 +54,17 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
5154
#endregion
5255

5356
#region Private Methods
54-
private async Task TraceRequest(HttpRequestMessage request)
57+
private async Task TraceRequest(HttpRequestMessage request, int requestId)
5558
{
56-
await WriteRequestToTraceSource(request).ConfigureAwait(false);
59+
await WriteRequestToTraceSource(request, requestId).ConfigureAwait(false);
5760

5861
if (_tracer != null)
5962
await _tracer.TraceRequestAsync(request).ConfigureAwait(false);
6063
}
6164

62-
private async Task TraceResponse(HttpResponseMessage response)
65+
private async Task TraceResponse(HttpResponseMessage response, int requestId)
6366
{
64-
await WriteResponseToTraceSource(response).ConfigureAwait(false);
67+
await WriteResponseToTraceSource(response, requestId).ConfigureAwait(false);
6568

6669
if (_tracer != null)
6770
await _tracer.TraceResponseAsync(response, _requestDurationTracker.Elapsed).ConfigureAwait(false);
@@ -71,29 +74,32 @@ private async Task TraceResponse(HttpResponseMessage response)
7174

7275
private void FinishTracking() => _requestDurationTracker.Stop();
7376

74-
private async Task WriteRequestToTraceSource(HttpRequestMessage request)
77+
private async Task WriteRequestToTraceSource(HttpRequestMessage request, int requestId)
7578
{
76-
if (!_traceSource.Switch.ShouldTrace(TraceEventType.Information))
77-
return;
79+
string GetRequestText(string requestContentText) => request.GetFormattedText(requestContentText, _traceSource.MaxBodyLength, _traceSource.MaskSensitiveBody);
80+
await WriteToTraceSource("request", requestId, request.Content, GetRequestText).ConfigureAwait(false);
81+
}
7882

79-
string requestContentText = await GetHttpContentText(request.Content).ConfigureAwait(false);
80-
string requestText = request.GetFormattedText(requestContentText, _traceSource.MaxBodyLength, _traceSource.MaskSensitiveBody);
81-
string message = $@"HTTP request
82-
-
83-
{requestText}";
84-
_traceSource.TraceInformation(message);
83+
private async Task WriteResponseToTraceSource(HttpResponseMessage response, int requestId)
84+
{
85+
string GetResponseText(string responseContentText) => response.GetFormattedText(responseContentText, _traceSource.MaxBodyLength, _traceSource.MaskSensitiveBody);
86+
await WriteToTraceSource("response", requestId, response.Content, GetResponseText).ConfigureAwait(false);
8587
}
8688

87-
private async Task WriteResponseToTraceSource(HttpResponseMessage response)
89+
private async Task WriteToTraceSource(string kind, int requestId, HttpContent content, Func<string, string> textProvider)
8890
{
8991
if (!_traceSource.Switch.ShouldTrace(TraceEventType.Information))
9092
return;
9193

92-
string responseContentText = await GetHttpContentText(response.Content).ConfigureAwait(false);
93-
string responseText = response.GetFormattedText(responseContentText, _traceSource.MaxBodyLength, _traceSource.MaskSensitiveBody);
94-
string message = $@"HTTP response
95-
-
96-
{responseText}";
94+
string contentText = await GetHttpContentText(content).ConfigureAwait(false);
95+
string text = textProvider(contentText);
96+
string header = $"HTTP {kind} [{requestId}]";
97+
string line = $@"
98+
{new string('=', header.Length)}
99+
";
100+
string message = $@"{header}
101+
{line}
102+
{text}";
97103
_traceSource.TraceInformation(message);
98104
}
99105

0 commit comments

Comments
 (0)