From 8b1716b87d1227ffa388ad4c9cbf87058bd271a6 Mon Sep 17 00:00:00 2001 From: Matthias Tafelmeier Date: Wed, 25 Mar 2026 20:57:15 +0100 Subject: [PATCH 1/2] feat: use OTel logging via get_logger from shared module --- controller/breeder_service.py | 6 ++---- controller/credential_create.py | 4 ++-- controller/credential_delete.py | 4 ++-- controller/credential_get.py | 4 ++-- controller/credentials_get.py | 4 ++-- controller/database.py | 5 +++-- tests/conftest.py | 12 ++++++------ 7 files changed, 19 insertions(+), 20 deletions(-) diff --git a/controller/breeder_service.py b/controller/breeder_service.py index 1d207e7..48728e6 100644 --- a/controller/breeder_service.py +++ b/controller/breeder_service.py @@ -2,21 +2,19 @@ import hashlib import datetime import copy -import logging import os from dateutil.parser import parse from f.controller.database import ArchiveDatabaseRepository, MetadataDatabaseRepository from f.controller.config import BreederConfig, BREEDER_CAPABILITIES, DatabaseConfig +from f.shared.otel_logging import get_logger -# Import wmill at top level so Windmill can detect it for dependency resolution import wmill from wmill import Windmill -# Import optuna for schema initialization import optuna.storages -logger = logging.getLogger(__name__) +logger = get_logger(__name__) def cancel_job_by_id(job_id: str, reason: str = None) -> bool: """Cancel a Windmill job by its ID diff --git a/controller/credential_create.py b/controller/credential_create.py index 07fd9d2..760daa4 100644 --- a/controller/credential_create.py +++ b/controller/credential_create.py @@ -1,9 +1,9 @@ from f.controller.config import DatabaseConfig from f.controller.database import MetadataDatabaseRepository +from f.shared.otel_logging import get_logger import uuid -import logging -logger = logging.getLogger(__name__) +logger = get_logger(__name__) def main(request_data=None): """Create a new credential catalog entry""" diff --git a/controller/credential_delete.py b/controller/credential_delete.py index 100f11f..85bd274 100644 --- a/controller/credential_delete.py +++ b/controller/credential_delete.py @@ -1,8 +1,8 @@ from f.controller.config import DatabaseConfig from f.controller.database import MetadataDatabaseRepository -import logging +from f.shared.otel_logging import get_logger -logger = logging.getLogger(__name__) +logger = get_logger(__name__) def main(request_data=None): """Delete a credential by ID""" diff --git a/controller/credential_get.py b/controller/credential_get.py index 8226914..dbb9c15 100644 --- a/controller/credential_get.py +++ b/controller/credential_get.py @@ -1,8 +1,8 @@ from f.controller.config import DatabaseConfig from f.controller.database import MetadataDatabaseRepository -import logging +from f.shared.otel_logging import get_logger -logger = logging.getLogger(__name__) +logger = get_logger(__name__) def main(request_data=None): """Get a specific credential by ID""" diff --git a/controller/credentials_get.py b/controller/credentials_get.py index 9e048d2..e824cab 100644 --- a/controller/credentials_get.py +++ b/controller/credentials_get.py @@ -1,8 +1,8 @@ from f.controller.config import DatabaseConfig from f.controller.database import MetadataDatabaseRepository -import logging +from f.shared.otel_logging import get_logger -logger = logging.getLogger(__name__) +logger = get_logger(__name__) def main(request_data=None): """Get list of all credentials""" diff --git a/controller/database.py b/controller/database.py index 9d1f57b..0ae277a 100644 --- a/controller/database.py +++ b/controller/database.py @@ -1,9 +1,10 @@ import psycopg2 -import logging import json from contextlib import contextmanager -logger = logging.getLogger(__name__) +from f.shared.otel_logging import get_logger + +logger = get_logger(__name__) @contextmanager def get_db_connection(db_config): diff --git a/tests/conftest.py b/tests/conftest.py index 162ecf6..1dc095a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -23,20 +23,15 @@ import types from unittest.mock import MagicMock -# Add parent directory to path for imports sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) -# Mock external dependencies before imports sys.modules['database'] = MagicMock() -# Mock wmill module (only available inside Windmill) sys.modules['wmill'] = MagicMock() -# Mock optuna.storages module (only needed in production, not tests) sys.modules['optuna'] = MagicMock() sys.modules['optuna.storages'] = MagicMock() -# Create stub modules using types.ModuleType def create_stub_module(name): module = types.ModuleType(name) module.__path__ = [] @@ -44,11 +39,16 @@ def create_stub_module(name): module.__name__ = name return module -# Create f and f.controller fake_f = create_stub_module('f') fake_controller = create_stub_module('f.controller') +fake_shared = create_stub_module('f.shared') sys.modules['f'] = fake_f sys.modules['f.controller'] = fake_controller +sys.modules['f.shared'] = fake_shared + +fake_otel = create_stub_module('f.shared.otel_logging') +fake_otel.get_logger = lambda name: MagicMock() +sys.modules['f.shared.otel_logging'] = fake_otel # Pre-populate all f.controller.xxx modules BEFORE any imports for module_name in ['config', 'database', 'breeder_service', 'credential_create', From b2f50f6e0233c8e02dbdcaf66cb0b8ec42f0b49f Mon Sep 17 00:00:00 2001 From: Matthias Tafelmeier Date: Wed, 25 Mar 2026 21:20:06 +0100 Subject: [PATCH 2/2] fix: mock f.shared.otel_logging in CI workflow --- .github/workflows/ci.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 84dc1ce..63b31ac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,8 +72,13 @@ jobs: fake_f = MagicMock() fake_f.controller = FakeControllerModule() + fake_f.shared = MagicMock() + fake_f.shared.otel_logging = MagicMock() + fake_f.shared.otel_logging.get_logger = lambda name: MagicMock() sys.modules['f'] = fake_f sys.modules['f.controller'] = fake_f.controller + sys.modules['f.shared'] = fake_f.shared + sys.modules['f.shared.otel_logging'] = fake_f.shared.otel_logging # Pre-populate all f.controller.xxx modules BEFORE any imports for module_name in ['config', 'database', 'breeder_service', 'breeder_create', @@ -382,8 +387,13 @@ jobs: fake_f = MagicMock() fake_f.controller = FakeControllerModule() + fake_f.shared = MagicMock() + fake_f.shared.otel_logging = MagicMock() + fake_f.shared.otel_logging.get_logger = lambda name: MagicMock() sys.modules['f'] = fake_f sys.modules['f.controller'] = fake_f.controller + sys.modules['f.shared'] = fake_f.shared + sys.modules['f.shared.otel_logging'] = fake_f.shared.otel_logging # Pre-populate all f.controller.xxx modules BEFORE any imports for module_name in ['config', 'database', 'breeder_service', 'breeder_create',