Skip to content

Commit f82dabe

Browse files
authored
fixing tracing for streaming when not using event handler (#41423)
* fixing streaming tracing when event handler is not used * fixing tracing for streaming when not using event handler * fixes * changelog
1 parent 9247ed3 commit f82dabe

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

sdk/ai/azure-ai-agents/CHANGELOG.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
### Bugs Fixed
66

7-
* `asyncio.gather` is used to make function tool calls in parallel for `async` scenario.
8-
9-
* Adding instrumentation for create_thread_and_run.
7+
- `asyncio.gather` is used to make function tool calls in parallel for `async` scenario.
8+
- Adding instrumentation for create_thread_and_run.
9+
- Fixed a tracing related bug that caused process_thread_run span to not appear when streaming is used without event handler.
1010

1111
## 1.0.0 (2025-05-15)
1212

sdk/ai/azure-ai-agents/azure/ai/agents/telemetry/_ai_agents_instrumentor.py

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,10 +1379,6 @@ def wrap_handler(
13791379
handler: "Optional[AgentEventHandler]" = None,
13801380
span: "Optional[AbstractSpan]" = None,
13811381
) -> "Optional[AgentEventHandler]":
1382-
# Do not create a handler wrapper if we do not have handler in the first place.
1383-
if not handler:
1384-
return None
1385-
13861382
if isinstance(handler, _AgentEventHandlerTraceWrapper):
13871383
return handler
13881384

@@ -1396,10 +1392,6 @@ def wrap_async_handler(
13961392
handler: "Optional[AsyncAgentEventHandler]" = None,
13971393
span: "Optional[AbstractSpan]" = None,
13981394
) -> "Optional[AsyncAgentEventHandler]":
1399-
# Do not create a handler wrapper if we do not have handler in the first place.
1400-
if not handler:
1401-
return None
1402-
14031395
if isinstance(handler, _AsyncAgentEventHandlerTraceWrapper):
14041396
return handler
14051397

@@ -1975,22 +1967,30 @@ def initialize(
19751967
response_iterator=response_iterator,
19761968
submit_tool_outputs=submit_tool_outputs,
19771969
)
1970+
else:
1971+
super().initialize(
1972+
response_iterator=response_iterator,
1973+
submit_tool_outputs=submit_tool_outputs,
1974+
)
19781975

19791976
def __next__(self) -> Any:
19801977
if self.inner_handler:
19811978
event_bytes = self.inner_handler.__next_impl__()
19821979
return self._process_event(event_bytes.decode("utf-8"))
1983-
return None
1980+
return super().__next__()
19841981

19851982
# pylint: disable=R1710
19861983
def on_message_delta(self, delta: "MessageDeltaChunk") -> None: # type: ignore[func-returns-value]
19871984
if self.inner_handler:
19881985
return self.inner_handler.on_message_delta(delta) # type: ignore
1986+
return super().on_message_delta(delta) # type: ignore
19891987

19901988
def on_thread_message(self, message: "ThreadMessage") -> None: # type: ignore[func-returns-value]
19911989
retval = None
19921990
if self.inner_handler:
19931991
retval = self.inner_handler.on_thread_message(message) # type: ignore
1992+
else:
1993+
retval = super().on_thread_message(message) # pylint: disable=assignment-from-none # type: ignore
19941994

19951995
if message.status in {"completed", "incomplete"}:
19961996
self.last_message = message
@@ -2002,6 +2002,8 @@ def on_thread_run(self, run: "ThreadRun") -> None: # type: ignore[func-returns-
20022002

20032003
if self.inner_handler:
20042004
retval = self.inner_handler.on_thread_run(run) # type: ignore
2005+
else:
2006+
retval = super().on_thread_run(run) # pylint: disable=assignment-from-none # type: ignore
20052007
self.last_run = run
20062008

20072009
return retval # type: ignore
@@ -2010,6 +2012,8 @@ def on_run_step(self, step: "RunStep") -> None: # type: ignore[func-returns-val
20102012
retval = None
20112013
if self.inner_handler:
20122014
retval = self.inner_handler.on_run_step(step) # type: ignore
2015+
else:
2016+
retval = super().on_run_step(step) # pylint: disable=assignment-from-none # type: ignore
20132017

20142018
if (
20152019
step.type == "tool_calls"
@@ -2035,20 +2039,23 @@ def on_run_step(self, step: "RunStep") -> None: # type: ignore[func-returns-val
20352039
def on_run_step_delta(self, delta: "RunStepDeltaChunk") -> None: # type: ignore[func-returns-value]
20362040
if self.inner_handler:
20372041
return self.inner_handler.on_run_step_delta(delta) # type: ignore
2042+
return super().on_run_step_delta(delta) # type: ignore
20382043

20392044
def on_error(self, data: str) -> None: # type: ignore[func-returns-value]
20402045
if self.inner_handler:
20412046
return self.inner_handler.on_error(data) # type: ignore
2047+
return super().on_error(data) # type: ignore
20422048

20432049
def on_done(self) -> None: # type: ignore[func-returns-value]
20442050
if self.inner_handler:
20452051
return self.inner_handler.on_done() # type: ignore
2052+
return super().on_done() # type: ignore
20462053
# it could be called multiple tines (for each step) __exit__
20472054

20482055
def on_unhandled_event(self, event_type: str, event_data: Any) -> None: # type: ignore[func-returns-value]
20492056
if self.inner_handler:
20502057
return self.inner_handler.on_unhandled_event(event_type, event_data) # type: ignore
2051-
2058+
return super().on_unhandled_event(event_type, event_data) # type: ignore
20522059
# pylint: enable=R1710
20532060

20542061
def __exit__(self, exc_type, exc_val, exc_tb):
@@ -2093,23 +2100,33 @@ def initialize(
20932100
response_iterator=response_iterator,
20942101
submit_tool_outputs=submit_tool_outputs,
20952102
)
2103+
else:
2104+
super().initialize(
2105+
response_iterator=response_iterator,
2106+
submit_tool_outputs=submit_tool_outputs,
2107+
)
20962108

20972109
# cspell:disable-next-line
20982110
async def __anext__(self) -> Any:
20992111
if self.inner_handler:
21002112
# cspell:disable-next-line
21012113
event_bytes = await self.inner_handler.__anext_impl__()
21022114
return await self._process_event(event_bytes.decode("utf-8"))
2115+
# cspell:disable-next-line
2116+
return await super().__anext__()
21032117

21042118
# pylint: disable=R1710
21052119
async def on_message_delta(self, delta: "MessageDeltaChunk") -> None: # type: ignore[func-returns-value]
21062120
if self.inner_handler:
21072121
return await self.inner_handler.on_message_delta(delta) # type: ignore
2122+
return await super().on_message_delta(delta) # type: ignore
21082123

21092124
async def on_thread_message(self, message: "ThreadMessage") -> None: # type: ignore[func-returns-value]
21102125
retval = None
21112126
if self.inner_handler:
21122127
retval = await self.inner_handler.on_thread_message(message) # type: ignore
2128+
else:
2129+
retval = await super().on_thread_message(message) # type: ignore
21132130

21142131
if message.status in {"completed", "incomplete"}:
21152132
self.last_message = message
@@ -2121,6 +2138,8 @@ async def on_thread_run(self, run: "ThreadRun") -> None: # type: ignore[func-re
21212138

21222139
if self.inner_handler:
21232140
retval = await self.inner_handler.on_thread_run(run) # type: ignore
2141+
else:
2142+
retval = await super().on_thread_run(run) # type: ignore
21242143
self.last_run = run
21252144

21262145
return retval # type: ignore
@@ -2129,6 +2148,8 @@ async def on_run_step(self, step: "RunStep") -> None: # type: ignore[func-retur
21292148
retval = None
21302149
if self.inner_handler:
21312150
retval = await self.inner_handler.on_run_step(step) # type: ignore
2151+
else:
2152+
retval = await super().on_run_step(step) # type: ignore
21322153

21332154
if (
21342155
step.type == "tool_calls"
@@ -2154,19 +2175,23 @@ async def on_run_step(self, step: "RunStep") -> None: # type: ignore[func-retur
21542175
async def on_run_step_delta(self, delta: "RunStepDeltaChunk") -> None: # type: ignore[func-returns-value]
21552176
if self.inner_handler:
21562177
return await self.inner_handler.on_run_step_delta(delta) # type: ignore
2178+
return await super().on_run_step_delta(delta) # type: ignore
21572179

21582180
async def on_error(self, data: str) -> None: # type: ignore[func-returns-value]
21592181
if self.inner_handler:
21602182
return await self.inner_handler.on_error(data) # type: ignore
2183+
return await super().on_error(data) # type: ignore
21612184

21622185
async def on_done(self) -> None: # type: ignore[func-returns-value]
21632186
if self.inner_handler:
21642187
return await self.inner_handler.on_done() # type: ignore
2188+
return await super().on_done() # type: ignore
21652189
# it could be called multiple tines (for each step) __exit__
21662190

21672191
async def on_unhandled_event(self, event_type: str, event_data: Any) -> None: # type: ignore[func-returns-value]
21682192
if self.inner_handler:
21692193
return await self.inner_handler.on_unhandled_event(event_type, event_data) # type: ignore
2194+
return await super().on_unhandled_event(event_type, event_data) # type: ignore
21702195

21712196
# pylint: enable=R1710
21722197

0 commit comments

Comments
 (0)