66from dataclasses import dataclass , field
77from typing import Any , TypeVar
88
9+ from common_library .error_codes import create_error_code
910from models_library .rabbitmq_basic_types import RPCMethodName
11+ from servicelib .logging_errors import create_troubleshootting_log_kwargs
1012
1113from ..logging_utils import log_context
1214from ._errors import RPCServerError
@@ -43,7 +45,9 @@ def expose(
4345 * ,
4446 reraise_if_error_type : tuple [type [Exception ], ...] | None = None ,
4547 ) -> Callable [[DecoratedCallable ], DecoratedCallable ]:
48+
4649 def _decorator (func : DecoratedCallable ) -> DecoratedCallable :
50+
4751 @functools .wraps (func )
4852 async def _wrapper (* args , ** kwargs ):
4953 with log_context (
@@ -67,14 +71,20 @@ async def _wrapper(*args, **kwargs):
6771 ):
6872 raise
6973
70- _logger .debug (
71- "Unhandled exception on call %s on the rpc-server side: %s (%s). **Re-raising** as %s." ,
72- func .__name__ ,
73- exc ,
74- f"{ exc .__class__ .__module__ } .{ exc .__class__ .__name__ } " ,
75- RPCServerError .__name__ ,
74+ error_code = create_error_code (exc )
75+ _logger .exception (
76+ # NOTE: equivalent to a 500 http status code error
77+ ** create_troubleshootting_log_kwargs (
78+ f"Unhandled exception on the rpc-server side for { func .__name__ } " ,
79+ error = exc ,
80+ error_code = error_code ,
81+ error_context = {
82+ "rpc_method" : func .__name__ ,
83+ "args" : args ,
84+ "kwargs" : kwargs ,
85+ },
86+ )
7687 )
77-
7888 # NOTE: we do not return internal exceptions over RPC
7989 formatted_traceback = "\n " .join (
8090 traceback .format_tb (exc .__traceback__ )
@@ -84,6 +94,7 @@ async def _wrapper(*args, **kwargs):
8494 exc_type = f"{ exc .__class__ .__module__ } .{ exc .__class__ .__name__ } " ,
8595 exc_message = f"{ exc } " ,
8696 traceback = f"{ formatted_traceback } " ,
97+ error_code = error_code ,
8798 ) from None
8899
89100 self .routes [RPCMethodName (func .__name__ )] = _wrapper
0 commit comments