@@ -10,6 +10,7 @@ use std::io;
1010use chrono:: Utc ;
1111use opentelemetry:: trace:: { SpanId , TraceContextExt , TraceId } ;
1212use serde:: ser:: { SerializeMap , Serializer as _} ;
13+ use serde:: Serialize ;
1314use tracing:: { Event , Subscriber } ;
1415use tracing_opentelemetry:: OtelData ;
1516use tracing_serde:: fields:: AsMap ;
@@ -18,31 +19,34 @@ use tracing_subscriber::fmt::format::Writer;
1819use tracing_subscriber:: fmt:: { FmtContext , FormatEvent , FormatFields } ;
1920use tracing_subscriber:: registry:: { LookupSpan , SpanRef } ;
2021
22+ #[ derive( Serialize ) ]
23+ struct DatadogId ( u64 ) ;
24+
2125struct TraceInfo {
22- trace_id : String ,
23- span_id : String ,
26+ trace_id : DatadogId ,
27+ span_id : DatadogId ,
2428}
2529
26- fn convert_trace_id ( id : TraceId ) -> String {
27- let bytes = & id . to_bytes ( ) [ std :: mem :: size_of :: < u64 > ( ) ..std :: mem :: size_of :: < u128 > ( ) ] ;
28- let dd_id = u64 :: from_be_bytes ( bytes . try_into ( ) . unwrap ( ) ) ;
29-
30- dd_id . to_string ( )
30+ impl From < TraceId > for DatadogId {
31+ fn from ( value : TraceId ) -> Self {
32+ let bytes = & value . to_bytes ( ) [ std :: mem :: size_of :: < u64 > ( ) ..std :: mem :: size_of :: < u128 > ( ) ] ;
33+ Self ( u64 :: from_be_bytes ( bytes . try_into ( ) . unwrap ( ) ) )
34+ }
3135}
3236
33- fn convert_span_id ( id : SpanId ) -> String {
34- let dd_id = u64 :: from_be_bytes ( id . to_bytes ( ) ) ;
35-
36- dd_id . to_string ( )
37+ impl From < SpanId > for DatadogId {
38+ fn from ( value : SpanId ) -> Self {
39+ Self ( u64 :: from_be_bytes ( value . to_bytes ( ) ) )
40+ }
3741}
3842
3943fn lookup_trace_info < S > ( span_ref : & SpanRef < S > ) -> Option < TraceInfo >
4044where
4145 S : Subscriber + for < ' a > LookupSpan < ' a > ,
4246{
4347 span_ref. extensions ( ) . get :: < OtelData > ( ) . map ( |o| TraceInfo {
44- trace_id : convert_trace_id ( o. parent_cx . span ( ) . span_context ( ) . trace_id ( ) ) ,
45- span_id : convert_span_id ( o. builder . span_id . unwrap_or ( SpanId :: INVALID ) ) ,
48+ trace_id : o. parent_cx . span ( ) . span_context ( ) . trace_id ( ) . into ( ) ,
49+ span_id : o. builder . span_id . unwrap_or ( SpanId :: INVALID ) . into ( ) ,
4650 } )
4751}
4852
@@ -114,3 +118,25 @@ impl<'a> io::Write for WriteAdaptor<'a> {
114118 Ok ( ( ) )
115119 }
116120}
121+
122+ #[ cfg( test) ]
123+ mod tests {
124+ use crate :: formatter:: DatadogId ;
125+ use opentelemetry:: trace:: { SpanId , TraceId } ;
126+
127+ #[ test]
128+ fn test_trace_id_converted_to_datadog_id ( ) {
129+ let trace_id = TraceId :: from_hex ( "2de7888d8f42abc9c7ba048b78f7a9fb" ) . unwrap ( ) ;
130+ let datadog_id: DatadogId = trace_id. into ( ) ;
131+
132+ assert_eq ! ( datadog_id. 0 , 14391820556292303355 ) ;
133+ }
134+
135+ #[ test]
136+ fn test_span_id_converted_to_datadog_id ( ) {
137+ let span_id = SpanId :: from_hex ( "58406520a0066491" ) . unwrap ( ) ;
138+ let datadog_id: DatadogId = span_id. into ( ) ;
139+
140+ assert_eq ! ( datadog_id. 0 , 6359193864645272721 ) ;
141+ }
142+ }
0 commit comments