11import logging
2- from collections .abc import AsyncIterable , AsyncIterator , Awaitable , Callable
2+ from asyncio import CancelledError
3+ from collections .abc import AsyncIterable , Awaitable , Callable
34from contextlib import contextmanager
45from datetime import timedelta
5- from typing import Any , Generator , Generic , Literal , Optional , Union
6+ from typing import Any , AsyncGenerator , Generator , Generic , Literal , Optional , Union
67
78from opentelemetry import trace
89from opentelemetry .trace import Span , SpanKind , StatusCode
@@ -109,7 +110,7 @@ async def send_subscription(
109110 request_serializer : Callable [[RequestType ], Any ],
110111 response_deserializer : Callable [[Any ], ResponseType ],
111112 error_deserializer : Callable [[Any ], ErrorType ],
112- ) -> AsyncIterator [Union [ResponseType , ErrorType ]]:
113+ ) -> AsyncGenerator [Union [ResponseType , ErrorType ], None ]:
113114 with _trace_procedure ("subscription" , service_name , procedure_name ) as span :
114115 session = await self ._transport .get_or_create_session ()
115116 async for msg in session .send_subscription (
@@ -135,7 +136,7 @@ async def send_stream(
135136 request_serializer : Callable [[RequestType ], Any ],
136137 response_deserializer : Callable [[Any ], ResponseType ],
137138 error_deserializer : Callable [[Any ], ErrorType ],
138- ) -> AsyncIterator [Union [ResponseType , ErrorType ]]:
139+ ) -> AsyncGenerator [Union [ResponseType , ErrorType ], None ]:
139140 with _trace_procedure ("stream" , service_name , procedure_name ) as span :
140141 session = await self ._transport .get_or_create_session ()
141142 async for msg in session .send_stream (
@@ -160,15 +161,27 @@ def _trace_procedure(
160161 service_name : str ,
161162 procedure_name : str ,
162163) -> Generator [Span , None , None ]:
163- with tracer .start_span (
164+ span = tracer .start_span (
164165 f"river.client.{ procedure_type } .{ service_name } .{ procedure_name } " ,
165166 kind = SpanKind .CLIENT ,
166- ) as span :
167- try :
168- yield span
169- except RiverException as e :
170- _record_river_error (span , RiverError (code = e .code , message = e .message ))
171- raise e
167+ )
168+ set_status = False
169+ try :
170+ yield span
171+ except RiverException as e :
172+ span .record_exception (e )
173+ _record_river_error (span , RiverError (code = e .code , message = e .message ))
174+ set_status = True
175+ raise e
176+ except (Exception , CancelledError ) as e :
177+ span .record_exception (e )
178+ span .set_status (StatusCode .ERROR , f"{ type (e ).__name__ } : { e } " )
179+ set_status = True
180+ raise e
181+ finally :
182+ if not set_status :
183+ span .set_status (StatusCode .OK )
184+ span .end ()
172185
173186
174187def _record_river_error (span : Span , error : RiverError ) -> None :
0 commit comments