From 69d3ceaba5f4ca646854627e5b7806ec0561f93d Mon Sep 17 00:00:00 2001 From: Hubert Deng Date: Fri, 3 Oct 2025 13:43:17 -0700 Subject: [PATCH 1/5] add some basic logs --- devservices/commands/down.py | 12 ++++++++++++ devservices/commands/up.py | 13 +++++++++++++ devservices/main.py | 7 ++++++- devservices/utils/dependencies.py | 29 +++++++++++++++++++++++++++++ devservices/utils/docker_compose.py | 8 ++++++++ 5 files changed, 68 insertions(+), 1 deletion(-) diff --git a/devservices/commands/down.py b/devservices/commands/down.py index 64068f63..24ac0129 100644 --- a/devservices/commands/down.py +++ b/devservices/commands/down.py @@ -1,6 +1,7 @@ from __future__ import annotations import concurrent.futures +import logging import os import subprocess from argparse import _SubParsersAction @@ -15,6 +16,7 @@ from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR_KEY from devservices.constants import DEVSERVICES_DIR_NAME +from devservices.constants import LOGGER_NAME from devservices.exceptions import ConfigError from devservices.exceptions import ConfigNotFoundError from devservices.exceptions import DependencyError @@ -116,6 +118,16 @@ def down(args: Namespace) -> None: == DependencyType.SUPERVISOR ] + logger = logging.getLogger(LOGGER_NAME) + logger.info( + "Stopping service", + extra={ + "service_name": service.name, + "exclude_local": exclude_local, + "mode": list(active_modes), + }, + ) + with Status( lambda: console.warning(f"Stopping {service.name}"), ) as status: diff --git a/devservices/commands/up.py b/devservices/commands/up.py index 8221c58c..14a786b7 100644 --- a/devservices/commands/up.py +++ b/devservices/commands/up.py @@ -1,6 +1,7 @@ from __future__ import annotations import concurrent.futures +import logging import os import subprocess from argparse import _SubParsersAction @@ -17,6 +18,7 @@ from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR_KEY from devservices.constants import DEVSERVICES_DIR_NAME +from devservices.constants import LOGGER_NAME from devservices.exceptions import ConfigError from devservices.exceptions import ConfigNotFoundError from devservices.exceptions import ContainerHealthcheckFailedError @@ -94,6 +96,17 @@ def up(args: Namespace, existing_status: Status | None = None) -> None: mode = args.mode exclude_local = getattr(args, "exclude_local", False) + logger = logging.getLogger(LOGGER_NAME) + logger.info( + "Starting service", + extra={ + "service_name": service.name, + "mode": mode, + "exclude_local": exclude_local, + "available_modes": list(modes.keys()), + }, + ) + state = State() with Status( diff --git a/devservices/main.py b/devservices/main.py index d59c96f3..b20faf1c 100644 --- a/devservices/main.py +++ b/devservices/main.py @@ -16,6 +16,7 @@ from sentry_sdk import set_user from sentry_sdk import start_transaction from sentry_sdk.integrations.argv import ArgvIntegration +from sentry_sdk.integrations.logging import LoggingIntegration from sentry_sdk.types import Event from sentry_sdk.types import Hint @@ -79,7 +80,11 @@ def before_send_transaction(event: Event, hint: Hint) -> Event: dsn="https://56470da7302c16e83141f62f88e46449@o1.ingest.us.sentry.io/4507946704961536", traces_sample_rate=1.0, profiles_sample_rate=1.0, - integrations=[ArgvIntegration()], + integrations=[ + ArgvIntegration(), + LoggingIntegration(sentry_logs_level=logging.DEBUG), + ], + enable_logs=True, environment=sentry_environment, before_send=before_send_error, before_send_transaction=before_send_transaction, diff --git a/devservices/utils/dependencies.py b/devservices/utils/dependencies.py index 6fe0b8d8..87572305 100644 --- a/devservices/utils/dependencies.py +++ b/devservices/utils/dependencies.py @@ -411,12 +411,23 @@ def install_dependencies( def install_dependency(dependency: RemoteConfig) -> set[InstalledRemoteDependency]: + logger = logging.getLogger(LOGGER_NAME) dependency_repo_dir = os.path.join( DEVSERVICES_DEPENDENCIES_CACHE_DIR, DEPENDENCY_CONFIG_VERSION, dependency.repo_name, ) + logger.info( + "Installing dependency", + extra={ + "repo_name": dependency.repo_name, + "repo_link": dependency.repo_link, + "branch": dependency.branch, + "mode": dependency.mode, + }, + ) + os.makedirs(DEVSERVICES_DEPENDENCIES_CACHE_DIR, exist_ok=True) # Ensure that only one process is installing a specific dependency at a time @@ -498,6 +509,15 @@ def _update_dependency( dependency: RemoteConfig, dependency_repo_dir: str, ) -> None: + logger = logging.getLogger(LOGGER_NAME) + logger.info( + "Updating dependency", + extra={ + "repo_name": dependency.repo_name, + "repo_link": dependency.repo_link, + "branch": dependency.branch, + }, + ) git_config_manager = GitConfigManager( dependency_repo_dir, DEPENDENCY_GIT_PARTIAL_CLONE_CONFIG_OPTIONS, @@ -580,6 +600,15 @@ def _checkout_dependency( dependency: RemoteConfig, dependency_repo_dir: str, ) -> None: + logger = logging.getLogger(LOGGER_NAME) + logger.info( + "Checking out dependency", + extra={ + "repo_name": dependency.repo_name, + "repo_link": dependency.repo_link, + "branch": dependency.branch, + }, + ) with tempfile.TemporaryDirectory() as temp_dir: try: _run_command( diff --git a/devservices/utils/docker_compose.py b/devservices/utils/docker_compose.py index d8a26cf5..1f33c607 100644 --- a/devservices/utils/docker_compose.py +++ b/devservices/utils/docker_compose.py @@ -306,6 +306,14 @@ def run_cmd( console = Console() cmd_pretty = shlex.join(cmd) + logger.info( + "Running docker compose command", + extra={ + "command": cmd_pretty, + "max_retries": retries, + }, + ) + proc = None retries += 1 # initial try From cbdf7ca62e87256658637c36db8a6ef78b39615a Mon Sep 17 00:00:00 2001 From: Hubert Deng Date: Fri, 3 Oct 2025 13:48:54 -0700 Subject: [PATCH 2/5] use debug logger --- devservices/commands/down.py | 2 +- devservices/commands/up.py | 2 +- devservices/utils/dependencies.py | 6 +++--- devservices/utils/docker_compose.py | 2 +- requirements.txt | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/devservices/commands/down.py b/devservices/commands/down.py index 24ac0129..10d4586c 100644 --- a/devservices/commands/down.py +++ b/devservices/commands/down.py @@ -119,7 +119,7 @@ def down(args: Namespace) -> None: ] logger = logging.getLogger(LOGGER_NAME) - logger.info( + logger.debug( "Stopping service", extra={ "service_name": service.name, diff --git a/devservices/commands/up.py b/devservices/commands/up.py index 14a786b7..772c4f26 100644 --- a/devservices/commands/up.py +++ b/devservices/commands/up.py @@ -97,7 +97,7 @@ def up(args: Namespace, existing_status: Status | None = None) -> None: exclude_local = getattr(args, "exclude_local", False) logger = logging.getLogger(LOGGER_NAME) - logger.info( + logger.debug( "Starting service", extra={ "service_name": service.name, diff --git a/devservices/utils/dependencies.py b/devservices/utils/dependencies.py index 87572305..2bbf82da 100644 --- a/devservices/utils/dependencies.py +++ b/devservices/utils/dependencies.py @@ -418,7 +418,7 @@ def install_dependency(dependency: RemoteConfig) -> set[InstalledRemoteDependenc dependency.repo_name, ) - logger.info( + logger.debug( "Installing dependency", extra={ "repo_name": dependency.repo_name, @@ -510,7 +510,7 @@ def _update_dependency( dependency_repo_dir: str, ) -> None: logger = logging.getLogger(LOGGER_NAME) - logger.info( + logger.debug( "Updating dependency", extra={ "repo_name": dependency.repo_name, @@ -601,7 +601,7 @@ def _checkout_dependency( dependency_repo_dir: str, ) -> None: logger = logging.getLogger(LOGGER_NAME) - logger.info( + logger.debug( "Checking out dependency", extra={ "repo_name": dependency.repo_name, diff --git a/devservices/utils/docker_compose.py b/devservices/utils/docker_compose.py index 1f33c607..470b27d3 100644 --- a/devservices/utils/docker_compose.py +++ b/devservices/utils/docker_compose.py @@ -306,7 +306,7 @@ def run_cmd( console = Console() cmd_pretty = shlex.join(cmd) - logger.info( + logger.debug( "Running docker compose command", extra={ "command": cmd_pretty, diff --git a/requirements.txt b/requirements.txt index c3ab060c..164227b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,5 +2,5 @@ pyyaml==6.0.2 packaging==24.0 sentry-devenv==1.9.0 -sentry-sdk==2.27.0 +sentry-sdk==2.39.0 supervisor==4.2.5 From afaef7291a8d016e3a4e90cd9bdbec117104a9db Mon Sep 17 00:00:00 2001 From: Hubert Deng Date: Fri, 3 Oct 2025 13:51:34 -0700 Subject: [PATCH 3/5] fix typo with down mode log --- devservices/commands/down.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devservices/commands/down.py b/devservices/commands/down.py index 10d4586c..77288926 100644 --- a/devservices/commands/down.py +++ b/devservices/commands/down.py @@ -124,7 +124,7 @@ def down(args: Namespace) -> None: extra={ "service_name": service.name, "exclude_local": exclude_local, - "mode": list(active_modes), + "active_modes": list(active_modes), }, ) From 1fc7b42eae957f78a7595e244f5841fd7120f7e6 Mon Sep 17 00:00:00 2001 From: Hubert Deng Date: Fri, 3 Oct 2025 13:59:19 -0700 Subject: [PATCH 4/5] switch to sentry logger --- devservices/commands/down.py | 6 ++---- devservices/commands/up.py | 6 ++---- devservices/utils/docker_compose.py | 3 ++- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/devservices/commands/down.py b/devservices/commands/down.py index 77288926..1fbaceeb 100644 --- a/devservices/commands/down.py +++ b/devservices/commands/down.py @@ -1,7 +1,6 @@ from __future__ import annotations import concurrent.futures -import logging import os import subprocess from argparse import _SubParsersAction @@ -9,6 +8,7 @@ from argparse import Namespace from sentry_sdk import capture_exception +from sentry_sdk import logger as sentry_logger from devservices.constants import CONFIG_FILE_NAME from devservices.constants import DEPENDENCY_CONFIG_VERSION @@ -16,7 +16,6 @@ from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR_KEY from devservices.constants import DEVSERVICES_DIR_NAME -from devservices.constants import LOGGER_NAME from devservices.exceptions import ConfigError from devservices.exceptions import ConfigNotFoundError from devservices.exceptions import DependencyError @@ -118,8 +117,7 @@ def down(args: Namespace) -> None: == DependencyType.SUPERVISOR ] - logger = logging.getLogger(LOGGER_NAME) - logger.debug( + sentry_logger.info( "Stopping service", extra={ "service_name": service.name, diff --git a/devservices/commands/up.py b/devservices/commands/up.py index 772c4f26..1d101d64 100644 --- a/devservices/commands/up.py +++ b/devservices/commands/up.py @@ -1,7 +1,6 @@ from __future__ import annotations import concurrent.futures -import logging import os import subprocess from argparse import _SubParsersAction @@ -9,6 +8,7 @@ from argparse import Namespace from sentry_sdk import capture_exception +from sentry_sdk import logger as sentry_logger from sentry_sdk import set_context from sentry_sdk import start_span @@ -18,7 +18,6 @@ from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR_KEY from devservices.constants import DEVSERVICES_DIR_NAME -from devservices.constants import LOGGER_NAME from devservices.exceptions import ConfigError from devservices.exceptions import ConfigNotFoundError from devservices.exceptions import ContainerHealthcheckFailedError @@ -96,8 +95,7 @@ def up(args: Namespace, existing_status: Status | None = None) -> None: mode = args.mode exclude_local = getattr(args, "exclude_local", False) - logger = logging.getLogger(LOGGER_NAME) - logger.debug( + sentry_logger.info( "Starting service", extra={ "service_name": service.name, diff --git a/devservices/utils/docker_compose.py b/devservices/utils/docker_compose.py index 470b27d3..29a64b23 100644 --- a/devservices/utils/docker_compose.py +++ b/devservices/utils/docker_compose.py @@ -12,6 +12,7 @@ from typing import NamedTuple from packaging import version +from sentry_sdk import logger as sentry_logger from devservices.configs.service_config import load_service_config_from_file from devservices.constants import CONFIG_FILE_NAME @@ -306,7 +307,7 @@ def run_cmd( console = Console() cmd_pretty = shlex.join(cmd) - logger.debug( + sentry_logger.info( "Running docker compose command", extra={ "command": cmd_pretty, From 5fbf2aec091a4ba8dacfa88b1f35f06254105806 Mon Sep 17 00:00:00 2001 From: Hubert Deng Date: Fri, 3 Oct 2025 14:01:16 -0700 Subject: [PATCH 5/5] also switch dependencies logger to use sentry logger --- devservices/utils/dependencies.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/devservices/utils/dependencies.py b/devservices/utils/dependencies.py index 2bbf82da..ef1ce705 100644 --- a/devservices/utils/dependencies.py +++ b/devservices/utils/dependencies.py @@ -14,6 +14,7 @@ from typing import TypeGuard from sentry_sdk import capture_message +from sentry_sdk import logger as sentry_logger from sentry_sdk import set_context from devservices.configs.service_config import Dependency @@ -411,14 +412,13 @@ def install_dependencies( def install_dependency(dependency: RemoteConfig) -> set[InstalledRemoteDependency]: - logger = logging.getLogger(LOGGER_NAME) dependency_repo_dir = os.path.join( DEVSERVICES_DEPENDENCIES_CACHE_DIR, DEPENDENCY_CONFIG_VERSION, dependency.repo_name, ) - logger.debug( + sentry_logger.info( "Installing dependency", extra={ "repo_name": dependency.repo_name, @@ -509,8 +509,7 @@ def _update_dependency( dependency: RemoteConfig, dependency_repo_dir: str, ) -> None: - logger = logging.getLogger(LOGGER_NAME) - logger.debug( + sentry_logger.info( "Updating dependency", extra={ "repo_name": dependency.repo_name, @@ -600,8 +599,7 @@ def _checkout_dependency( dependency: RemoteConfig, dependency_repo_dir: str, ) -> None: - logger = logging.getLogger(LOGGER_NAME) - logger.debug( + sentry_logger.info( "Checking out dependency", extra={ "repo_name": dependency.repo_name,