Skip to content

Commit f3b9e6e

Browse files
authored
sdk: decouple logs sdk setup from OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED (#4340)
* sdk: decoule logs sdk setup from OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED Always setup the logs sdk, keep the handler for python logging module under OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED
1 parent 82279e4 commit f3b9e6e

File tree

4 files changed

+45
-14
lines changed

4 files changed

+45
-14
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
- Always setup logs sdk, OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED only controls python `logging` module handler setup
11+
([#4340](https://github.com/open-telemetry/opentelemetry-python/pull/4340))
1012
- Add `attributes` field in `metrics.get_meter` wrapper function
1113
([#4364](https://github.com/open-telemetry/opentelemetry-python/pull/4364))
1214
- Add Python 3.13 support

opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py

+11-9
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ def _init_metrics(
236236
def _init_logging(
237237
exporters: Dict[str, Type[LogExporter]],
238238
resource: Resource = None,
239+
setup_logging_handler: bool = True,
239240
):
240241
provider = LoggerProvider(resource=resource)
241242
set_logger_provider(provider)
@@ -246,13 +247,15 @@ def _init_logging(
246247
BatchLogRecordProcessor(exporter_class(**exporter_args))
247248
)
248249

249-
handler = LoggingHandler(level=logging.NOTSET, logger_provider=provider)
250-
251-
logging.getLogger().addHandler(handler)
252-
253250
event_logger_provider = EventLoggerProvider(logger_provider=provider)
254251
set_event_logger_provider(event_logger_provider)
255252

253+
if setup_logging_handler:
254+
handler = LoggingHandler(
255+
level=logging.NOTSET, logger_provider=provider
256+
)
257+
logging.getLogger().addHandler(handler)
258+
256259

257260
def _import_exporters(
258261
trace_exporter_names: Sequence[str],
@@ -364,7 +367,7 @@ def _initialize_components(
364367
sampler: Optional[Sampler] = None,
365368
resource_attributes: Optional[Attributes] = None,
366369
id_generator: IdGenerator = None,
367-
logging_enabled: Optional[bool] = None,
370+
setup_logging_handler: Optional[bool] = None,
368371
):
369372
if trace_exporter_names is None:
370373
trace_exporter_names = []
@@ -401,17 +404,16 @@ def _initialize_components(
401404
resource=resource,
402405
)
403406
_init_metrics(metric_exporters, resource)
404-
if logging_enabled is None:
405-
logging_enabled = (
407+
if setup_logging_handler is None:
408+
setup_logging_handler = (
406409
os.getenv(
407410
_OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, "false"
408411
)
409412
.strip()
410413
.lower()
411414
== "true"
412415
)
413-
if logging_enabled:
414-
_init_logging(log_exporters, resource)
416+
_init_logging(log_exporters, resource, setup_logging_handler)
415417

416418

417419
class _BaseConfigurator(ABC):

opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,7 @@
669669
.. envvar:: OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED
670670
671671
The :envvar:`OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED` environment variable allows users to
672-
enable/disable the logging SDK auto instrumentation.
672+
enable/disable the auto instrumentation for the python logging module.
673673
Default: False
674674
675675
Note: Logs SDK and its related settings are experimental.

opentelemetry-sdk/tests/test_configurator.py

+31-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from logging import WARNING, getLogger
1818
from os import environ
1919
from typing import Dict, Iterable, Optional, Sequence
20-
from unittest import TestCase
20+
from unittest import TestCase, mock
2121
from unittest.mock import Mock, patch
2222

2323
from pytest import raises
@@ -663,6 +663,32 @@ def test_logging_init_exporter(self):
663663
getLogger(__name__).error("hello")
664664
self.assertTrue(provider.processor.exporter.export_called)
665665

666+
@patch.dict(
667+
environ,
668+
{"OTEL_RESOURCE_ATTRIBUTES": "service.name=otlp-service"},
669+
)
670+
def test_logging_init_exporter_without_handler_setup(self):
671+
resource = Resource.create({})
672+
_init_logging(
673+
{"otlp": DummyOTLPLogExporter},
674+
resource=resource,
675+
setup_logging_handler=False,
676+
)
677+
self.assertEqual(self.set_provider_mock.call_count, 1)
678+
provider = self.set_provider_mock.call_args[0][0]
679+
self.assertIsInstance(provider, DummyLoggerProvider)
680+
self.assertIsInstance(provider.resource, Resource)
681+
self.assertEqual(
682+
provider.resource.attributes.get("service.name"),
683+
"otlp-service",
684+
)
685+
self.assertIsInstance(provider.processor, DummyLogRecordProcessor)
686+
self.assertIsInstance(
687+
provider.processor.exporter, DummyOTLPLogExporter
688+
)
689+
getLogger(__name__).error("hello")
690+
self.assertFalse(provider.processor.exporter.export_called)
691+
666692
@patch.dict(
667693
environ,
668694
{"OTEL_RESOURCE_ATTRIBUTES": "service.name=otlp-service"},
@@ -671,8 +697,8 @@ def test_logging_init_exporter(self):
671697
@patch("opentelemetry.sdk._configuration._init_logging")
672698
def test_logging_init_disable_default(self, logging_mock, tracing_mock):
673699
_initialize_components(auto_instrumentation_version="auto-version")
674-
self.assertEqual(logging_mock.call_count, 0)
675700
self.assertEqual(tracing_mock.call_count, 1)
701+
logging_mock.assert_called_once_with(mock.ANY, mock.ANY, False)
676702

677703
@patch.dict(
678704
environ,
@@ -686,7 +712,7 @@ def test_logging_init_disable_default(self, logging_mock, tracing_mock):
686712
def test_logging_init_enable_env(self, logging_mock, tracing_mock):
687713
with self.assertLogs(level=WARNING):
688714
_initialize_components(auto_instrumentation_version="auto-version")
689-
self.assertEqual(logging_mock.call_count, 1)
715+
logging_mock.assert_called_once_with(mock.ANY, mock.ANY, True)
690716
self.assertEqual(tracing_mock.call_count, 1)
691717

692718
@patch.dict(
@@ -768,7 +794,7 @@ def test_initialize_components_kwargs(
768794
"custom.key.2": "pass-in-value-2",
769795
},
770796
"id_generator": "TEST_GENERATOR",
771-
"logging_enabled": True,
797+
"setup_logging_handler": True,
772798
}
773799
_initialize_components(**kwargs)
774800

@@ -810,6 +836,7 @@ def test_initialize_components_kwargs(
810836
logging_mock.assert_called_once_with(
811837
"TEST_LOG_EXPORTERS_DICT",
812838
"TEST_RESOURCE",
839+
True,
813840
)
814841

815842

0 commit comments

Comments
 (0)