Skip to content

Commit 96e05f8

Browse files
committed
remove caching from _OtelLogLevelLoggerAdapter
1 parent eb2baa5 commit 96e05f8

2 files changed

Lines changed: 36 additions & 23 deletions

File tree

  • opentelemetry-instrumentation
    • src/opentelemetry/instrumentation/auto_instrumentation
    • tests/auto_instrumentation

opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/_load.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
from functools import cached_property
5-
from logging import DEBUG, NOTSET, Logger, LoggerAdapter, getLogger
5+
from logging import (
6+
DEBUG,
7+
NOTSET,
8+
Logger,
9+
LoggerAdapter,
10+
NullHandler,
11+
getLogger,
12+
)
613
from os import environ
714
from sys import stderr
815

@@ -50,20 +57,12 @@ class _OtelLogLevelLoggerAdapter(LoggerAdapter):
5057
OTEL_LOG_LEVEL asks for debug output and Python logging would not emit them.
5158
"""
5259

53-
def __init__(self, logger, extra):
54-
super().__init__(logger, extra)
55-
# This adapter is built when this module is imported. That covers the
56-
# sitecustomize path where auto-instrumentation runs before application
57-
# logging setup, and the edge case where Python logging is set up and then
58-
# auto_instrumentation.initialize() is invoked explicitly. If this adapter
59-
# is used after application code can change logging, it should be modified
60-
# to not use the cached value in the _logger_emits_debug field.
61-
self._logger_emits_debug = self._logger_would_emit(DEBUG)
62-
6360
def debug(self, msg: str, *args: object, **kwargs: object) -> None:
6461
super().debug(msg, *args, **kwargs)
6562

66-
if not _otel_log_level_allows_debug() or self._logger_emits_debug:
63+
if not _otel_log_level_allows_debug() or self._logger_would_emit(
64+
DEBUG
65+
):
6766
return
6867

6968
message = msg
@@ -81,6 +80,9 @@ def _logger_would_emit(self, level: int) -> bool:
8180
logger: Logger | None = self.logger
8281
while logger:
8382
for handler in logger.handlers:
83+
if isinstance(handler, NullHandler):
84+
continue
85+
8486
if handler.level == NOTSET or level >= handler.level:
8587
return True
8688

opentelemetry-instrumentation/tests/auto_instrumentation/test_load.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
# SPDX-License-Identifier: Apache-2.0
33
# type: ignore
44

5-
from logging import DEBUG, INFO, NullHandler, getLogger
5+
from io import StringIO
6+
from logging import DEBUG, INFO, NullHandler, StreamHandler, getLogger
67
from unittest import TestCase
78
from unittest.mock import Mock, call, patch
89

@@ -304,12 +305,9 @@ def test_otel_log_level_output_uses_logger_hierarchy_handlers(self):
304305
)
305306
stderr_mock.flush.assert_called_once()
306307

307-
handler = NullHandler()
308-
handler.setLevel(INFO)
309-
parent_logger.addHandler(handler)
310-
otel_log_level_logger = _load._OtelLogLevelLoggerAdapter(
311-
logger, {}
312-
)
308+
null_handler = NullHandler()
309+
null_handler.setLevel(DEBUG)
310+
parent_logger.addHandler(null_handler)
313311

314312
with patch(
315313
"opentelemetry.instrumentation.auto_instrumentation._load.stderr"
@@ -323,10 +321,23 @@ def test_otel_log_level_output_uses_logger_hierarchy_handlers(self):
323321
)
324322
stderr_mock.flush.assert_called_once()
325323

326-
handler.setLevel(DEBUG)
327-
otel_log_level_logger = _load._OtelLogLevelLoggerAdapter(
328-
logger, {}
329-
)
324+
stream_handler = StreamHandler(StringIO())
325+
stream_handler.setLevel(INFO)
326+
parent_logger.addHandler(stream_handler)
327+
328+
with patch(
329+
"opentelemetry.instrumentation.auto_instrumentation._load.stderr"
330+
) as stderr_mock:
331+
otel_log_level_logger.debug("Instrumented %s", "requests")
332+
333+
stderr_mock.write.assert_called_once_with(
334+
"DEBUG:"
335+
"opentelemetry.test.auto_instrumentation.loader:"
336+
"Instrumented 'requests'\n"
337+
)
338+
stderr_mock.flush.assert_called_once()
339+
340+
stream_handler.setLevel(DEBUG)
330341

331342
with patch(
332343
"opentelemetry.instrumentation.auto_instrumentation._load.stderr"

0 commit comments

Comments
 (0)