11use libdd_trace_utils:: send_data:: SendDataBuilder ;
2+ use libdd_trace_utils:: trace_utils:: TracerHeaderTags ;
23use std:: collections:: VecDeque ;
34
45/// Maximum content size per payload uncompressed in bytes,
@@ -7,16 +8,71 @@ use std::collections::VecDeque;
78/// <https://github.com/DataDog/datadog-agent/blob/9d57c10a9eeb3916e661d35dbd23c6e36395a99d/pkg/trace/writer/trace.go#L27-L31>
89pub const MAX_CONTENT_SIZE_BYTES : usize = 3_200_000 ;
910
11+ /// Owned version of `TracerHeaderTags<'a>` so it can be stored across async
12+ /// boundaries without lifetime issues.
13+ pub struct OwnedTracerHeaderTags {
14+ pub lang : String ,
15+ pub lang_version : String ,
16+ pub lang_interpreter : String ,
17+ pub lang_vendor : String ,
18+ pub tracer_version : String ,
19+ pub container_id : String ,
20+ pub client_computed_top_level : bool ,
21+ pub client_computed_stats : bool ,
22+ pub dropped_p0_traces : usize ,
23+ pub dropped_p0_spans : usize ,
24+ }
25+
26+ impl From < TracerHeaderTags < ' _ > > for OwnedTracerHeaderTags {
27+ fn from ( tags : TracerHeaderTags < ' _ > ) -> Self {
28+ Self {
29+ lang : tags. lang . to_string ( ) ,
30+ lang_version : tags. lang_version . to_string ( ) ,
31+ lang_interpreter : tags. lang_interpreter . to_string ( ) ,
32+ lang_vendor : tags. lang_vendor . to_string ( ) ,
33+ tracer_version : tags. tracer_version . to_string ( ) ,
34+ container_id : tags. container_id . to_string ( ) ,
35+ client_computed_top_level : tags. client_computed_top_level ,
36+ client_computed_stats : tags. client_computed_stats ,
37+ dropped_p0_traces : tags. dropped_p0_traces ,
38+ dropped_p0_spans : tags. dropped_p0_spans ,
39+ }
40+ }
41+ }
42+
43+ impl OwnedTracerHeaderTags {
44+ #[ must_use]
45+ pub fn to_tracer_header_tags ( & self ) -> TracerHeaderTags < ' _ > {
46+ TracerHeaderTags {
47+ lang : & self . lang ,
48+ lang_version : & self . lang_version ,
49+ lang_interpreter : & self . lang_interpreter ,
50+ lang_vendor : & self . lang_vendor ,
51+ tracer_version : & self . tracer_version ,
52+ container_id : & self . container_id ,
53+ client_computed_top_level : self . client_computed_top_level ,
54+ client_computed_stats : self . client_computed_stats ,
55+ dropped_p0_traces : self . dropped_p0_traces ,
56+ dropped_p0_spans : self . dropped_p0_spans ,
57+ }
58+ }
59+ }
60+
1061// Bundle SendDataBuilder with payload size because SendDataBuilder doesn't
1162// expose a getter for the size
1263pub struct SendDataBuilderInfo {
1364 pub builder : SendDataBuilder ,
1465 pub size : usize ,
66+ pub header_tags : OwnedTracerHeaderTags ,
1567}
1668
1769impl SendDataBuilderInfo {
18- pub fn new ( builder : SendDataBuilder , size : usize ) -> Self {
19- Self { builder, size }
70+ pub fn new ( builder : SendDataBuilder , size : usize , header_tags : OwnedTracerHeaderTags ) -> Self {
71+ Self {
72+ builder,
73+ size,
74+ header_tags,
75+ }
2076 }
2177}
2278
@@ -25,7 +81,7 @@ impl SendDataBuilderInfo {
2581pub struct TraceAggregator {
2682 queue : VecDeque < SendDataBuilderInfo > ,
2783 max_content_size_bytes : usize ,
28- buffer : Vec < SendDataBuilder > ,
84+ buffer : Vec < SendDataBuilderInfo > ,
2985}
3086
3187impl Default for TraceAggregator {
@@ -55,7 +111,7 @@ impl TraceAggregator {
55111 }
56112
57113 /// Returns a batch of trace payloads, subject to the max content size.
58- pub fn get_batch ( & mut self ) -> Vec < SendDataBuilder > {
114+ pub fn get_batch ( & mut self ) -> Vec < SendDataBuilderInfo > {
59115 let mut batch_size = 0 ;
60116
61117 // Fill the batch
@@ -70,7 +126,7 @@ impl TraceAggregator {
70126 break ;
71127 }
72128 batch_size += payload_size;
73- self . buffer . push ( payload_info. builder ) ;
129+ self . buffer . push ( payload_info) ;
74130 } else {
75131 break ;
76132 }
@@ -95,8 +151,8 @@ mod tests {
95151
96152 use super :: * ;
97153
98- fn make_builder ( size : usize ) -> SendDataBuilder {
99- let tracer_header_tags = TracerHeaderTags {
154+ fn make_header_tags ( ) -> TracerHeaderTags < ' static > {
155+ TracerHeaderTags {
100156 lang : "lang" ,
101157 lang_version : "lang_version" ,
102158 lang_interpreter : "lang_interpreter" ,
@@ -107,21 +163,26 @@ mod tests {
107163 client_computed_stats : true ,
108164 dropped_p0_traces : 0 ,
109165 dropped_p0_spans : 0 ,
110- } ;
111- SendDataBuilder :: new (
166+ }
167+ }
168+
169+ fn make_builder_info ( size : usize ) -> SendDataBuilderInfo {
170+ let tracer_header_tags = make_header_tags ( ) ;
171+ let builder = SendDataBuilder :: new (
112172 size,
113173 TracerPayloadCollection :: V07 ( Vec :: new ( ) ) ,
114- tracer_header_tags,
174+ tracer_header_tags. clone ( ) ,
115175 & Endpoint :: from_slice ( "localhost" ) ,
116- )
176+ ) ;
177+ SendDataBuilderInfo :: new ( builder, size, OwnedTracerHeaderTags :: from ( tracer_header_tags) )
117178 }
118179
119180 #[ test]
120181 fn test_add ( ) {
121182 let mut aggregator = TraceAggregator :: default ( ) ;
122183 let size = 1 ;
123184
124- aggregator. add ( SendDataBuilderInfo :: new ( make_builder ( size ) , size) ) ;
185+ aggregator. add ( make_builder_info ( size) ) ;
125186 assert_eq ! ( aggregator. queue. len( ) , 1 ) ;
126187 }
127188
@@ -130,7 +191,7 @@ mod tests {
130191 let mut aggregator = TraceAggregator :: default ( ) ;
131192 let size = 1 ;
132193
133- aggregator. add ( SendDataBuilderInfo :: new ( make_builder ( size ) , size) ) ;
194+ aggregator. add ( make_builder_info ( size) ) ;
134195 assert_eq ! ( aggregator. queue. len( ) , 1 ) ;
135196 let batch = aggregator. get_batch ( ) ;
136197 assert_eq ! ( batch. len( ) , 1 ) ;
@@ -142,9 +203,9 @@ mod tests {
142203 let size = 1 ;
143204
144205 // Add 3 payloads
145- aggregator. add ( SendDataBuilderInfo :: new ( make_builder ( size ) , size) ) ;
146- aggregator. add ( SendDataBuilderInfo :: new ( make_builder ( size ) , size) ) ;
147- aggregator. add ( SendDataBuilderInfo :: new ( make_builder ( size ) , size) ) ;
206+ aggregator. add ( make_builder_info ( size) ) ;
207+ aggregator. add ( make_builder_info ( size) ) ;
208+ aggregator. add ( make_builder_info ( size) ) ;
148209
149210 // The batch should only contain the first 2 payloads
150211 let first_batch = aggregator. get_batch ( ) ;
0 commit comments