11from asyncpg import InvalidPasswordError
2+ from ddtrace import tracer
23from fastapi .encoders import jsonable_encoder
34from fastapi .exception_handlers import http_exception_handler
45from fastapi .exceptions import RequestValidationError
1415from infrastructure .logger import logger
1516
1617
18+ def _set_trace_exception (exc : Exception ) -> None :
19+ span = tracer .current_span ()
20+ if span :
21+ span .set_exc_info (type (exc ), exc , exc .__traceback__ )
22+
23+
1724def custom_base_errors_handler (_ : Request , error : BaseError ) -> JSONResponse :
1825 """This function is called if the BaseError was raised."""
1926
2027 logger .error (error .error , exc_info = error )
28+ _set_trace_exception (error )
2129
2230 response = ErrorResponseMulti (
2331 result = [
@@ -77,6 +85,7 @@ def python_base_error_handler(_: Request, error: Exception) -> JSONResponse:
7785 response = ErrorResponseMulti (result = [ErrorResponse (message = f"Unhandled error: { error_message } " )])
7886
7987 logger .error (error_message , exc_info = error )
88+ _set_trace_exception (error )
8089
8190 return JSONResponse (
8291 content = jsonable_encoder (response .model_dump (by_alias = True )),
@@ -90,6 +99,9 @@ def pydantic_validation_errors_handler(request: Request, error: RequestValidatio
9099 this_logger = logger .bind (
91100 error_location = {"file" : error .endpoint_file , "line" : error .endpoint_line , "function" : error .endpoint_function }
92101 )
102+
103+ _set_trace_exception (error )
104+
93105 for err in error .errors ():
94106 if isinstance (err , dict ):
95107 message = err ["msg" ]
@@ -118,6 +130,8 @@ def sqlalchemy_database_error_handler(
118130) -> JSONResponse :
119131 """This function is called if the SQLAlchemy database error was raised."""
120132 logger .error (str (error ), exc_info = error )
133+ _set_trace_exception (error )
134+
121135 response = ErrorResponseMulti (result = [ErrorResponse (message = "Internal server error" )])
122136
123137 return JSONResponse (
0 commit comments