From 4b71fe4291eb58a6024f8d5ab28ab48e8588b1ea Mon Sep 17 00:00:00 2001 From: febux Date: Fri, 4 Sep 2026 01:56:44 +0300 Subject: [PATCH] Respect log level env for OTLP. --- src/contract_check/core/telemetry.py | 2 +- tests/unit/test_telemetry.py | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/contract_check/core/telemetry.py b/src/contract_check/core/telemetry.py index 9cd10bf..750674e 100644 --- a/src/contract_check/core/telemetry.py +++ b/src/contract_check/core/telemetry.py @@ -113,7 +113,7 @@ def setup_telemetry(service_name: str | None = None) -> None: _log_provider = log_provider otel_log_handler = StructlogOTLPLogHandler(logger_provider=log_provider) - otel_log_handler.setLevel(logging.INFO) + otel_log_handler.setLevel(getattr(logging, settings.log_level.upper(), logging.INFO)) logging.getLogger().addHandler(otel_log_handler) # Metrics infrastructure (OTel metrics → OTLP). Existing prometheus_client diff --git a/tests/unit/test_telemetry.py b/tests/unit/test_telemetry.py index 981ac78..26bd8e3 100644 --- a/tests/unit/test_telemetry.py +++ b/tests/unit/test_telemetry.py @@ -74,3 +74,30 @@ def test_structlog_logs_reach_root_handlers() -> None: log = get_logger("test") log.info("smoke_test", answer=42) + + +@pytest.mark.parametrize("level", ["DEBUG", "INFO", "WARNING"]) +def test_otel_handler_respects_configured_log_level( + monkeypatch: pytest.MonkeyPatch, level: str +) -> None: + """The OTLP handler level matches settings.log_level so DEBUG logs can reach OpenObserve.""" + from contract_check.core.config import get_settings + from contract_check.core.logging import configure_logging + from contract_check.core.telemetry import setup_telemetry, shutdown_telemetry + + configure_logging(level, json_output=True, service="test-service", env="test") + monkeypatch.setattr( + get_settings(), "otel_exporter_otlp_endpoint", "http://localhost:9999/v1/logs" + ) + monkeypatch.setattr(get_settings(), "log_level", level) + + setup_telemetry("test") + root = logging.getLogger() + try: + otel_handler = next( + h for h in root.handlers if type(h).__name__ == "StructlogOTLPLogHandler" + ) + assert otel_handler.level == getattr(logging, level) + finally: + shutdown_telemetry() + root.handlers = [h for h in root.handlers if type(h).__name__ != "StructlogOTLPLogHandler"]