@@ -12,11 +12,11 @@ use datadog_trace_utils::{
12
12
} ;
13
13
use ddcommon:: tag:: Tag ;
14
14
use ddtelemetry:: worker:: {
15
- LifecycleAction , TelemetryActions , TelemetryWorkerBuilder , TelemetryWorkerFlavor ,
16
- TelemetryWorkerHandle ,
15
+ LifecycleAction , TelemetryActions , TelemetryWorker , TelemetryWorkerBuilder ,
16
+ TelemetryWorkerFlavor , TelemetryWorkerHandle ,
17
17
} ;
18
18
use std:: { collections:: HashMap , time:: Duration } ;
19
- use tokio:: task :: JoinHandle ;
19
+ use tokio:: runtime :: Handle ;
20
20
21
21
/// Structure to build a Telemetry client.
22
22
///
@@ -86,7 +86,10 @@ impl TelemetryClientBuilder {
86
86
}
87
87
88
88
/// Builds the telemetry client.
89
- pub async fn build ( self ) -> Result < TelemetryClient , TelemetryError > {
89
+ pub fn build (
90
+ self ,
91
+ runtime : Handle ,
92
+ ) -> Result < ( TelemetryClient , TelemetryWorker ) , TelemetryError > {
90
93
#[ allow( clippy:: unwrap_used) ]
91
94
let mut builder = TelemetryWorkerBuilder :: new_fetch_host (
92
95
self . service_name . unwrap ( ) ,
@@ -102,16 +105,17 @@ impl TelemetryClientBuilder {
102
105
builder. runtime_id = Some ( id) ;
103
106
}
104
107
105
- let ( worker, handle) = builder
106
- . spawn ( )
107
- . await
108
+ let ( worker_handle, worker) = builder
109
+ . build_worker ( runtime)
108
110
. map_err ( |e| TelemetryError :: Builder ( e. to_string ( ) ) ) ?;
109
111
110
- Ok ( TelemetryClient {
111
- handle,
112
- metrics : Metrics :: new ( & worker) ,
112
+ Ok ( (
113
+ TelemetryClient {
114
+ metrics : Metrics :: new ( & worker_handle) ,
115
+ worker : worker_handle,
116
+ } ,
113
117
worker,
114
- } )
118
+ ) )
115
119
}
116
120
}
117
121
@@ -120,7 +124,6 @@ impl TelemetryClientBuilder {
120
124
pub struct TelemetryClient {
121
125
metrics : Metrics ,
122
126
worker : TelemetryWorkerHandle ,
123
- handle : JoinHandle < ( ) > ,
124
127
}
125
128
126
129
/// Telemetry describing the sending of a trace payload
@@ -246,26 +249,18 @@ impl TelemetryClient {
246
249
247
250
/// Starts the client
248
251
pub async fn start ( & self ) {
249
- if let Err ( _e ) = self
252
+ _ = self
250
253
. worker
251
254
. send_msg ( TelemetryActions :: Lifecycle ( LifecycleAction :: Start ) )
252
- . await
253
- {
254
- self . handle . abort ( ) ;
255
- }
255
+ . await ;
256
256
}
257
257
258
258
/// Shutdowns the telemetry client.
259
259
pub async fn shutdown ( self ) {
260
- if let Err ( _e ) = self
260
+ _ = self
261
261
. worker
262
262
. send_msg ( TelemetryActions :: Lifecycle ( LifecycleAction :: Stop ) )
263
- . await
264
- {
265
- self . handle . abort ( ) ;
266
- }
267
-
268
- let _ = self . handle . await ;
263
+ . await ;
269
264
}
270
265
}
271
266
@@ -276,21 +271,23 @@ mod tests {
276
271
use httpmock:: MockServer ;
277
272
use hyper:: { Response , StatusCode } ;
278
273
use regex:: Regex ;
274
+ use tokio:: time:: sleep;
279
275
280
276
use super :: * ;
281
277
282
278
async fn get_test_client ( url : & str ) -> TelemetryClient {
283
- TelemetryClientBuilder :: default ( )
279
+ let ( client , mut worker ) = TelemetryClientBuilder :: default ( )
284
280
. set_service_name ( "test_service" )
285
281
. set_language ( "test_language" )
286
282
. set_language_version ( "test_language_version" )
287
283
. set_tracer_version ( "test_tracer_version" )
288
284
. set_url ( url)
289
285
. set_heartbeat ( 100 )
290
286
. set_debug_enabled ( true )
291
- . build ( )
292
- . await
293
- . unwrap ( )
287
+ . build ( Handle :: current ( ) )
288
+ . unwrap ( ) ;
289
+ tokio:: spawn ( async move { worker. run ( ) . await } ) ;
290
+ client
294
291
}
295
292
296
293
#[ test]
@@ -320,15 +317,14 @@ mod tests {
320
317
}
321
318
322
319
#[ cfg_attr( miri, ignore) ]
323
- #[ tokio:: test]
320
+ #[ tokio:: test( flavor = "multi_thread" ) ]
324
321
async fn spawn_test ( ) {
325
322
let client = TelemetryClientBuilder :: default ( )
326
323
. set_service_name ( "test_service" )
327
324
. set_language ( "test_language" )
328
325
. set_language_version ( "test_language_version" )
329
326
. set_tracer_version ( "test_tracer_version" )
330
- . build ( )
331
- . await ;
327
+ . build ( Handle :: current ( ) ) ;
332
328
333
329
assert ! ( client. is_ok( ) ) ;
334
330
}
@@ -356,6 +352,9 @@ mod tests {
356
352
client. start ( ) . await ;
357
353
let _ = client. send ( & data) ;
358
354
client. shutdown ( ) . await ;
355
+ while telemetry_srv. hits_async ( ) . await == 0 {
356
+ sleep ( Duration :: from_millis ( 10 ) ) . await ;
357
+ }
359
358
telemetry_srv. assert_hits_async ( 1 ) . await ;
360
359
}
361
360
@@ -382,6 +381,9 @@ mod tests {
382
381
client. start ( ) . await ;
383
382
let _ = client. send ( & data) ;
384
383
client. shutdown ( ) . await ;
384
+ while telemetry_srv. hits_async ( ) . await == 0 {
385
+ sleep ( Duration :: from_millis ( 10 ) ) . await ;
386
+ }
385
387
telemetry_srv. assert_hits_async ( 1 ) . await ;
386
388
}
387
389
@@ -408,6 +410,9 @@ mod tests {
408
410
client. start ( ) . await ;
409
411
let _ = client. send ( & data) ;
410
412
client. shutdown ( ) . await ;
413
+ while telemetry_srv. hits_async ( ) . await == 0 {
414
+ sleep ( Duration :: from_millis ( 10 ) ) . await ;
415
+ }
411
416
telemetry_srv. assert_hits_async ( 1 ) . await ;
412
417
}
413
418
@@ -434,6 +439,9 @@ mod tests {
434
439
client. start ( ) . await ;
435
440
let _ = client. send ( & data) ;
436
441
client. shutdown ( ) . await ;
442
+ while telemetry_srv. hits_async ( ) . await == 0 {
443
+ sleep ( Duration :: from_millis ( 10 ) ) . await ;
444
+ }
437
445
telemetry_srv. assert_hits_async ( 1 ) . await ;
438
446
}
439
447
@@ -460,6 +468,9 @@ mod tests {
460
468
client. start ( ) . await ;
461
469
let _ = client. send ( & data) ;
462
470
client. shutdown ( ) . await ;
471
+ while telemetry_srv. hits_async ( ) . await == 0 {
472
+ sleep ( Duration :: from_millis ( 10 ) ) . await ;
473
+ }
463
474
telemetry_srv. assert_hits_async ( 1 ) . await ;
464
475
}
465
476
@@ -486,6 +497,9 @@ mod tests {
486
497
client. start ( ) . await ;
487
498
let _ = client. send ( & data) ;
488
499
client. shutdown ( ) . await ;
500
+ while telemetry_srv. hits_async ( ) . await == 0 {
501
+ sleep ( Duration :: from_millis ( 10 ) ) . await ;
502
+ }
489
503
telemetry_srv. assert_hits_async ( 1 ) . await ;
490
504
}
491
505
@@ -512,6 +526,9 @@ mod tests {
512
526
client. start ( ) . await ;
513
527
let _ = client. send ( & data) ;
514
528
client. shutdown ( ) . await ;
529
+ while telemetry_srv. hits_async ( ) . await == 0 {
530
+ sleep ( Duration :: from_millis ( 10 ) ) . await ;
531
+ }
515
532
telemetry_srv. assert_hits_async ( 1 ) . await ;
516
533
}
517
534
@@ -538,6 +555,9 @@ mod tests {
538
555
client. start ( ) . await ;
539
556
let _ = client. send ( & data) ;
540
557
client. shutdown ( ) . await ;
558
+ while telemetry_srv. hits_async ( ) . await == 0 {
559
+ sleep ( Duration :: from_millis ( 10 ) ) . await ;
560
+ }
541
561
telemetry_srv. assert_hits_async ( 1 ) . await ;
542
562
}
543
563
@@ -675,10 +695,10 @@ mod tests {
675
695
. set_url ( & server. url ( "/" ) )
676
696
. set_heartbeat ( 100 )
677
697
. set_runtime_id ( "foo" )
678
- . build ( )
679
- . await ;
698
+ . build ( Handle :: current ( ) ) ;
680
699
681
- let client = result. unwrap ( ) ;
700
+ let ( client, mut worker) = result. unwrap ( ) ;
701
+ tokio:: spawn ( async move { worker. run ( ) . await } ) ;
682
702
683
703
client. start ( ) . await ;
684
704
client
@@ -688,6 +708,9 @@ mod tests {
688
708
} )
689
709
. unwrap ( ) ;
690
710
client. shutdown ( ) . await ;
711
+ while telemetry_srv. hits_async ( ) . await == 0 {
712
+ sleep ( Duration :: from_millis ( 10 ) ) . await ;
713
+ }
691
714
// One payload generate-metrics
692
715
telemetry_srv. assert_hits_async ( 1 ) . await ;
693
716
}
0 commit comments