|
25 | 25 | SenderFactory, |
26 | 26 | TaskSupervisor, |
27 | 27 | ) |
| 28 | +from .telemetry import span_context |
28 | 29 |
|
29 | 30 | JsonValue = Any |
30 | 31 | MethodHandler = Callable[[str, JsonValue | None, bool], Awaitable[JsonValue | None]] |
@@ -135,35 +136,41 @@ async def _process_message(self, message: dict[str, Any]) -> None: |
135 | 136 |
|
136 | 137 | async def _run_request(self, message: dict[str, Any]) -> Any: |
137 | 138 | payload: dict[str, Any] = {"jsonrpc": "2.0", "id": message["id"]} |
138 | | - try: |
139 | | - result = await self._handler(message["method"], message.get("params"), False) |
140 | | - if isinstance(result, BaseModel): |
141 | | - result = result.model_dump() |
142 | | - payload["result"] = result if result is not None else None |
143 | | - await self._sender.send(payload) |
144 | | - return payload.get("result") |
145 | | - except RequestError as exc: |
146 | | - payload["error"] = exc.to_error_obj() |
147 | | - await self._sender.send(payload) |
148 | | - raise |
149 | | - except ValidationError as exc: |
150 | | - err = RequestError.invalid_params({"errors": exc.errors()}) |
151 | | - payload["error"] = err.to_error_obj() |
152 | | - await self._sender.send(payload) |
153 | | - raise err from None |
154 | | - except Exception as exc: |
| 139 | + method = message["method"] |
| 140 | + with span_context( |
| 141 | + "acp.request", |
| 142 | + attributes={"method": method}, |
| 143 | + ): |
155 | 144 | try: |
156 | | - data = json.loads(str(exc)) |
157 | | - except Exception: |
158 | | - data = {"details": str(exc)} |
159 | | - err = RequestError.internal_error(data) |
160 | | - payload["error"] = err.to_error_obj() |
161 | | - await self._sender.send(payload) |
162 | | - raise err from None |
| 145 | + result = await self._handler(method, message.get("params"), False) |
| 146 | + if isinstance(result, BaseModel): |
| 147 | + result = result.model_dump() |
| 148 | + payload["result"] = result if result is not None else None |
| 149 | + await self._sender.send(payload) |
| 150 | + return payload.get("result") |
| 151 | + except RequestError as exc: |
| 152 | + payload["error"] = exc.to_error_obj() |
| 153 | + await self._sender.send(payload) |
| 154 | + raise |
| 155 | + except ValidationError as exc: |
| 156 | + err = RequestError.invalid_params({"errors": exc.errors()}) |
| 157 | + payload["error"] = err.to_error_obj() |
| 158 | + await self._sender.send(payload) |
| 159 | + raise err from None |
| 160 | + except Exception as exc: |
| 161 | + try: |
| 162 | + data = json.loads(str(exc)) |
| 163 | + except Exception: |
| 164 | + data = {"details": str(exc)} |
| 165 | + err = RequestError.internal_error(data) |
| 166 | + payload["error"] = err.to_error_obj() |
| 167 | + await self._sender.send(payload) |
| 168 | + raise err from None |
163 | 169 |
|
164 | 170 | async def _run_notification(self, message: dict[str, Any]) -> None: |
165 | | - with contextlib.suppress(Exception): |
166 | | - await self._handler(message["method"], message.get("params"), True) |
| 171 | + method = message["method"] |
| 172 | + with span_context("acp.notification", attributes={"method": method}), contextlib.suppress(Exception): |
| 173 | + await self._handler(method, message.get("params"), True) |
167 | 174 |
|
168 | 175 | async def _handle_response(self, message: dict[str, Any]) -> None: |
169 | 176 | request_id = message["id"] |
|
0 commit comments