@@ -139,6 +139,12 @@ class TracedData(pydantic.BaseModel):
139139 request_service_tier : Optional [str ] = pydantic .Field (default = None )
140140 response_service_tier : Optional [str ] = pydantic .Field (default = None )
141141
142+ # Trace context - to maintain trace continuity across async operations
143+ trace_context : Any = pydantic .Field (default = None )
144+
145+ class Config :
146+ arbitrary_types_allowed = True
147+
142148
143149responses : dict [str , TracedData ] = {}
144150
@@ -509,16 +515,22 @@ def responses_get_or_create_wrapper(tracer: Tracer, wrapped, instance, args, kwa
509515 response_reasoning_effort = kwargs .get ("reasoning" , {}).get ("effort" ),
510516 request_service_tier = kwargs .get ("service_tier" ),
511517 response_service_tier = existing_data .get ("response_service_tier" ),
518+ # Capture trace context to maintain continuity
519+ trace_context = existing_data .get ("trace_context" , context_api .get_current ()),
512520 )
513521 except Exception :
514522 traced_data = None
515523
524+ # Restore the original trace context to maintain trace continuity
525+ ctx = (traced_data .trace_context if traced_data and traced_data .trace_context
526+ else context_api .get_current ())
516527 span = tracer .start_span (
517528 SPAN_NAME ,
518529 kind = SpanKind .CLIENT ,
519530 start_time = (
520531 start_time if traced_data is None else int (traced_data .start_time )
521532 ),
533+ context = ctx ,
522534 )
523535 _set_request_attributes (span , prepare_kwargs_for_shared_attributes (kwargs ), instance )
524536 span .set_attribute (ERROR_TYPE , e .__class__ .__name__ )
@@ -575,16 +587,21 @@ def responses_get_or_create_wrapper(tracer: Tracer, wrapped, instance, args, kwa
575587 response_reasoning_effort = kwargs .get ("reasoning" , {}).get ("effort" ),
576588 request_service_tier = existing_data .get ("request_service_tier" , kwargs .get ("service_tier" )),
577589 response_service_tier = existing_data .get ("response_service_tier" , parsed_response .service_tier ),
590+ # Capture trace context to maintain continuity across async operations
591+ trace_context = existing_data .get ("trace_context" , context_api .get_current ()),
578592 )
579593 responses [parsed_response .id ] = traced_data
580594 except Exception :
581595 return response
582596
583597 if parsed_response .status == "completed" :
598+ # Restore the original trace context to maintain trace continuity
599+ ctx = traced_data .trace_context if traced_data .trace_context else context_api .get_current ()
584600 span = tracer .start_span (
585601 SPAN_NAME ,
586602 kind = SpanKind .CLIENT ,
587603 start_time = int (traced_data .start_time ),
604+ context = ctx ,
588605 )
589606 _set_request_attributes (span , prepare_kwargs_for_shared_attributes (kwargs ), instance )
590607 set_data_attributes (traced_data , span )
@@ -654,16 +671,22 @@ async def async_responses_get_or_create_wrapper(
654671 response_reasoning_effort = kwargs .get ("reasoning" , {}).get ("effort" ),
655672 request_service_tier = kwargs .get ("service_tier" ),
656673 response_service_tier = existing_data .get ("response_service_tier" ),
674+ # Capture trace context to maintain continuity
675+ trace_context = existing_data .get ("trace_context" , context_api .get_current ()),
657676 )
658677 except Exception :
659678 traced_data = None
660679
680+ # Restore the original trace context to maintain trace continuity
681+ ctx = (traced_data .trace_context if traced_data and traced_data .trace_context
682+ else context_api .get_current ())
661683 span = tracer .start_span (
662684 SPAN_NAME ,
663685 kind = SpanKind .CLIENT ,
664686 start_time = (
665687 start_time if traced_data is None else int (traced_data .start_time )
666688 ),
689+ context = ctx ,
667690 )
668691 _set_request_attributes (span , prepare_kwargs_for_shared_attributes (kwargs ), instance )
669692 span .set_attribute (ERROR_TYPE , e .__class__ .__name__ )
@@ -721,16 +744,21 @@ async def async_responses_get_or_create_wrapper(
721744 response_reasoning_effort = kwargs .get ("reasoning" , {}).get ("effort" ),
722745 request_service_tier = existing_data .get ("request_service_tier" , kwargs .get ("service_tier" )),
723746 response_service_tier = existing_data .get ("response_service_tier" , parsed_response .service_tier ),
747+ # Capture trace context to maintain continuity across async operations
748+ trace_context = existing_data .get ("trace_context" , context_api .get_current ()),
724749 )
725750 responses [parsed_response .id ] = traced_data
726751 except Exception :
727752 return response
728753
729754 if parsed_response .status == "completed" :
755+ # Restore the original trace context to maintain trace continuity
756+ ctx = traced_data .trace_context if traced_data .trace_context else context_api .get_current ()
730757 span = tracer .start_span (
731758 SPAN_NAME ,
732759 kind = SpanKind .CLIENT ,
733760 start_time = int (traced_data .start_time ),
761+ context = ctx ,
734762 )
735763 _set_request_attributes (span , prepare_kwargs_for_shared_attributes (kwargs ), instance )
736764 set_data_attributes (traced_data , span )
@@ -751,11 +779,14 @@ def responses_cancel_wrapper(tracer: Tracer, wrapped, instance, args, kwargs):
751779 parsed_response = parse_response (response )
752780 existing_data = responses .pop (parsed_response .id , None )
753781 if existing_data is not None :
782+ # Restore the original trace context to maintain trace continuity
783+ ctx = existing_data .trace_context if existing_data .trace_context else context_api .get_current ()
754784 span = tracer .start_span (
755785 SPAN_NAME ,
756786 kind = SpanKind .CLIENT ,
757787 start_time = existing_data .start_time ,
758788 record_exception = True ,
789+ context = ctx ,
759790 )
760791 _set_request_attributes (span , prepare_kwargs_for_shared_attributes (kwargs ), instance )
761792 span .record_exception (Exception ("Response cancelled" ))
@@ -778,11 +809,14 @@ async def async_responses_cancel_wrapper(
778809 parsed_response = parse_response (response )
779810 existing_data = responses .pop (parsed_response .id , None )
780811 if existing_data is not None :
812+ # Restore the original trace context to maintain trace continuity
813+ ctx = existing_data .trace_context if existing_data .trace_context else context_api .get_current ()
781814 span = tracer .start_span (
782815 SPAN_NAME ,
783816 kind = SpanKind .CLIENT ,
784817 start_time = existing_data .start_time ,
785818 record_exception = True ,
819+ context = ctx ,
786820 )
787821 _set_request_attributes (span , prepare_kwargs_for_shared_attributes (kwargs ), instance )
788822 span .record_exception (Exception ("Response cancelled" ))
0 commit comments