3
3
using System . Net . Http . Headers ;
4
4
using System . Threading . Tasks ;
5
5
using zipkin4net . Propagation ;
6
+ using zipkin4net . Tracers . Zipkin . Thrift ;
6
7
7
8
namespace zipkin4net . Transport . Http
8
9
{
@@ -11,32 +12,41 @@ public class TracingHandler : DelegatingHandler
11
12
private readonly IInjector < HttpHeaders > _injector ;
12
13
private readonly string _serviceName ;
13
14
private readonly Func < HttpRequestMessage , string > _getClientTraceRpc ;
15
+ private readonly bool _logHttpHost ;
14
16
15
17
/// <summary>
16
18
/// Create a Tracing Handler
17
19
/// </summary>
18
20
/// <param name="serviceName"></param>
19
21
/// <param name="httpMessageHandler">if not set or null then it set an <see cref="HttpClientHandler"/> as inner handler</param>
20
22
/// <param name="getClientTraceRpc"></param>
21
- public TracingHandler ( string serviceName , HttpMessageHandler httpMessageHandler = null , Func < HttpRequestMessage , string > getClientTraceRpc = null )
22
- : this ( Propagations . B3String . Injector < HttpHeaders > ( ( carrier , key , value ) => carrier . Add ( key , value ) ) , serviceName , httpMessageHandler ?? new HttpClientHandler ( ) , getClientTraceRpc )
23
+ /// <param name="logHttpHost"></param>
24
+ public TracingHandler ( string serviceName , HttpMessageHandler httpMessageHandler = null ,
25
+ Func < HttpRequestMessage , string > getClientTraceRpc = null , bool logHttpHost = false )
26
+ : this ( Propagations . B3String . Injector < HttpHeaders > ( ( carrier , key , value ) => carrier . Add ( key , value ) ) ,
27
+ serviceName , httpMessageHandler ?? new HttpClientHandler ( ) , getClientTraceRpc , logHttpHost )
23
28
{ }
24
29
25
30
/// <summary>
26
31
/// Create a TracingHandler for injection purpose like HttpClientFactory in AspNetCore
27
32
/// </summary>
28
33
/// <param name="serviceName"></param>
29
34
/// <param name="getClientTraceRpc"></param>
35
+ /// <param name="logHttpHost"></param>
30
36
/// <returns></returns>
31
- public static TracingHandler WithoutInnerHandler ( string serviceName , Func < HttpRequestMessage , string > getClientTraceRpc = null )
32
- => new TracingHandler ( Propagations . B3String . Injector < HttpHeaders > ( ( carrier , key , value ) => carrier . Add ( key , value ) ) , serviceName , getClientTraceRpc ) ;
37
+ public static TracingHandler WithoutInnerHandler ( string serviceName ,
38
+ Func < HttpRequestMessage , string > getClientTraceRpc = null , bool logHttpHost = false )
39
+ => new TracingHandler ( Propagations . B3String . Injector < HttpHeaders > ( ( carrier , key , value ) => carrier . Add ( key , value ) ) ,
40
+ serviceName , getClientTraceRpc , logHttpHost ) ;
33
41
34
- private TracingHandler ( IInjector < HttpHeaders > injector , string serviceName , HttpMessageHandler httpMessageHandler , Func < HttpRequestMessage , string > getClientTraceRpc = null )
42
+ private TracingHandler ( IInjector < HttpHeaders > injector , string serviceName , HttpMessageHandler httpMessageHandler ,
43
+ Func < HttpRequestMessage , string > getClientTraceRpc = null , bool logHttpHost = false )
35
44
: base ( httpMessageHandler )
36
45
{
37
46
_injector = injector ;
38
47
_serviceName = serviceName ;
39
48
_getClientTraceRpc = getClientTraceRpc ?? ( request => request . Method . ToString ( ) ) ;
49
+ _logHttpHost = logHttpHost ;
40
50
}
41
51
42
52
/// <summary>
@@ -45,12 +55,16 @@ private TracingHandler(IInjector<HttpHeaders> injector, string serviceName, Http
45
55
/// <param name="injector"></param>
46
56
/// <param name="serviceName"></param>
47
57
/// <param name="getClientTraceRpc"></param>
48
- private TracingHandler ( IInjector < HttpHeaders > injector , string serviceName , Func < HttpRequestMessage , string > getClientTraceRpc = null )
58
+ /// <param name="logHttpHost"></param>
59
+ private TracingHandler ( IInjector < HttpHeaders > injector , string serviceName ,
60
+ Func < HttpRequestMessage , string > getClientTraceRpc = null , bool logHttpHost = false )
49
61
{
50
62
_injector = injector ;
51
63
_serviceName = serviceName ;
52
64
_getClientTraceRpc = getClientTraceRpc ?? ( request => request . Method . ToString ( ) ) ;
65
+ _logHttpHost = logHttpHost ;
53
66
}
67
+
54
68
protected override async Task < HttpResponseMessage > SendAsync ( HttpRequestMessage request , System . Threading . CancellationToken cancellationToken )
55
69
{
56
70
using ( var clientTrace = new ClientTrace ( _serviceName , _getClientTraceRpc ( request ) ) )
@@ -59,7 +73,24 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
59
73
{
60
74
_injector . Inject ( clientTrace . Trace . CurrentSpan , request . Headers ) ;
61
75
}
62
- return await clientTrace . TracedActionAsync ( base . SendAsync ( request , cancellationToken ) ) ;
76
+
77
+ var result = await clientTrace . TracedActionAsync ( base . SendAsync ( request , cancellationToken ) ) ;
78
+
79
+ if ( clientTrace . Trace != null )
80
+ {
81
+ clientTrace . AddAnnotation ( Annotations . Tag ( zipkinCoreConstants . HTTP_PATH , result . RequestMessage . RequestUri . LocalPath ) ) ;
82
+ clientTrace . AddAnnotation ( Annotations . Tag ( zipkinCoreConstants . HTTP_METHOD , result . RequestMessage . Method . Method ) ) ;
83
+ if ( _logHttpHost )
84
+ {
85
+ clientTrace . AddAnnotation ( Annotations . Tag ( zipkinCoreConstants . HTTP_HOST , result . RequestMessage . RequestUri . Host ) ) ;
86
+ }
87
+ if ( ! result . IsSuccessStatusCode )
88
+ {
89
+ clientTrace . AddAnnotation ( Annotations . Tag ( zipkinCoreConstants . HTTP_STATUS_CODE , ( ( int ) result . StatusCode ) . ToString ( ) ) ) ;
90
+ }
91
+ }
92
+
93
+ return result ;
63
94
}
64
95
}
65
96
}
0 commit comments