1- use axum:: { extract:: Request , middleware:: Next , response:: Response } ;
2- use opentelemetry:: trace:: { SpanContext , SpanId , TraceContextExt , TraceFlags , TraceId } ;
3- use opentelemetry:: Context ;
41use opentelemetry:: { global, KeyValue } ;
52use opentelemetry_otlp:: WithExportConfig ;
63use opentelemetry_sdk:: propagation:: TraceContextPropagator ;
@@ -10,56 +7,63 @@ use tracing_subscriber::layer::SubscriberExt;
107use tracing_subscriber:: util:: SubscriberInitExt ;
118use tracing_subscriber:: { EnvFilter , Layer } ;
129
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 ,
2522 }
2623
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+ } )
3045 }
3146
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+ }
6367}
6468
6569/// Init logging using env variables LOG_LEVEL and LOG_FORMAT:
0 commit comments