@@ -216,7 +216,7 @@ def __init__(
216216 self ._response_index = 0
217217 self ._candidate_index = 0
218218
219- def start_span_as_current_span (self , model_name , function_name ):
219+ def start_span_as_current_span (self , model_name , function_name , end_on_exit = True ):
220220 return self ._otel_wrapper .start_as_current_span (
221221 f"{ _GENERATE_CONTENT_OP_NAME } { model_name } " ,
222222 start_time = self ._start_time ,
@@ -226,6 +226,7 @@ def start_span_as_current_span(self, model_name, function_name):
226226 gen_ai_attributes .GEN_AI_REQUEST_MODEL : self ._genai_request_model ,
227227 gen_ai_attributes .GEN_AI_OPERATION_NAME : _GENERATE_CONTENT_OP_NAME ,
228228 },
229+ end_on_exit = end_on_exit
229230 )
230231
231232 def process_request (
@@ -633,31 +634,41 @@ async def instrumented_generate_content_stream(
633634 helper = _GenerateContentInstrumentationHelper (
634635 self , otel_wrapper , model
635636 )
636-
637- async def _internal_generator ():
638- with helper .start_span_as_current_span (
639- model , "google.genai.AsyncModels.generate_content_stream"
640- ):
641- helper .process_request (contents , config )
637+ with helper .start_span_as_current_span (
638+ model ,
639+ "google.genai.AsyncModels.generate_content_stream" ,
640+ end_on_exit = False ) as span :
641+ helper .process_request (contents , config )
642+ try :
643+ response_async_generator = await wrapped_func (
644+ self ,
645+ model = model ,
646+ contents = contents ,
647+ config = config ,
648+ ** kwargs ,
649+ )
650+ except Exception as error :
651+ helper .process_error (error )
652+ helper .finalize_processing ()
653+ with trace .use_span (span , end_on_exit = True ):
654+ raise
655+
656+ async def _response_async_generator_wrapper ():
657+ with trace .use_span (span , end_on_exit = True ):
642658 try :
643- async for response in await wrapped_func (
644- self ,
645- model = model ,
646- contents = contents ,
647- config = config ,
648- ** kwargs ,
649- ): # pyright: ignore
659+ async for response in response_async_generator :
650660 helper .process_response (response )
651- yield response # pyright: ignore
661+ yield response
652662 except Exception as error :
653663 helper .process_error (error )
654664 raise
655665 finally :
656666 helper .finalize_processing ()
657667
658668 class _GeneratorProvider :
669+
659670 def __aiter__ (self ):
660- return _internal_generator ()
671+ return _response_async_generator_wrapper ()
661672
662673 return _GeneratorProvider ()
663674
0 commit comments