Skip to content
Snippets Groups Projects
Commit 41cab498 authored by Krzysztof Mochocki's avatar Krzysztof Mochocki
Browse files

Add logging of CommunicationError to handles

parent cde377e9
No related branches found
No related tags found
1 merge request!73Clive integration related fixes
......@@ -12,6 +12,7 @@ from helpy._handles.settings import Settings
from helpy._interfaces.context import SelfContextAsync, SelfContextSync
from helpy._interfaces.settings_holder import UniqueSettingsHolder
from helpy._interfaces.stopwatch import Stopwatch
from helpy.exceptions import CommunicationError
from schemas.jsonrpc import ExpectResultT, JSONRPCResult, get_response_model
if TYPE_CHECKING:
......@@ -143,9 +144,11 @@ class AbstractAsyncHandle(AbstractHandle[ApiT], SelfContextAsync, ABC):
self, *, endpoint: str, params: str, expected_type: type[ExpectResultT]
) -> JSONRPCResult[ExpectResultT]:
"""Sends data asynchronously to handled service basing on jsonrpc."""
from helpy._interfaces.error_logger import ErrorLogger
request = build_json_rpc_call(method=endpoint, params=params)
self._log_request(request)
with Stopwatch() as record:
with Stopwatch() as record, ErrorLogger(self.logger, CommunicationError):
response = await self._overseer.async_send(self.http_endpoint, data=request)
self._log_response(record.seconds_delta, response)
return self._response_handle(response=response, expected_type=expected_type)
......@@ -169,9 +172,11 @@ class AbstractSyncHandle(AbstractHandle[ApiT], SelfContextSync, ABC):
def _send(self, *, endpoint: str, params: str, expected_type: type[ExpectResultT]) -> JSONRPCResult[ExpectResultT]:
"""Sends data synchronously to handled service basing on jsonrpc."""
from helpy._interfaces.error_logger import ErrorLogger
request = build_json_rpc_call(method=endpoint, params=params)
self._log_request(request)
with Stopwatch() as record:
with Stopwatch() as record, ErrorLogger(self.logger, CommunicationError):
response = self._overseer.send(self.http_endpoint, data=request)
self._log_response(record.seconds_delta, response)
return self._response_handle(response=response, expected_type=expected_type)
......
from __future__ import annotations
from typing import TYPE_CHECKING
from loguru import logger as loguru_logger
from helpy import ContextSync
if TYPE_CHECKING:
from types import TracebackType
from loguru import Logger
class ErrorLogger(ContextSync[None]):
def __init__(self, logger: Logger | None = None, *exceptions: type[Exception]) -> None:
super().__init__()
self.__logger = logger or loguru_logger
self.__exception_whitelist = list(exceptions)
def _finally(self) -> None:
return None
def _enter(self) -> None:
return None
def _handle_exception(self, exception: BaseException, tb: TracebackType | None) -> bool:
if len(self.__exception_whitelist) > 0:
for whitelisted in self.__exception_whitelist:
if isinstance(exception, whitelisted):
self.__log_exception(exception)
break
return super()._handle_exception(exception, tb)
self.__log_exception(exception)
return super()._handle_exception(exception, tb)
def __log_exception(self, exception: BaseException) -> None:
self.__logger.info(f"Exception occurred [{type(exception)}]: {exception}")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment