Skip to content

Commit 5309f18

Browse files
feng-95innsd
authored andcommitted
fix: record exception on agent web server
(cherry picked from commit 5dd549c776cefe08156dd9cbdcc2f5519301b480)
1 parent 951bc5d commit 5309f18

2 files changed

Lines changed: 35 additions & 13 deletions

File tree

agentkit/apps/agent_server_app/agent_server_app.py

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,11 @@ async def run_agent_sse(req: RunAgentRequest) -> StreamingResponse:
159159
session_id=req.session_id,
160160
)
161161
if not session:
162-
raise HTTPException(status_code=404, detail="Session not found")
162+
e = HTTPException(status_code=404, detail="Session not found")
163+
telemetry.trace_agent_server_finish(
164+
path="/run_sse", func_result="", exception=e
165+
)
166+
raise e
163167

164168
# Convert the events to properly formatted SSE
165169
async def event_generator():
@@ -212,7 +216,7 @@ async def event_generator():
212216
except Exception as e:
213217
logger.exception("Error in event_generator: %s", e)
214218
telemetry.trace_agent_server_finish(
215-
path="/invoke", func_result="", exception=e
219+
path="/run_sse", func_result="", exception=e
216220
)
217221
yield f"data: {json.dumps({'error': str(e)})}\n\n"
218222
# Returns a streaming response with the proper media type for SSE
@@ -222,6 +226,17 @@ async def event_generator():
222226
media_type="text/event-stream",
223227
)
224228

229+
# Move the custom /run_sse route to the beginning of the routes list for priority matching (without deleting the ADK default route)
230+
routes = self.app.router.routes
231+
for i, r in enumerate(routes):
232+
if (
233+
getattr(r, "path", None) == "/run_sse"
234+
and "POST" in getattr(r, "methods", set())
235+
and getattr(r,"endpoint", None) == run_agent_sse
236+
):
237+
routes.insert(0, routes.pop(i))
238+
break
239+
225240
# Attach ASGI middleware for unified telemetry across all routes
226241
self.app.add_middleware(AgentkitTelemetryHTTPMiddleware)
227242

@@ -236,13 +251,25 @@ async def _invoke_compat(request: Request):
236251
for k, v in dict(headers).items()
237252
if k.lower() not in {"authorization", "token"}
238253
}
254+
# trace request attributes on current span
255+
telemetry.trace_agent_server(
256+
func_name="_invoke_compat",
257+
span=span,
258+
headers=telemetry_headers,
259+
text="",
260+
)
261+
239262
user_id = headers.get("user_id") or "agentkit_user"
240263
session_id = headers.get("session_id") or ""
241264

242265
# Determine app_name from loader
243266
app_names = self.server.agent_loader.list_agents()
244267
if not app_names:
245-
raise HTTPException(status_code=404, detail="No agents configured")
268+
exception = HTTPException(status_code=404, detail="No agents configured")
269+
telemetry.trace_agent_server_finish(
270+
path="/invoke", func_result="", exception=exception
271+
)
272+
raise exception
246273
app_name = app_names[0]
247274

248275
# Parse payload and convert to ADK Content
@@ -266,13 +293,6 @@ async def _invoke_compat(request: Request):
266293
text = ""
267294
content = types.UserContent(parts=[types.Part(text=text or "")])
268295

269-
# trace request attributes on current span
270-
telemetry.trace_agent_server(
271-
func_name="_invoke_compat",
272-
span=span,
273-
headers=telemetry_headers,
274-
text=text or "",
275-
)
276296

277297
# Ensure session exists
278298
session = await self.server.session_service.get_session(
@@ -305,10 +325,10 @@ async def event_generator():
305325
# finish span on successful end of stream handled by middleware
306326
pass
307327
except Exception as e:
308-
yield f'data: {{"error": "{str(e)}"}}\n\n'
309328
telemetry.trace_agent_server_finish(
310329
path="/invoke", func_result="", exception=e
311330
)
331+
yield f'data: {{"error": "{str(e)}"}}\n\n'
312332

313333
return StreamingResponse(
314334
event_generator(),

agentkit/apps/agent_server_app/telemetry.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,10 @@ def trace_agent_server_finish(
105105
}
106106
if exception:
107107
self.handle_exception(span, exception)
108-
attributes["error_type"] = exception.__class__.__name__
109-
108+
if getattr(exception, "status_code", None):
109+
attributes["error_type"] = f"{exception.__class__.__name__}_{exception.status_code}"
110+
else:
111+
attributes["error_type"] = exception.__class__.__name__
110112
# only record invoke request latency metrics
111113
if (
112114
hasattr(span, "start_time")

0 commit comments

Comments
 (0)