diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dc2bb6f..89f1992f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## Unreleased +***Fixed:*** + +- Ensure telemetry is submitted when its storage directory does not exist + ## 0.38.0 - 2026-08-04 ***Changed:*** diff --git a/src/dda/telemetry/daemon/handler.py b/src/dda/telemetry/daemon/handler.py index bcf131b4..c4e6d218 100644 --- a/src/dda/telemetry/daemon/handler.py +++ b/src/dda/telemetry/daemon/handler.py @@ -9,9 +9,13 @@ from dda.telemetry.constants import DaemonEnvVars from dda.utils.fs import Path +LOG_FILE = Path(os.environ[DaemonEnvVars.LOG_FILE]) ERROR_FILE = Path(os.environ[DaemonEnvVars.ERROR_FILE]) ERROR_OCCURRED = False +LOG_FILE.parent.ensure_dir() +ERROR_FILE.parent.ensure_dir() + def set_error() -> None: global ERROR_OCCURRED # noqa: PLW0603 @@ -33,7 +37,7 @@ def filter(self, record: logging.LogRecord) -> bool: # noqa: PLR6301 logging.basicConfig( - filename=os.environ[DaemonEnvVars.LOG_FILE], + filename=LOG_FILE, level=os.environ.get(DaemonEnvVars.LOG_LEVEL, "INFO"), format="%(asctime)s | %(levelname)s | %(message)s", ) diff --git a/tests/telemetry/test_manager.py b/tests/telemetry/test_manager.py new file mode 100644 index 00000000..ca47d72b --- /dev/null +++ b/tests/telemetry/test_manager.py @@ -0,0 +1,40 @@ +# SPDX-FileCopyrightText: 2026-present Datadog, Inc. +# +# SPDX-License-Identifier: MIT +from __future__ import annotations + +import os +import subprocess +import sys + +from dda.telemetry.constants import DaemonEnvVars +from dda.telemetry.manager import TelemetryManager + + +def test_watch_delegates_storage_creation_to_daemon(mocker, temp_dir): + app = mocker.Mock() + cache_dir = temp_dir / "cache" + app.config.storage.cache = cache_dir + write_dir = temp_dir / "write" + mocker.patch("tempfile.mkdtemp", return_value=str(write_dir)) + + manager = TelemetryManager(app) + manager.watch() + + storage_dir = cache_dir / "telemetry" + assert not storage_dir.exists() + env_vars = app.subprocess.spawn_daemon.call_args.kwargs["env"] + assert env_vars[DaemonEnvVars.WRITE_DIR] == str(write_dir) + assert env_vars[DaemonEnvVars.LOG_FILE] == str(storage_dir / "daemon.log") + assert env_vars[DaemonEnvVars.ERROR_FILE] == str(storage_dir / "daemon.error") + + +def test_daemon_creates_storage_directory(temp_dir): + storage_dir = temp_dir / "cache" / "telemetry" + env_vars = os.environ.copy() + env_vars[DaemonEnvVars.LOG_FILE] = str(storage_dir / "daemon.log") + env_vars[DaemonEnvVars.ERROR_FILE] = str(storage_dir / "daemon.error") + + subprocess.run([sys.executable, "-c", "import dda.telemetry.daemon.handler"], env=env_vars, check=True) + + assert storage_dir.is_dir()