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
This commit is contained in:
Gabriel Luiz Freitas Almeida 2025-01-29 13:30:50 -03:00 committed by GitHub
commit c7584d8733
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 27 additions and 10 deletions

View file

@ -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)

View file

@ -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"))

View file

@ -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