@@ -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