88use std:: io;
99
1010use chrono:: Utc ;
11- use opentelemetry:: trace:: { SpanId , TraceId } ;
11+ use opentelemetry:: trace:: TraceContextExt ;
1212use serde:: ser:: { SerializeMap , Serializer as _} ;
13- use serde:: Serialize ;
14- use tracing:: { Event , Subscriber } ;
15- use tracing_opentelemetry:: OtelData ;
13+ use tracing:: { Event , Span , Subscriber } ;
14+ use tracing_opentelemetry:: OpenTelemetrySpanExt ;
1615use tracing_serde:: fields:: AsMap ;
1716use tracing_serde:: AsSerde ;
1817use tracing_subscriber:: fmt:: format:: Writer ;
1918use tracing_subscriber:: fmt:: { FmtContext , FormatEvent , FormatFields } ;
20- use tracing_subscriber:: registry:: { LookupSpan , SpanRef } ;
21-
22- #[ derive( Serialize ) ]
23- struct DatadogId ( u64 ) ;
24-
25- struct TraceInfo {
26- trace_id : DatadogId ,
27- span_id : DatadogId ,
28- }
29-
30- impl From < TraceId > for DatadogId {
31- fn from ( value : TraceId ) -> Self {
32- let bytes = & value. to_bytes ( ) [ size_of :: < u64 > ( ) ..size_of :: < u128 > ( ) ] ;
33- Self ( u64:: from_be_bytes ( bytes. try_into ( ) . unwrap ( ) ) )
34- }
35- }
36-
37- impl From < SpanId > for DatadogId {
38- fn from ( value : SpanId ) -> Self {
39- Self ( u64:: from_be_bytes ( value. to_bytes ( ) ) )
40- }
41- }
42-
43- fn lookup_trace_info < S > ( span_ref : & SpanRef < S > ) -> Option < TraceInfo >
44- where
45- S : Subscriber + for < ' a > LookupSpan < ' a > ,
46- {
47- span_ref. extensions ( ) . get :: < OtelData > ( ) . map ( |o| TraceInfo {
48- trace_id : o. builder . trace_id . unwrap_or ( TraceId :: INVALID ) . into ( ) ,
49- span_id : o. builder . span_id . unwrap_or ( SpanId :: INVALID ) . into ( ) ,
50- } )
51- }
19+ use tracing_subscriber:: registry:: LookupSpan ;
5220
5321// mostly stolen from here: https://github.com/tokio-rs/tracing/issues/1531
5422pub struct DatadogFormatter ;
6028{
6129 fn format_event (
6230 & self ,
63- ctx : & FmtContext < ' _ , S , N > ,
31+ _ctx : & FmtContext < ' _ , S , N > ,
6432 mut writer : Writer < ' _ > ,
6533 event : & Event < ' _ > ,
6634 ) -> std:: fmt:: Result
@@ -77,12 +45,15 @@ where
7745 serializer. serialize_entry ( "fields" , & event. field_map ( ) ) ?;
7846 serializer. serialize_entry ( "target" , meta. target ( ) ) ?;
7947
80- if let Some ( ref span_ref) = ctx. lookup_current ( ) {
81- if let Some ( trace_info) = lookup_trace_info ( span_ref) {
82- serializer. serialize_entry ( "dd.span_id" , & trace_info. span_id ) ?;
83- serializer. serialize_entry ( "dd.trace_id" , & trace_info. trace_id ) ?;
84- }
85- }
48+ let otel_context = Span :: current ( ) . context ( ) ;
49+ let span = otel_context. span ( ) ;
50+ let span_context = span. span_context ( ) ;
51+
52+ let span_id = span_context. span_id ( ) ;
53+ let trace_id = span_context. trace_id ( ) ;
54+
55+ serializer. serialize_entry ( "dd.span_id" , & format ! ( "{span_id}" ) ) ?;
56+ serializer. serialize_entry ( "dd.trace_id" , & format ! ( "{trace_id}" ) ) ?;
8657
8758 serializer. end ( )
8859 } ;
@@ -115,25 +86,3 @@ impl<'a> io::Write for WriteAdaptor<'a> {
11586 Ok ( ( ) )
11687 }
11788}
118-
119- #[ cfg( test) ]
120- mod tests {
121- use crate :: formatter:: DatadogId ;
122- use opentelemetry:: trace:: { SpanId , TraceId } ;
123-
124- #[ test]
125- fn test_trace_id_converted_to_datadog_id ( ) {
126- let trace_id = TraceId :: from_hex ( "2de7888d8f42abc9c7ba048b78f7a9fb" ) . unwrap ( ) ;
127- let datadog_id: DatadogId = trace_id. into ( ) ;
128-
129- assert_eq ! ( datadog_id. 0 , 14391820556292303355 ) ;
130- }
131-
132- #[ test]
133- fn test_span_id_converted_to_datadog_id ( ) {
134- let span_id = SpanId :: from_hex ( "58406520a0066491" ) . unwrap ( ) ;
135- let datadog_id: DatadogId = span_id. into ( ) ;
136-
137- assert_eq ! ( datadog_id. 0 , 6359193864645272721 ) ;
138- }
139- }
0 commit comments