8
8
use std:: io;
9
9
10
10
use chrono:: Utc ;
11
- use opentelemetry:: trace:: { SpanId , TraceId } ;
11
+ use opentelemetry:: trace:: TraceContextExt ;
12
12
use 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 ;
16
15
use tracing_serde:: fields:: AsMap ;
17
16
use tracing_serde:: AsSerde ;
18
17
use tracing_subscriber:: fmt:: format:: Writer ;
19
18
use 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 ;
52
20
53
21
// mostly stolen from here: https://github.com/tokio-rs/tracing/issues/1531
54
22
pub struct DatadogFormatter ;
60
28
{
61
29
fn format_event (
62
30
& self ,
63
- ctx : & FmtContext < ' _ , S , N > ,
31
+ _ctx : & FmtContext < ' _ , S , N > ,
64
32
mut writer : Writer < ' _ > ,
65
33
event : & Event < ' _ > ,
66
34
) -> std:: fmt:: Result
@@ -77,12 +45,15 @@ where
77
45
serializer. serialize_entry ( "fields" , & event. field_map ( ) ) ?;
78
46
serializer. serialize_entry ( "target" , meta. target ( ) ) ?;
79
47
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}" ) ) ?;
86
57
87
58
serializer. end ( )
88
59
} ;
@@ -115,25 +86,3 @@ impl<'a> io::Write for WriteAdaptor<'a> {
115
86
Ok ( ( ) )
116
87
}
117
88
}
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