From 56d18bd6972e60096471b185f312b67a255489ac Mon Sep 17 00:00:00 2001 From: Guillaume De Saint Martin Date: Tue, 29 Sep 2026 15:16:53 +0200 Subject: [PATCH] [Logs] fix misleading logs & skip web notifier when no web interface --- .../Services/Interfaces/web_interface/web.py | 4 ++++ .../Services/Notifiers/web_notifier/web.py | 9 +++++++++ .../Services/Services_bases/web_service/web.py | 13 ++++++++++--- .../staggered_orders_trading.py | 5 ++++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/tentacles/Services/Interfaces/web_interface/web.py b/packages/tentacles/Services/Interfaces/web_interface/web.py index a402cbed0c..d1f167427a 100644 --- a/packages/tentacles/Services/Interfaces/web_interface/web.py +++ b/packages/tentacles/Services/Interfaces/web_interface/web.py @@ -278,6 +278,10 @@ async def _async_run(self) -> bool: self.started = True try: + self.logger.info( + f"Interface successfully initialized and accessible at: http://" + f"{Service_bases.WebService.instance().get_web_server_url(port=self.port)}." + ) await self.uvicorn_server.serve() finally: if self._serve_finished is not None: diff --git a/packages/tentacles/Services/Notifiers/web_notifier/web.py b/packages/tentacles/Services/Notifiers/web_notifier/web.py index 7c647be8fe..0d6b2f65a6 100644 --- a/packages/tentacles/Services/Notifiers/web_notifier/web.py +++ b/packages/tentacles/Services/Notifiers/web_notifier/web.py @@ -13,9 +13,11 @@ # # You should have received a copy of the GNU Lesser General Public # License along with this library. +import octobot_services.api as service_api import octobot_services.notification as services_notification import octobot_services.notifier as notifier import tentacles.Services.Interfaces.web_interface as web_interface +import tentacles.Services.Interfaces.web_interface.web as web_interface_web import tentacles.Services.Services_bases as Services_bases @@ -23,6 +25,13 @@ class WebNotifier(notifier.AbstractNotifier): REQUIRED_SERVICES = [Services_bases.WebService] NOTIFICATION_TYPE_KEY = "web" + @classmethod + def is_enabled(cls, config): + if not service_api.is_enabled(web_interface_web.WebInterface): + # disable web notifier if web interface is not enabled (ex: node UI only) + return False + return super().is_enabled(config) + async def _handle_notification(self, notification: services_notification.Notification): await web_interface.add_notification(notification.level, notification.title, notification.text.replace("\n", "
"), diff --git a/packages/tentacles/Services/Services_bases/web_service/web.py b/packages/tentacles/Services/Services_bases/web_service/web.py index d755b215d8..09f149e863 100644 --- a/packages/tentacles/Services/Services_bases/web_service/web.py +++ b/packages/tentacles/Services/Services_bases/web_service/web.py @@ -120,6 +120,8 @@ async def stop(self): def _get_web_server_port(self): try: + if not self.config: + raise KeyError return os.getenv( services_constants.ENV_WEB_PORT, self.config[services_constants.CONFIG_CATEGORY_SERVICES][services_constants.CONFIG_WEB][ @@ -128,8 +130,9 @@ def _get_web_server_port(self): except KeyError: return os.getenv(services_constants.ENV_WEB_PORT, services_constants.DEFAULT_SERVER_PORT) - def _get_web_server_url(self): - port = self._get_web_server_port() + def get_web_server_url(self, port=None): + if port is None: + port = self._get_web_server_port() try: return f"{os.getenv(services_constants.ENV_WEB_ADDRESS, socket.gethostbyname(socket.gethostname()))}:{port}" except OSError as err: @@ -140,4 +143,8 @@ def _get_web_server_url(self): return f"{LOCAL_HOST_IP}:{port}" def get_successful_startup_message(self): - return f"Interface successfully initialized and accessible at: http://{self._get_web_server_url()}.", True + port = self._get_web_server_port() + return ( + f"WebInterface configured to use port {port} if started.", + True, + ) diff --git a/packages/tentacles/Trading/Mode/staggered_orders_trading_mode/staggered_orders_trading.py b/packages/tentacles/Trading/Mode/staggered_orders_trading_mode/staggered_orders_trading.py index 19b35286f7..959c3a3aa8 100644 --- a/packages/tentacles/Trading/Mode/staggered_orders_trading_mode/staggered_orders_trading.py +++ b/packages/tentacles/Trading/Mode/staggered_orders_trading_mode/staggered_orders_trading.py @@ -600,7 +600,10 @@ def __init__(self, channel, config, trading_mode, exchange_manager): except TypeError as err: # don't crash if fees are not available market_status = self.exchange_manager.exchange.get_market_status(self.symbol, with_fixer=False) - self.logger.error(f"Error reading fees for {self.symbol}: {err}. Market status: {market_status}") + self.logger.warning( + f"Impossible to read fees for {self.symbol}: {err}. Market status: {market_status}. " + f"Using default {trading_constants.CONFIG_DEFAULT_FEES} fees." + ) self.max_fees = decimal.Decimal(str(trading_constants.CONFIG_DEFAULT_FEES)) self.flat_increment = None self.flat_spread = None