Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 42d7a65

Browse files
xrmxlzchen
authored andcommitted
opentelemetry-sdk: avoid recursion error with sdk disabled (open-telemetry#4259)
* opentelemetry-sdk: avoid recursion error with sdk disabled If the sdk is disable and our handler is added to the root logger we will recurse in order to log that SDK is disabled. Use the warnings facilities to print the message instead. * Add changelog
1 parent d3b5876 commit 42d7a65

File tree

4 files changed

+30
-5
lines changed

4 files changed

+30
-5
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
- Fix metrics export with exemplar and no context and filtering observable instruments
1111
([#4251](https://github.com/open-telemetry/opentelemetry-python/pull/4251))
12+
- Fix recursion error with sdk disabled and handler added to root logger
13+
([#4259](https://github.com/open-telemetry/opentelemetry-python/pull/4259))
1214

1315
## Version 1.28.0/0.49b0 (2024-11-05)
1416

opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ def get_logger(
692692
attributes: Optional[Attributes] = None,
693693
) -> Logger:
694694
if self._disabled:
695-
_logger.warning("SDK is disabled.")
695+
warnings.warn("SDK is disabled.")
696696
return NoOpLogger(
697697
name,
698698
version=version,

opentelemetry-sdk/tests/logs/test_handler.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14+
1415
import logging
16+
import os
1517
import unittest
16-
from unittest.mock import Mock
18+
import warnings
19+
from unittest.mock import Mock, patch
1720

1821
from opentelemetry._logs import NoOpLoggerProvider, SeverityNumber
1922
from opentelemetry._logs import get_logger as APIGetLogger
@@ -280,12 +283,27 @@ def test_log_body_is_always_string_with_formatter(self):
280283
log_record = processor.get_log_record(0)
281284
self.assertIsInstance(log_record.body, str)
282285

286+
@patch.dict(os.environ, {"OTEL_SDK_DISABLED": "true"})
287+
def test_handler_root_logger_with_disabled_sdk_does_not_go_into_recursion_error(
288+
self,
289+
):
290+
processor, logger = set_up_test_logging(
291+
logging.NOTSET, root_logger=True
292+
)
293+
with warnings.catch_warnings(record=True) as cw:
294+
logger.warning("hello")
295+
296+
self.assertEqual(len(cw), 1)
297+
self.assertEqual("SDK is disabled.", str(cw[0].message))
298+
299+
self.assertEqual(processor.emit_count(), 0)
300+
283301

284-
def set_up_test_logging(level, formatter=None):
302+
def set_up_test_logging(level, formatter=None, root_logger=False):
285303
logger_provider = LoggerProvider()
286304
processor = FakeProcessor()
287305
logger_provider.add_log_record_processor(processor)
288-
logger = logging.getLogger("foo")
306+
logger = logging.getLogger(None if root_logger else "foo")
289307
handler = LoggingHandler(level=level, logger_provider=logger_provider)
290308
if formatter:
291309
handler.setFormatter(formatter)

opentelemetry-sdk/tests/logs/test_logs.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
# pylint: disable=protected-access
1616

1717
import unittest
18+
import warnings
1819
from unittest.mock import Mock, patch
1920

2021
from opentelemetry.sdk._logs import LoggerProvider
@@ -69,8 +70,12 @@ def test_get_logger(self):
6970

7071
@patch.dict("os.environ", {OTEL_SDK_DISABLED: "true"})
7172
def test_get_logger_with_sdk_disabled(self):
72-
logger = LoggerProvider().get_logger(Mock())
73+
with warnings.catch_warnings(record=True) as cw:
74+
logger = LoggerProvider().get_logger(Mock())
75+
7376
self.assertIsInstance(logger, NoOpLogger)
77+
self.assertEqual(len(cw), 1)
78+
self.assertEqual("SDK is disabled.", str(cw[0].message))
7479

7580
@patch.object(Resource, "create")
7681
def test_logger_provider_init(self, resource_patch):

0 commit comments

Comments
 (0)