Skip to content

Commit 94d1cd2

Browse files
committed
Restructure streaming async logic to begin execution earlier.
1 parent ae289d5 commit 94d1cd2

File tree

1 file changed

+27
-16
lines changed
  • instrumentation-genai/opentelemetry-instrumentation-google-genai/src/opentelemetry/instrumentation/google_genai

1 file changed

+27
-16
lines changed

instrumentation-genai/opentelemetry-instrumentation-google-genai/src/opentelemetry/instrumentation/google_genai/generate_content.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)