1
- use axum:: { extract:: Request , middleware:: Next , response:: Response } ;
2
- use opentelemetry:: trace:: { SpanContext , SpanId , TraceContextExt , TraceFlags , TraceId } ;
3
- use opentelemetry:: Context ;
4
1
use opentelemetry:: { global, KeyValue } ;
5
2
use opentelemetry_otlp:: WithExportConfig ;
6
3
use opentelemetry_sdk:: propagation:: TraceContextPropagator ;
@@ -10,56 +7,63 @@ use tracing_subscriber::layer::SubscriberExt;
10
7
use tracing_subscriber:: util:: SubscriberInitExt ;
11
8
use tracing_subscriber:: { EnvFilter , Layer } ;
12
9
13
- struct TraceParent {
14
- # [ allow ( dead_code ) ]
15
- version : u8 ,
16
- trace_id : TraceId ,
17
- parent_id : SpanId ,
18
- trace_flags : TraceFlags ,
19
- }
20
-
21
- fn parse_traceparent ( header_value : & str ) -> Option < TraceParent > {
22
- let parts : Vec < & str > = header_value . split ( '-' ) . collect ( ) ;
23
- if parts . len ( ) != 4 {
24
- return None ;
10
+ # [ cfg ( feature = "http" ) ]
11
+ pub mod http {
12
+ use axum :: { extract :: Request , middleware :: Next , response :: Response } ;
13
+ use opentelemetry :: trace :: { SpanContext , TraceContextExt } ;
14
+ use opentelemetry :: trace :: { SpanId , TraceFlags , TraceId } ;
15
+ use opentelemetry :: Context ;
16
+ struct TraceParent {
17
+ # [ allow ( dead_code ) ]
18
+ version : u8 ,
19
+ trace_id : TraceId ,
20
+ parent_id : SpanId ,
21
+ trace_flags : TraceFlags ,
25
22
}
26
23
27
- let version = u8:: from_str_radix ( parts[ 0 ] , 16 ) . ok ( ) ?;
28
- if version == 0xff {
29
- return None ;
24
+ fn parse_traceparent ( header_value : & str ) -> Option < TraceParent > {
25
+ let parts: Vec < & str > = header_value. split ( '-' ) . collect ( ) ;
26
+ if parts. len ( ) != 4 {
27
+ return None ;
28
+ }
29
+
30
+ let version = u8:: from_str_radix ( parts[ 0 ] , 16 ) . ok ( ) ?;
31
+ if version == 0xff {
32
+ return None ;
33
+ }
34
+
35
+ let trace_id = TraceId :: from_hex ( parts[ 1 ] ) . ok ( ) ?;
36
+ let parent_id = SpanId :: from_hex ( parts[ 2 ] ) . ok ( ) ?;
37
+ let trace_flags = u8:: from_str_radix ( parts[ 3 ] , 16 ) . ok ( ) ?;
38
+
39
+ Some ( TraceParent {
40
+ version,
41
+ trace_id,
42
+ parent_id,
43
+ trace_flags : TraceFlags :: new ( trace_flags) ,
44
+ } )
30
45
}
31
46
32
- let trace_id = TraceId :: from_hex ( parts[ 1 ] ) . ok ( ) ?;
33
- let parent_id = SpanId :: from_hex ( parts[ 2 ] ) . ok ( ) ?;
34
- let trace_flags = u8:: from_str_radix ( parts[ 3 ] , 16 ) . ok ( ) ?;
35
-
36
- Some ( TraceParent {
37
- version,
38
- trace_id,
39
- parent_id,
40
- trace_flags : TraceFlags :: new ( trace_flags) ,
41
- } )
42
- }
43
-
44
- pub async fn trace_context_middleware ( mut request : Request , next : Next ) -> Response {
45
- let context = request
46
- . headers ( )
47
- . get ( "traceparent" )
48
- . and_then ( |v| v. to_str ( ) . ok ( ) )
49
- . and_then ( parse_traceparent)
50
- . map ( |traceparent| {
51
- Context :: new ( ) . with_remote_span_context ( SpanContext :: new (
52
- traceparent. trace_id ,
53
- traceparent. parent_id ,
54
- traceparent. trace_flags ,
55
- true ,
56
- Default :: default ( ) ,
57
- ) )
58
- } ) ;
59
-
60
- request. extensions_mut ( ) . insert ( context) ;
61
-
62
- next. run ( request) . await
47
+ pub async fn trace_context_middleware ( mut request : Request , next : Next ) -> Response {
48
+ let context = request
49
+ . headers ( )
50
+ . get ( "traceparent" )
51
+ . and_then ( |v| v. to_str ( ) . ok ( ) )
52
+ . and_then ( parse_traceparent)
53
+ . map ( |traceparent| {
54
+ Context :: new ( ) . with_remote_span_context ( SpanContext :: new (
55
+ traceparent. trace_id ,
56
+ traceparent. parent_id ,
57
+ traceparent. trace_flags ,
58
+ true ,
59
+ Default :: default ( ) ,
60
+ ) )
61
+ } ) ;
62
+
63
+ request. extensions_mut ( ) . insert ( context) ;
64
+
65
+ next. run ( request) . await
66
+ }
63
67
}
64
68
65
69
/// Init logging using env variables LOG_LEVEL and LOG_FORMAT:
0 commit comments