@@ -31,6 +31,7 @@ use std::{
31
31
sync:: { Arc , Mutex } ,
32
32
thread,
33
33
} ;
34
+ use tokio:: { runtime:: Handle , task} ;
34
35
35
36
/// Serialize from A should equal Serialize from B
36
37
#[ allow( dead_code) ]
@@ -217,7 +218,7 @@ async fn create_span_from_context() {
217
218
}
218
219
219
220
#[ test]
220
- fn crossprocess_test ( ) {
221
+ fn cross_process_test ( ) {
221
222
let tracer = Tracer :: new ( "service" , "instance" , PrintReporter :: new ( ) ) ;
222
223
let mut context1 = tracer. create_trace_context ( ) ;
223
224
assert_eq ! ( context1. service( ) , "service" ) ;
@@ -239,6 +240,7 @@ fn crossprocess_test() {
239
240
240
241
let span3 = context2. last_span ( ) . unwrap ( ) ;
241
242
243
+ assert_eq ! ( context1. trace_id( ) , context2. trace_id( ) ) ;
242
244
assert_eq ! ( span3. span_id, 0 ) ;
243
245
assert_eq ! ( span3. parent_span_id, -1 ) ;
244
246
assert_eq ! ( span3. refs. len( ) , 1 ) ;
@@ -259,6 +261,58 @@ fn crossprocess_test() {
259
261
}
260
262
}
261
263
264
+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
265
+ async fn cross_process_test_1 ( ) {
266
+ let propagation = Mutex :: new ( String :: new ( ) ) ;
267
+
268
+ MockReporter :: with (
269
+ |reporter| {
270
+ let tracer = Tracer :: new ( "service1" , "instance1" , reporter) ;
271
+ let mut context = tracer. create_trace_context ( ) ;
272
+ let _span1 = context. create_entry_span ( "entry_1" ) ;
273
+ let _span2 = context. create_exit_span ( "exit_1" , "peer_1" ) ;
274
+ * propagation. try_lock ( ) . unwrap ( ) = encode_propagation ( & context, "exit_1" , "peer_1" ) ;
275
+ tracer
276
+ } ,
277
+ |segment1| {
278
+ let propagation = propagation. lock ( ) . unwrap ( ) . clone ( ) ;
279
+ task:: block_in_place ( move || {
280
+ Handle :: current ( ) . block_on ( async move {
281
+ MockReporter :: with (
282
+ |reporter| {
283
+ let tracer = Tracer :: new ( "service2" , "instance2" , reporter) ;
284
+ let mut context = tracer. create_trace_context ( ) ;
285
+ let _span1 = context. create_entry_span_with_propagation (
286
+ "entry_1" ,
287
+ & decode_propagation ( & propagation) . unwrap ( ) ,
288
+ ) ;
289
+ tracer
290
+ } ,
291
+ |segment2| {
292
+ assert_eq ! ( segment1. trace_id, segment2. trace_id) ;
293
+ assert_eq ! (
294
+ segment2. spans[ 0 ] . refs[ 0 ] ,
295
+ SegmentReference {
296
+ ref_type: RefType :: CrossProcess as i32 ,
297
+ trace_id: segment1. trace_id. clone( ) ,
298
+ parent_trace_segment_id: segment1. trace_segment_id. clone( ) ,
299
+ parent_span_id: 1 ,
300
+ parent_service: segment1. service. clone( ) ,
301
+ parent_service_instance: segment1. service_instance. clone( ) ,
302
+ parent_endpoint: segment1. spans[ 0 ] . operation_name. clone( ) ,
303
+ network_address_used_at_peer: segment1. spans[ 0 ] . peer. clone( ) ,
304
+ }
305
+ ) ;
306
+ } ,
307
+ )
308
+ . await ;
309
+ } ) ;
310
+ } ) ;
311
+ } ,
312
+ )
313
+ . await ;
314
+ }
315
+
262
316
#[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
263
317
async fn cross_threads_test ( ) {
264
318
MockReporter :: with_many (
0 commit comments