@@ -372,4 +372,145 @@ mod tests {
372372
373373 assert ! ( !span. span_context( ) . is_sampled( ) ) ;
374374 }
375+
376+ #[ test]
377+ fn in_span_with_context_uses_provided_context ( ) {
378+ let tracer_provider = crate :: trace:: SdkTracerProvider :: builder ( )
379+ . with_sampler ( Sampler :: AlwaysOn )
380+ . build ( ) ;
381+ let tracer = tracer_provider. tracer ( "test" ) ;
382+
383+ // Create a parent context explicitly
384+ let parent_span = tracer. start ( "parent" ) ;
385+ let parent_trace_id = parent_span. span_context ( ) . trace_id ( ) ;
386+ let parent_span_id = parent_span. span_context ( ) . span_id ( ) ;
387+ let parent_cx = Context :: current_with_span ( parent_span) ;
388+
389+ // Use in_span_with_context with explicit parent context
390+ let mut child_trace_id = None ;
391+ let mut child_span_id = None ;
392+ let mut executed = false ;
393+
394+ let returned_value = tracer. in_span_with_context ( "child-span" , & parent_cx, |cx| {
395+ let span = cx. span ( ) ;
396+ child_trace_id = Some ( span. span_context ( ) . trace_id ( ) ) ;
397+ child_span_id = Some ( span. span_context ( ) . span_id ( ) ) ;
398+ executed = true ;
399+ "test_result"
400+ } ) ;
401+
402+ // Verify child span inherited parent's trace_id
403+ assert_eq ! ( child_trace_id, Some ( parent_trace_id) ) ;
404+ // Verify child has a different span_id than parent
405+ assert_ne ! ( child_span_id, Some ( parent_span_id) ) ;
406+ // Verify the closure was executed
407+ assert ! ( executed) ;
408+ // Verify return value is passed through
409+ assert_eq ! ( returned_value, "test_result" ) ;
410+ }
411+
412+ #[ test]
413+ fn in_span_with_builder_uses_current_context ( ) {
414+ let tracer_provider = crate :: trace:: SdkTracerProvider :: builder ( )
415+ . with_sampler ( Sampler :: AlwaysOn )
416+ . build ( ) ;
417+ let tracer = tracer_provider. tracer ( "test" ) ;
418+
419+ // Create a parent span and attach it to the current context
420+ let parent_span = tracer. start ( "parent" ) ;
421+ let parent_trace_id = parent_span. span_context ( ) . trace_id ( ) ;
422+ let _attached = Context :: current_with_span ( parent_span) . attach ( ) ;
423+
424+ // Use in_span_with_builder with configured span
425+ let mut child_trace_id = None ;
426+
427+ tracer. in_span_with_builder (
428+ tracer
429+ . span_builder ( "child" )
430+ . with_kind ( SpanKind :: Client )
431+ . with_attributes ( vec ! [ KeyValue :: new( "test_key" , "test_value" ) ] ) ,
432+ |cx| {
433+ let span = cx. span ( ) ;
434+ child_trace_id = Some ( span. span_context ( ) . trace_id ( ) ) ;
435+ span. add_event ( "test_event" , vec ! [ ] ) ;
436+ } ,
437+ ) ;
438+
439+ // Verify child span inherited parent's trace_id
440+ assert_eq ! ( child_trace_id, Some ( parent_trace_id) ) ;
441+ }
442+
443+ #[ test]
444+ fn in_span_with_builder_and_context_uses_provided_context ( ) {
445+ let tracer_provider = crate :: trace:: SdkTracerProvider :: builder ( )
446+ . with_sampler ( Sampler :: AlwaysOn )
447+ . build ( ) ;
448+ let tracer = tracer_provider. tracer ( "test" ) ;
449+
450+ // Create a parent context explicitly
451+ let parent_span = tracer. start ( "parent" ) ;
452+ let parent_trace_id = parent_span. span_context ( ) . trace_id ( ) ;
453+ let parent_cx = Context :: current_with_span ( parent_span) ;
454+
455+ // Use in_span_with_builder_and_context with explicit parent context
456+ let mut child_trace_id = None ;
457+ let mut result = 0 ;
458+
459+ let returned_value = tracer. in_span_with_builder_and_context (
460+ tracer
461+ . span_builder ( "child" )
462+ . with_kind ( SpanKind :: Server )
463+ . with_attributes ( vec ! [
464+ KeyValue :: new( "http.method" , "GET" ) ,
465+ KeyValue :: new( "http.url" , "/api/test" ) ,
466+ ] ) ,
467+ & parent_cx,
468+ |cx| {
469+ let span = cx. span ( ) ;
470+ child_trace_id = Some ( span. span_context ( ) . trace_id ( ) ) ;
471+ result = 42 ;
472+ result
473+ } ,
474+ ) ;
475+
476+ // Verify child span inherited parent's trace_id
477+ assert_eq ! ( child_trace_id, Some ( parent_trace_id) ) ;
478+ // Verify return value is passed through
479+ assert_eq ! ( returned_value, 42 ) ;
480+ assert_eq ! ( result, 42 ) ;
481+ }
482+
483+ #[ test]
484+ fn in_span_with_builder_and_context_creates_child_relationship ( ) {
485+ let tracer_provider = crate :: trace:: SdkTracerProvider :: builder ( )
486+ . with_sampler ( Sampler :: AlwaysOn )
487+ . build ( ) ;
488+ let tracer = tracer_provider. tracer ( "test" ) ;
489+
490+ // Create a parent with a specific trace context
491+ let parent_span = tracer. start ( "parent" ) ;
492+ let parent_span_id = parent_span. span_context ( ) . span_id ( ) ;
493+ let parent_trace_id = parent_span. span_context ( ) . trace_id ( ) ;
494+ let parent_cx = Context :: current_with_span ( parent_span) ;
495+
496+ // Create child using in_span_with_builder_and_context
497+ let mut child_span_context = None ;
498+
499+ tracer. in_span_with_builder_and_context (
500+ tracer. span_builder ( "child" ) . with_kind ( SpanKind :: Internal ) ,
501+ & parent_cx,
502+ |cx| {
503+ child_span_context = Some ( cx. span ( ) . span_context ( ) . clone ( ) ) ;
504+ } ,
505+ ) ;
506+
507+ let child_context = child_span_context. unwrap ( ) ;
508+
509+ // Verify the child has the same trace_id as parent
510+ assert_eq ! ( child_context. trace_id( ) , parent_trace_id) ;
511+ // Verify the child has a different span_id than parent
512+ assert_ne ! ( child_context. span_id( ) , parent_span_id) ;
513+ // Verify both are sampled
514+ assert ! ( child_context. is_sampled( ) ) ;
515+ }
375516}
0 commit comments