Skip to content

Commit 8357f41

Browse files
committed
Do not use lru_cache on method
1 parent c072fe3 commit 8357f41

File tree

3 files changed

+30
-37
lines changed

3 files changed

+30
-37
lines changed

Diff for: opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py

+23-16
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
import threading
2121
import traceback
2222
import warnings
23-
from functools import lru_cache
2423
from os import environ
24+
from threading import Lock
2525
from time import time_ns
2626
from typing import Any, Callable, Optional, Tuple, Union # noqa
2727

@@ -644,6 +644,8 @@ def __init__(
644644
self._at_exit_handler = None
645645
if shutdown_on_exit:
646646
self._at_exit_handler = atexit.register(self.shutdown)
647+
self._logger_cache = {}
648+
self._logger_cache_lock = Lock()
647649

648650
@property
649651
def resource(self):
@@ -667,23 +669,31 @@ def _get_logger_no_cache(
667669
),
668670
)
669671

670-
@lru_cache(maxsize=None)
671672
def _get_logger_cached(
672673
self,
673674
name: str,
674675
version: Optional[str] = None,
675676
schema_url: Optional[str] = None,
676677
) -> Logger:
677-
return Logger(
678-
self._resource,
679-
self._multi_log_record_processor,
680-
InstrumentationScope(
681-
name,
682-
version,
683-
schema_url,
684-
None,
685-
),
686-
)
678+
key = (name, version, schema_url)
679+
if key in self._logger_cache:
680+
return self._logger_cache[key]
681+
682+
with self._logger_cache_lock:
683+
if key in self._logger_cache:
684+
return self._logger_cache[key]
685+
686+
self._logger_cache[key] = Logger(
687+
self._resource,
688+
self._multi_log_record_processor,
689+
InstrumentationScope(
690+
name,
691+
version,
692+
schema_url,
693+
None,
694+
),
695+
)
696+
return self._logger_cache[key]
687697

688698
def get_logger(
689699
self,
@@ -702,10 +712,7 @@ def get_logger(
702712
)
703713
if attributes is None:
704714
return self._get_logger_cached(name, version, schema_url)
705-
else:
706-
return self._get_logger_no_cache(
707-
name, version, schema_url, attributes
708-
)
715+
return self._get_logger_no_cache(name, version, schema_url, attributes)
709716

710717
def add_log_record_processor(
711718
self, log_record_processor: LogRecordProcessor

Diff for: opentelemetry-sdk/tests/logs/test_log_provider_cache.py renamed to opentelemetry-sdk/tests/logs/test_logger_provider_cache.py

+7-21
Original file line numberDiff line numberDiff line change
@@ -23,58 +23,44 @@ def create_logger(handler, name):
2323
return logger
2424

2525

26-
class TestLogProviderCache(unittest.TestCase):
26+
class TestLoggerProviderCache(unittest.TestCase):
2727

2828
def test_get_logger_single_handler(self):
2929
handler, logger_provider = set_up_logging_handler(level=logging.DEBUG)
3030

31-
cache_info = logger_provider._get_logger_cached.cache_clear()
32-
3331
logger = create_logger(handler, "test_logger")
3432

3533
# Ensure logger is lazily cached
36-
cache_info = logger_provider._get_logger_cached.cache_info()
37-
self.assertEqual(0, cache_info.currsize)
34+
self.assertEqual(0, len(logger_provider._logger_cache))
3835

3936
logger.warning("test message")
4037

41-
cache_info = logger_provider._get_logger_cached.cache_info()
42-
self.assertEqual(1, cache_info.currsize)
43-
self.assertEqual(1, cache_info.misses)
38+
self.assertEqual(1, len(logger_provider._logger_cache))
4439

4540
# Ensure only one logger is cached
4641
rounds = 100
4742
for _ in range(rounds):
4843
logger.warning("test message")
4944

50-
cache_info = logger_provider._get_logger_cached.cache_info()
51-
self.assertEqual(1, cache_info.currsize)
52-
self.assertEqual(1, cache_info.misses)
45+
self.assertEqual(1, len(logger_provider._logger_cache))
5346

5447
def test_get_logger_multiple_loggers(self):
5548
handler, logger_provider = set_up_logging_handler(level=logging.DEBUG)
5649

57-
cache_info = logger_provider._get_logger_cached.cache_clear()
58-
5950
num_loggers = 10
6051
loggers = [create_logger(handler, str(i)) for i in range(num_loggers)]
6152

6253
# Ensure loggers are lazily cached
63-
cache_info = logger_provider._get_logger_cached.cache_info()
64-
self.assertEqual(0, cache_info.currsize)
54+
self.assertEqual(0, len(logger_provider._logger_cache))
6555

6656
for logger in loggers:
6757
logger.warning("test message")
6858

69-
cache_info = logger_provider._get_logger_cached.cache_info()
70-
self.assertEqual(num_loggers, cache_info.currsize)
71-
self.assertEqual(num_loggers, cache_info.misses)
59+
self.assertEqual(num_loggers, len(logger_provider._logger_cache))
7260

7361
rounds = 100
7462
for _ in range(rounds):
7563
for logger in loggers:
7664
logger.warning("test message")
7765

78-
cache_info = logger_provider._get_logger_cached.cache_info()
79-
self.assertEqual(num_loggers, cache_info.currsize)
80-
self.assertEqual(num_loggers, cache_info.misses)
66+
self.assertEqual(num_loggers, len(logger_provider._logger_cache))

0 commit comments

Comments
 (0)