From c7584d873314951773015ff7c9f81e611f338ea5 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 29 Jan 2025 13:30:50 -0300 Subject: [PATCH] fix: Improve error handling at startup (#5994) * fix: Handle network errors when fetching version notice Catch and handle potential network connection errors when attempting to build the version notice, preventing potential startup failures due to version check issues * refactor: Improve version check error handling and add docstring Enhance version notice function by: - Adding comprehensive docstring with description, args, returns, and example - Using contextlib.suppress to handle network errors - Removing redundant try-except block in print_banner - Simplifying version check logic * refactor: Improve telemetry error logging Change telemetry service error logging from `logger.exception()` to `logger.error()` to reduce verbosity and prevent unnecessary stack trace printing * refactor: Remove unnecessary logger import in version utility Remove unused logger import and exception logging in version check function to simplify error handling and reduce unnecessary logging --- src/backend/base/langflow/__main__.py | 28 ++++++++++++++++--- .../langflow/services/telemetry/service.py | 6 ++-- src/backend/base/langflow/utils/version.py | 3 -- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/backend/base/langflow/__main__.py b/src/backend/base/langflow/__main__.py index c1351fdea..8cb0523be 100644 --- a/src/backend/base/langflow/__main__.py +++ b/src/backend/base/langflow/__main__.py @@ -7,6 +7,7 @@ import socket import sys import time import warnings +from contextlib import suppress from pathlib import Path import click @@ -312,10 +313,28 @@ def get_letter_from_version(version: str) -> str | None: def build_version_notice(current_version: str, package_name: str) -> str: - latest_version = fetch_latest_version(package_name, include_prerelease=langflow_is_pre_release(current_version)) - if latest_version and pkg_version.parse(current_version) < pkg_version.parse(latest_version): - release_type = "pre-release" if langflow_is_pre_release(latest_version) else "version" - return f"A new {release_type} of {package_name} is available: {latest_version}" + """Build a version notice message if a newer version is available. + + This function checks if there is a newer version of the package available on PyPI + and returns an appropriate notice message. + + Args: + current_version (str): The currently installed version of the package + package_name (str): The name of the package to check + + Returns: + str: A notice message if a newer version is available, empty string otherwise. + The message will indicate if the newer version is a pre-release. + + Example: + >>> build_version_notice("1.0.0", "langflow") + 'A new version of langflow is available: 1.1.0' + """ + with suppress(httpx.ConnectError): + latest_version = fetch_latest_version(package_name, include_prerelease=langflow_is_pre_release(current_version)) + if latest_version and pkg_version.parse(current_version) < pkg_version.parse(latest_version): + release_type = "pre-release" if langflow_is_pre_release(latest_version) else "version" + return f"A new {release_type} of {package_name} is available: {latest_version}" return "" @@ -347,6 +366,7 @@ def print_banner(host: str, port: int) -> None: is_pre_release |= langflow_is_pre_release(langflow_version) # Update pre-release status notice = build_version_notice(langflow_version, package_name) + notice = stylize_text(notice, package_name, is_prerelease=is_pre_release) if notice: notices.append(notice) diff --git a/src/backend/base/langflow/services/telemetry/service.py b/src/backend/base/langflow/services/telemetry/service.py index 68d2bfbe6..6d953045b 100644 --- a/src/backend/base/langflow/services/telemetry/service.py +++ b/src/backend/base/langflow/services/telemetry/service.py @@ -72,11 +72,11 @@ class TelemetryService(Service): else: logger.debug("Telemetry data sent successfully.") except httpx.HTTPStatusError: - logger.exception("HTTP error occurred") + logger.error("HTTP error occurred") except httpx.RequestError: - logger.exception("Request error occurred") + logger.error("Request error occurred") except Exception: # noqa: BLE001 - logger.exception("Unexpected error occurred") + logger.error("Unexpected error occurred") async def log_package_run(self, payload: RunPayload) -> None: await self._queue_event((self.send_telemetry_data, payload, "run")) diff --git a/src/backend/base/langflow/utils/version.py b/src/backend/base/langflow/utils/version.py index 0ef79548d..336c6046e 100644 --- a/src/backend/base/langflow/utils/version.py +++ b/src/backend/base/langflow/utils/version.py @@ -3,8 +3,6 @@ from importlib import metadata import httpx from packaging import version as pkg_version -from langflow.logging.logger import logger - def _compute_non_prerelease_version(prerelease_version: str) -> str: prerelease_keywords = ["a", "b", "rc", "dev", "post"] @@ -86,7 +84,6 @@ def fetch_latest_version(package_name: str, *, include_prerelease: bool) -> str return max(valid_versions, key=pkg_version.parse) except Exception: # noqa: BLE001 - logger.exception("Error fetching latest version") return None