1212from aiohttp import web
1313from aiohttp .web_request import Request
1414from aiohttp .web_response import StreamResponse
15+ from models_library .errors_classes import OsparcErrorMixin
1516from models_library .utils .json_serialization import json_dumps
17+ from servicelib .error_codes import create_error_code
1618
19+ from ..logging_utils import create_troubleshotting_log_message , get_log_record_extra
1720from ..mimetype_constants import MIMETYPE_APPLICATION_JSON
1821from ..utils import is_production_environ
1922from .rest_models import ErrorItemType , ErrorType , LogMessageType
2831from .typing_extension import Handler , Middleware
2932
3033DEFAULT_API_VERSION = "v0"
34+ FMSG_INTERNAL_ERROR_USER_FRIENDLY = "Oops! Something went wrong, but we've noted it down and we'll sort it out ASAP. Thanks for your patience! [{}]"
3135
3236
3337_logger = logging .getLogger (__name__ )
@@ -40,29 +44,44 @@ def is_api_request(request: web.Request, api_version: str) -> bool:
4044
4145def error_middleware_factory (
4246 api_version : str ,
43- log_exceptions : bool = True ,
4447) -> Middleware :
4548 _is_prod : bool = is_production_environ ()
4649
4750 def _process_and_raise_unexpected_error (request : web .BaseRequest , err : Exception ):
51+
52+ error_code = create_error_code (err )
53+ error_context = {
54+ "request.remote" ,
55+ request .remote ,
56+ "request.method" ,
57+ request .method ,
58+ "request.path" ,
59+ request .path ,
60+ }
61+ if isinstance (err , OsparcErrorMixin ):
62+ error_context .update (err .error_context ())
63+
64+ frontend_msg = FMSG_INTERNAL_ERROR_USER_FRIENDLY .format (error_code )
65+ log_msg = create_troubleshotting_log_message (
66+ message_to_user = frontend_msg ,
67+ error = err ,
68+ error_code = error_code ,
69+ error_context = error_context ,
70+ )
71+
4872 http_error = create_http_error (
4973 err ,
50- "Unexpected Server error" ,
74+ frontend_msg ,
5175 web .HTTPInternalServerError ,
5276 skip_internal_error_details = _is_prod ,
5377 )
54-
55- if log_exceptions :
56- _logger .error (
57- 'Unexpected server error "%s" from access: %s "%s %s". Responding with status %s' ,
58- type (err ),
59- request .remote ,
60- request .method ,
61- request .path ,
62- http_error .status ,
63- exc_info = err ,
64- stack_info = True ,
65- )
78+ _logger .exception (
79+ log_msg ,
80+ extra = get_log_record_extra (
81+ error_code = error_code ,
82+ user_id = error_context .get ("user_id" , None ),
83+ ),
84+ )
6685 raise http_error
6786
6887 @web .middleware
0 commit comments