Skip to content

Commit 47e037a

Browse files
authored
distro: handle opentelemetry-instrumentation-logging LoggingHandler as the sdk one (#552)
* distro: handle opentelemetry-instrumentation-logging LoggingHandler as the sdk one With recent releases the opentelemetry-instrumentation-logging LoggingHandler is used if installed and so we need to consider that as well when deciding to propagate. * Please pyright
1 parent 037fa16 commit 47e037a

4 files changed

Lines changed: 62 additions & 7 deletions

File tree

dev-requirements.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#
77
build==1.4.4
88
# via pip-tools
9-
certifi==2026.4.22
9+
certifi==2026.5.20
1010
# via requests
1111
charset-normalizer==3.4.7
1212
# via requests
@@ -38,6 +38,7 @@ opentelemetry-api==1.41.1
3838
# opentelemetry-exporter-otlp-proto-grpc
3939
# opentelemetry-exporter-otlp-proto-http
4040
# opentelemetry-instrumentation
41+
# opentelemetry-instrumentation-logging
4142
# opentelemetry-instrumentation-system-metrics
4243
# opentelemetry-opamp-client
4344
# opentelemetry-resourcedetector-gcp
@@ -57,7 +58,10 @@ opentelemetry-exporter-otlp-proto-http==1.41.1
5758
opentelemetry-instrumentation==0.62b1
5859
# via
5960
# elastic-opentelemetry (pyproject.toml)
61+
# opentelemetry-instrumentation-logging
6062
# opentelemetry-instrumentation-system-metrics
63+
opentelemetry-instrumentation-logging==0.62b1
64+
# via elastic-opentelemetry (pyproject.toml)
6165
opentelemetry-instrumentation-system-metrics==0.62b1
6266
# via elastic-opentelemetry (pyproject.toml)
6367
opentelemetry-opamp-client==0.2b0
@@ -146,7 +150,7 @@ uuid-utils==0.15.0
146150
# opentelemetry-opamp-client
147151
wheel==0.47.0
148152
# via pip-tools
149-
wrapt==2.1.2
153+
wrapt==2.2.0
150154
# via opentelemetry-instrumentation
151155
zipp==3.23.1
152156
# via importlib-metadata

pyproject.toml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,14 @@ dependencies = [
4343
]
4444

4545
[project.optional-dependencies]
46-
dev = ["pytest", "pip-tools", "oteltest==0.24.0", "leb128", "pytest-vcr ; python_version > '3.9'"]
46+
dev = [
47+
"pytest",
48+
"pip-tools",
49+
"oteltest==0.24.0",
50+
"leb128",
51+
"pytest-vcr ; python_version > '3.9'",
52+
"opentelemetry-instrumentation-logging",
53+
]
4754

4855
[project.entry-points.opentelemetry_configurator]
4956
configurator = "elasticotel.distro:ElasticOpenTelemetryConfigurator"

src/elasticotel/distro/config.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,16 @@
3434
OpAMPRemoteConfigParseException,
3535
)
3636
from opentelemetry._opamp.proto import opamp_pb2 as opamp_pb2
37-
from opentelemetry.sdk._logs import LoggingHandler
37+
38+
try:
39+
from opentelemetry.instrumentation.logging.handler import LoggingHandler # type: ignore[reportAssignmentType]
40+
except ImportError:
41+
42+
class LoggingHandler:
43+
pass
44+
45+
46+
from opentelemetry.sdk._logs import LoggingHandler as SDKLoggingHandler
3847
from opentelemetry.sdk.environment_variables import OTEL_LOG_LEVEL, OTEL_TRACES_SAMPLER_ARG
3948
from opentelemetry.sdk.trace import _TracerConfig
4049
from opentelemetry.sdk.util._configurator import ConfiguratorRulesT
@@ -129,7 +138,16 @@ def _setup_logging(self):
129138
_logger.addHandler(handler)
130139
# We need to propagate if we have the OTel handler otherwise we don't see logs shipped, in the other
131140
# cases we shouldn't
132-
_logger.propagate = any(isinstance(_handler, LoggingHandler) for _handler in logging.root.handlers)
141+
_logger.propagate = any(
142+
isinstance(
143+
_handler,
144+
(
145+
LoggingHandler,
146+
SDKLoggingHandler,
147+
),
148+
)
149+
for _handler in logging.root.handlers
150+
)
133151

134152
# do validation, we only validate logging_level because sampling_rate is handled by the sdk already
135153
logging_level = _LOG_LEVELS_MAP.get(self.logging_level.value)

tests/distro/test_distro.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import json
1818
import logging
1919
import os
20-
from unittest import TestCase, mock
20+
from unittest import TestCase, mock, skipIf
2121

2222
from elasticotel.distro import ElasticOpenTelemetryConfigurator, ElasticOpenTelemetryDistro, logger as distro_logger
2323
from elasticotel.distro.config import EDOTOpAMPCallbacks, logger as config_logger, Config
@@ -40,7 +40,12 @@
4040
OTEL_METRICS_EXPORTER,
4141
OTEL_TRACES_EXPORTER,
4242
)
43-
from opentelemetry.sdk._logs import LoggingHandler
43+
44+
try:
45+
from opentelemetry.instrumentation.logging.handler import LoggingHandler
46+
except ImportError:
47+
LoggingHandler = None
48+
from opentelemetry.sdk._logs import LoggingHandler as SDKLoggingHandler
4449
from opentelemetry.sdk.environment_variables import (
4550
OTEL_EXPERIMENTAL_RESOURCE_DETECTORS,
4651
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE,
@@ -459,6 +464,27 @@ def test_logging_setup_add_handlers_only_once(self):
459464
_logger.removeHandler(_logger.handlers[0])
460465

461466
def test_logging_setup_set_propagate_true_if_sdk_logging_handler_found(self):
467+
root_logger = logging.getLogger()
468+
handler = SDKLoggingHandler(logger_provider=mock.Mock())
469+
root_logger.addHandler(handler)
470+
471+
config = Config()
472+
473+
config._setup_logging()
474+
475+
for _logger in config._get_loggers():
476+
with self.subTest(logger=_logger):
477+
self.assertEqual(len(_logger.handlers), 1)
478+
self.assertTrue(_logger.propagate)
479+
480+
# cleanup
481+
_logger.removeHandler(_logger.handlers[0])
482+
_logger.propagate = True
483+
484+
root_logger.removeHandler(handler)
485+
486+
@skipIf(LoggingHandler is None, "opentelemetry-instrumentation-logging not installed")
487+
def test_logging_setup_set_propagate_true_if_logging_instrumentation_handler_found(self):
462488
root_logger = logging.getLogger()
463489
handler = LoggingHandler(logger_provider=mock.Mock())
464490
root_logger.addHandler(handler)

0 commit comments

Comments
 (0)