From 12f799e176703a5fe89f4794591ca41b83720aef Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Fri, 2 Oct 2026 20:58:36 -0400 Subject: [PATCH 1/3] opentelemetry-api: stabilize logs API and deprecate old import paths --- docs/api/_logs.rst | 14 --- docs/api/_logs.severity.rst | 4 - docs/api/index.rst | 2 +- docs/api/logs.rst | 14 +++ docs/api/logs.severity.rst | 4 + docs/examples/logs/example.py | 2 +- .../metrics/sdk-metrics/sdk_metrics.py | 6 +- .../multi-destination-exporting/README.rst | 2 +- .../multi_destination_logs.py | 2 +- .../benchmarks/test_benchmark_log_encoder.py | 2 +- .../tests/__init__.py | 2 +- .../tests/test_log_encoder.py | 2 +- .../tests/test_proto_json_compatibility.py | 2 +- .../tests/test_log_exporter.py | 2 +- .../tests/test_log_exporter.py | 2 +- .../tests/test_log_encoder.py | 2 +- .../tests/logs/test_otlp_logs_exporter.py | 2 +- .../tests/test_proto_log_exporter.py | 2 +- opentelemetry-api/pyproject.toml | 3 + .../src/opentelemetry/_logs/__init__.py | 42 +++---- .../environment_variables/__init__.py | 4 +- .../src/opentelemetry/logs/__init__.py | 47 ++++++++ .../{_logs => logs}/_internal/__init__.py | 10 +- .../src/opentelemetry/logs/py.typed | 0 .../{_logs => logs}/severity/__init__.py | 0 .../tests/logs/test_deprecated_logs_module.py | 106 ++++++++++++++++++ .../tests/logs/test_log_record.py | 4 +- .../tests/logs/test_logger_provider.py | 8 +- opentelemetry-api/tests/logs/test_proxy.py | 40 +++---- .../configuration/_logger_provider.py | 2 +- .../tests/test_logger_provider.py | 2 +- .../benchmarks/logs/test_benchmark_logs.py | 2 +- .../sdk/_configuration/__init__.py | 2 +- .../sdk/_logs/_internal/__init__.py | 12 +- .../sdk/_logs/_internal/_exceptions.py | 2 +- .../logger_provider_resource_after_fork.py | 2 +- opentelemetry-sdk/tests/logs/test_export.py | 2 +- opentelemetry-sdk/tests/logs/test_handler.py | 4 +- .../tests/logs/test_log_record.py | 2 +- opentelemetry-sdk/tests/logs/test_logs.py | 2 +- .../tests/logs/test_multi_log_processor.py | 2 +- .../shared_internal/test_batch_processor.py | 2 +- .../otlpexporter/test_otlp_logs_functional.py | 2 +- .../src/opentelemetry/test/globals_test.py | 2 +- .../tests/test_otlp_test_server.py | 2 +- 45 files changed, 268 insertions(+), 108 deletions(-) delete mode 100644 docs/api/_logs.rst delete mode 100644 docs/api/_logs.severity.rst create mode 100644 docs/api/logs.rst create mode 100644 docs/api/logs.severity.rst create mode 100644 opentelemetry-api/src/opentelemetry/logs/__init__.py rename opentelemetry-api/src/opentelemetry/{_logs => logs}/_internal/__init__.py (98%) create mode 100644 opentelemetry-api/src/opentelemetry/logs/py.typed rename opentelemetry-api/src/opentelemetry/{_logs => logs}/severity/__init__.py (100%) create mode 100644 opentelemetry-api/tests/logs/test_deprecated_logs_module.py diff --git a/docs/api/_logs.rst b/docs/api/_logs.rst deleted file mode 100644 index 85ae72dc0d4..00000000000 --- a/docs/api/_logs.rst +++ /dev/null @@ -1,14 +0,0 @@ -opentelemetry._logs package -============================= - -Submodules ----------- - -.. toctree:: - - _logs.severity - -Module contents ---------------- - -.. automodule:: opentelemetry._logs diff --git a/docs/api/_logs.severity.rst b/docs/api/_logs.severity.rst deleted file mode 100644 index 4e31e70cf88..00000000000 --- a/docs/api/_logs.severity.rst +++ /dev/null @@ -1,4 +0,0 @@ -opentelemetry._logs.severity -============================ - -.. automodule:: opentelemetry._logs.severity \ No newline at end of file diff --git a/docs/api/index.rst b/docs/api/index.rst index 13a6cb1e9c8..a57e7216ccf 100644 --- a/docs/api/index.rst +++ b/docs/api/index.rst @@ -14,10 +14,10 @@ For the concrete implementation of these interfaces, see the .. toctree:: :maxdepth: 1 - _logs attributes baggage context + logs propagate propagators trace diff --git a/docs/api/logs.rst b/docs/api/logs.rst new file mode 100644 index 00000000000..1a5dcb39bd0 --- /dev/null +++ b/docs/api/logs.rst @@ -0,0 +1,14 @@ +opentelemetry.logs package +========================== + +Submodules +---------- + +.. toctree:: + + logs.severity + +Module contents +--------------- + +.. automodule:: opentelemetry.logs diff --git a/docs/api/logs.severity.rst b/docs/api/logs.severity.rst new file mode 100644 index 00000000000..c2f89104294 --- /dev/null +++ b/docs/api/logs.severity.rst @@ -0,0 +1,4 @@ +opentelemetry.logs.severity +=========================== + +.. automodule:: opentelemetry.logs.severity diff --git a/docs/examples/logs/example.py b/docs/examples/logs/example.py index 069107be7c8..8024018dd1d 100644 --- a/docs/examples/logs/example.py +++ b/docs/examples/logs/example.py @@ -4,13 +4,13 @@ import logging from opentelemetry import trace -from opentelemetry._logs import set_logger_provider from opentelemetry.exporter.otlp.proto.grpc._log_exporter import ( OTLPLogExporter, ) # this is available in the opentelemetry-instrumentation-logging package from opentelemetry.instrumentation.logging.handler import LoggingHandler +from opentelemetry.logs import set_logger_provider from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import BatchLogRecordProcessor from opentelemetry.sdk.resources import Resource diff --git a/docs/examples/metrics/sdk-metrics/sdk_metrics.py b/docs/examples/metrics/sdk-metrics/sdk_metrics.py index 23a9c11d391..9c65fe19bea 100644 --- a/docs/examples/metrics/sdk-metrics/sdk_metrics.py +++ b/docs/examples/metrics/sdk-metrics/sdk_metrics.py @@ -4,7 +4,7 @@ import os import time -from opentelemetry import _logs, metrics, trace +from opentelemetry import logs, metrics, trace from opentelemetry.exporter.otlp.proto.http._log_exporter import ( OTLPLogExporter, ) @@ -60,10 +60,10 @@ meter_provider=meter_provider, ) ) -_logs.set_logger_provider(logger_provider) +logs.set_logger_provider(logger_provider) tracer = trace.get_tracer(__name__) -logger = _logs.get_logger(__name__) +logger = logs.get_logger(__name__) with tracer.start_as_current_span("example-span"): logger.emit(body="example log record") diff --git a/docs/examples/multi-destination-exporting/README.rst b/docs/examples/multi-destination-exporting/README.rst index e5b0720f926..0f23dc7dea8 100644 --- a/docs/examples/multi-destination-exporting/README.rst +++ b/docs/examples/multi-destination-exporting/README.rst @@ -62,6 +62,6 @@ Useful links - OpenTelemetry_ - :doc:`../../api/trace` - :doc:`../../api/metrics` -- :doc:`../../api/_logs` +- :doc:`../../api/logs` .. _OpenTelemetry: https://github.com/open-telemetry/opentelemetry-python/ diff --git a/docs/examples/multi-destination-exporting/multi_destination_logs.py b/docs/examples/multi-destination-exporting/multi_destination_logs.py index 708577e0754..6b7e4281b7f 100644 --- a/docs/examples/multi-destination-exporting/multi_destination_logs.py +++ b/docs/examples/multi-destination-exporting/multi_destination_logs.py @@ -9,7 +9,6 @@ import logging -from opentelemetry._logs import set_logger_provider from opentelemetry.exporter.otlp.proto.grpc._log_exporter import ( OTLPLogExporter as GrpcLogExporter, ) @@ -19,6 +18,7 @@ # this is available in the opentelemetry-instrumentation-logging package from opentelemetry.instrumentation.logging.handler import LoggingHandler +from opentelemetry.logs import set_logger_provider from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import ( BatchLogRecordProcessor, diff --git a/exporter/opentelemetry-exporter-otlp-json-common/benchmarks/test_benchmark_log_encoder.py b/exporter/opentelemetry-exporter-otlp-json-common/benchmarks/test_benchmark_log_encoder.py index 911277c0018..0343446f2b4 100644 --- a/exporter/opentelemetry-exporter-otlp-json-common/benchmarks/test_benchmark_log_encoder.py +++ b/exporter/opentelemetry-exporter-otlp-json-common/benchmarks/test_benchmark_log_encoder.py @@ -3,8 +3,8 @@ import pytest -from opentelemetry._logs import SeverityNumber from opentelemetry.exporter.otlp.json.common._log_encoder import encode_logs +from opentelemetry.logs import SeverityNumber from tests import TIME, make_log, make_log_context diff --git a/exporter/opentelemetry-exporter-otlp-json-common/tests/__init__.py b/exporter/opentelemetry-exporter-otlp-json-common/tests/__init__.py index b757d5e91c5..495eeb356f0 100644 --- a/exporter/opentelemetry-exporter-otlp-json-common/tests/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-json-common/tests/__init__.py @@ -4,7 +4,7 @@ import dataclasses import unittest -from opentelemetry._logs import LogRecord, SeverityNumber +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.sdk._logs import ReadableLogRecord from opentelemetry.sdk.metrics.export import ( AggregationTemporality, diff --git a/exporter/opentelemetry-exporter-otlp-json-common/tests/test_log_encoder.py b/exporter/opentelemetry-exporter-otlp-json-common/tests/test_log_encoder.py index 2ed56850077..20ba8612869 100644 --- a/exporter/opentelemetry-exporter-otlp-json-common/tests/test_log_encoder.py +++ b/exporter/opentelemetry-exporter-otlp-json-common/tests/test_log_encoder.py @@ -3,7 +3,6 @@ import unittest -from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.exporter.otlp.proto.common._internal import ( _encode_attributes, _encode_span_id, @@ -11,6 +10,7 @@ _encode_value, ) from opentelemetry.exporter.otlp.proto.common._log_encoder import encode_logs +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( ExportLogsServiceRequest, ) diff --git a/exporter/opentelemetry-exporter-otlp-json-common/tests/test_proto_json_compatibility.py b/exporter/opentelemetry-exporter-otlp-json-common/tests/test_proto_json_compatibility.py index 51f70d3ed2f..a44371f6e5f 100644 --- a/exporter/opentelemetry-exporter-otlp-json-common/tests/test_proto_json_compatibility.py +++ b/exporter/opentelemetry-exporter-otlp-json-common/tests/test_proto_json_compatibility.py @@ -17,7 +17,6 @@ from google.protobuf.json_format import MessageToDict, ParseDict -from opentelemetry._logs import SeverityNumber from opentelemetry.exporter.otlp.json.common._log_encoder import ( encode_logs as json_encode_logs, ) @@ -36,6 +35,7 @@ from opentelemetry.exporter.otlp.proto.common.trace_encoder import ( encode_spans as proto_encode_spans, ) +from opentelemetry.logs import SeverityNumber from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( ExportLogsServiceRequest as PB2ExportLogsServiceRequest, ) diff --git a/exporter/opentelemetry-exporter-otlp-json-file/tests/test_log_exporter.py b/exporter/opentelemetry-exporter-otlp-json-file/tests/test_log_exporter.py index b717a0aa593..0b22f0772ab 100644 --- a/exporter/opentelemetry-exporter-otlp-json-file/tests/test_log_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-json-file/tests/test_log_exporter.py @@ -10,12 +10,12 @@ import unittest from unittest.mock import Mock -from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.exporter.otlp.json.common._log_encoder import encode_logs from opentelemetry.exporter.otlp.json.file._internal import _format_line from opentelemetry.exporter.otlp.json.file._log_exporter import ( FileLogExporter, ) +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.proto_json.logs.v1.logs import LogsData from opentelemetry.sdk._logs import ( LoggerProvider, diff --git a/exporter/opentelemetry-exporter-otlp-json-http/tests/test_log_exporter.py b/exporter/opentelemetry-exporter-otlp-json-http/tests/test_log_exporter.py index 4edf03da108..274852c412a 100644 --- a/exporter/opentelemetry-exporter-otlp-json-http/tests/test_log_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-json-http/tests/test_log_exporter.py @@ -17,7 +17,6 @@ from mocket import Mocket, Mocketizer, mocketize from mocket.mocks.mockhttp import Entry, Response -from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.exporter.http.transport._urllib3 import ( Urllib3HTTPTransport, ) @@ -27,6 +26,7 @@ from opentelemetry.exporter.otlp.json.http._log_exporter import ( OTLPLogExporter, ) +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import ( InMemoryLogRecordExporter, diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py b/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py index 2ed56850077..20ba8612869 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py @@ -3,7 +3,6 @@ import unittest -from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.exporter.otlp.proto.common._internal import ( _encode_attributes, _encode_span_id, @@ -11,6 +10,7 @@ _encode_value, ) from opentelemetry.exporter.otlp.proto.common._log_encoder import encode_logs +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( ExportLogsServiceRequest, ) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py index 8b8954d6cb7..7f8ed99c6ea 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/logs/test_otlp_logs_exporter.py @@ -11,11 +11,11 @@ from google.protobuf.json_format import MessageToDict from grpc import ChannelCredentials, Compression -from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.exporter.otlp.proto.common._internal import _encode_value from opentelemetry.exporter.otlp.proto.grpc._log_exporter import ( OTLPLogExporter, ) +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( ExportLogsServiceRequest, ) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py index b6dfa260620..9492ae3a18d 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py @@ -16,7 +16,6 @@ from mocket import Mocket, Mocketizer, mocketize from mocket.mocks.mockhttp import Entry, Response -from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.exporter.http.transport._requests import ( RequestsHTTPTransport, ) @@ -36,6 +35,7 @@ OTLPLogExporter, ) from opentelemetry.exporter.otlp.proto.http.version import __version__ +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( ExportLogsServiceRequest, ) diff --git a/opentelemetry-api/pyproject.toml b/opentelemetry-api/pyproject.toml index e084b9e730d..40b0d414f46 100644 --- a/opentelemetry-api/pyproject.toml +++ b/opentelemetry-api/pyproject.toml @@ -37,6 +37,9 @@ contextvars_context = "opentelemetry.context.contextvars_context:ContextVarsRunt [project.entry-points.opentelemetry_environment_variables] api = "opentelemetry.environment_variables" +[project.entry-points.opentelemetry_logger_provider] +default_logger_provider = "opentelemetry.logs:NoOpLoggerProvider" + [project.entry-points.opentelemetry_meter_provider] default_meter_provider = "opentelemetry.metrics:NoOpMeterProvider" diff --git a/opentelemetry-api/src/opentelemetry/_logs/__init__.py b/opentelemetry-api/src/opentelemetry/_logs/__init__.py index cff2b8ca609..65f226af54d 100644 --- a/opentelemetry-api/src/opentelemetry/_logs/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_logs/__init__.py @@ -1,38 +1,40 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 """ -The OpenTelemetry logging API describes the classes used to generate logs and events. +Deprecated alias of :mod:`opentelemetry.logs`. -The :class:`.LoggerProvider` provides users access to the :class:`.Logger`. - -This module provides abstract (i.e. unimplemented) classes required for -logging, and a concrete no-op implementation :class:`.NoOpLogger` that allows applications -to use the API package alone without a supporting implementation. - -To get a logger, you need to provide the package name from which you are -calling the logging APIs to OpenTelemetry by calling `LoggerProvider.get_logger` -with the calling module name and the version of your package. - -The following code shows how to obtain a logger using the global :class:`.LoggerProvider`:: - - from opentelemetry._logs import get_logger - - logger = get_logger("example-logger") - -.. versionadded:: 1.15.0 +.. deprecated:: 1.46.0 + This module will be removed in a future release. Use + :mod:`opentelemetry.logs` instead. """ -from opentelemetry._logs._internal import ( +import sys +import warnings + +from opentelemetry.logs import ( Logger, LoggerProvider, LogRecord, NoOpLogger, NoOpLoggerProvider, + SeverityNumber, + _internal, get_logger, get_logger_provider, set_logger_provider, + severity, ) -from opentelemetry._logs.severity import SeverityNumber + +warnings.warn( + "The opentelemetry._logs module is deprecated since version 1.46.0 " + "and will be removed in a future release. " + "Use opentelemetry.logs instead.", + DeprecationWarning, + stacklevel=2, +) + +sys.modules[f"{__name__}._internal"] = _internal +sys.modules[f"{__name__}.severity"] = severity __all__ = [ "LogRecord", diff --git a/opentelemetry-api/src/opentelemetry/environment_variables/__init__.py b/opentelemetry-api/src/opentelemetry/environment_variables/__init__.py index b335c826380..9138196c499 100644 --- a/opentelemetry-api/src/opentelemetry/environment_variables/__init__.py +++ b/opentelemetry-api/src/opentelemetry/environment_variables/__init__.py @@ -66,7 +66,9 @@ .. envvar:: OTEL_PYTHON_METER_PROVIDER """ -_OTEL_PYTHON_LOGGER_PROVIDER = "OTEL_PYTHON_LOGGER_PROVIDER" +OTEL_PYTHON_LOGGER_PROVIDER = "OTEL_PYTHON_LOGGER_PROVIDER" """ .. envvar:: OTEL_PYTHON_LOGGER_PROVIDER """ + +_OTEL_PYTHON_LOGGER_PROVIDER = OTEL_PYTHON_LOGGER_PROVIDER diff --git a/opentelemetry-api/src/opentelemetry/logs/__init__.py b/opentelemetry-api/src/opentelemetry/logs/__init__.py new file mode 100644 index 00000000000..2dad1826dac --- /dev/null +++ b/opentelemetry-api/src/opentelemetry/logs/__init__.py @@ -0,0 +1,47 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 +""" +The OpenTelemetry logging API describes the classes used to generate logs and events. + +The :class:`.LoggerProvider` provides users access to the :class:`.Logger`. + +This module provides abstract (i.e. unimplemented) classes required for +logging, and a concrete no-op implementation :class:`.NoOpLogger` that allows applications +to use the API package alone without a supporting implementation. + +To get a logger, you need to provide the package name from which you are +calling the logging APIs to OpenTelemetry by calling `LoggerProvider.get_logger` +with the calling module name and the version of your package. + +The following code shows how to obtain a logger using the global :class:`.LoggerProvider`:: + + from opentelemetry.logs import get_logger + + logger = get_logger("example-logger") + +.. versionadded:: 1.15.0 +""" + +from opentelemetry.logs._internal import ( + Logger, + LoggerProvider, + LogRecord, + NoOpLogger, + NoOpLoggerProvider, + get_logger, + get_logger_provider, + set_logger_provider, +) +from opentelemetry.logs.severity import SeverityNumber + +__all__ = [ + "LogRecord", + "Logger", + "LoggerProvider", + "NoOpLogger", + "NoOpLoggerProvider", + "SeverityNumber", + "get_logger", + "get_logger_provider", + "set_logger_provider", +] diff --git a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py b/opentelemetry-api/src/opentelemetry/logs/_internal/__init__.py similarity index 98% rename from opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py rename to opentelemetry-api/src/opentelemetry/logs/_internal/__init__.py index 4c049f92e5e..7d5a02ea9be 100644 --- a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py +++ b/opentelemetry-api/src/opentelemetry/logs/_internal/__init__.py @@ -15,7 +15,7 @@ The following code shows how to obtain a logger using the global :class:`.LoggerProvider`:: - from opentelemetry._logs import get_logger + from opentelemetry.logs import get_logger logger = get_logger("example-logger") @@ -32,10 +32,10 @@ from typing_extensions import deprecated -from opentelemetry._logs.severity import SeverityNumber from opentelemetry.context import get_current from opentelemetry.context.context import Context -from opentelemetry.environment_variables import _OTEL_PYTHON_LOGGER_PROVIDER +from opentelemetry.environment_variables import OTEL_PYTHON_LOGGER_PROVIDER +from opentelemetry.logs.severity import SeverityNumber from opentelemetry.trace import get_current_span from opentelemetry.trace.span import TraceFlags from opentelemetry.util._once import Once @@ -428,11 +428,11 @@ def get_logger_provider() -> LoggerProvider: """Gets the current global :class:`~.LoggerProvider` object.""" global _LOGGER_PROVIDER # pylint: disable=global-variable-not-assigned if _LOGGER_PROVIDER is None: - if _OTEL_PYTHON_LOGGER_PROVIDER not in environ: + if OTEL_PYTHON_LOGGER_PROVIDER not in environ: return _PROXY_LOGGER_PROVIDER logger_provider: LoggerProvider = _load_provider( # type: ignore - _OTEL_PYTHON_LOGGER_PROVIDER, "logger_provider" + OTEL_PYTHON_LOGGER_PROVIDER, "logger_provider" ) _set_logger_provider(logger_provider, log=False) diff --git a/opentelemetry-api/src/opentelemetry/logs/py.typed b/opentelemetry-api/src/opentelemetry/logs/py.typed new file mode 100644 index 00000000000..e69de29bb2d diff --git a/opentelemetry-api/src/opentelemetry/_logs/severity/__init__.py b/opentelemetry-api/src/opentelemetry/logs/severity/__init__.py similarity index 100% rename from opentelemetry-api/src/opentelemetry/_logs/severity/__init__.py rename to opentelemetry-api/src/opentelemetry/logs/severity/__init__.py diff --git a/opentelemetry-api/tests/logs/test_deprecated_logs_module.py b/opentelemetry-api/tests/logs/test_deprecated_logs_module.py new file mode 100644 index 00000000000..de1de4dca3a --- /dev/null +++ b/opentelemetry-api/tests/logs/test_deprecated_logs_module.py @@ -0,0 +1,106 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 + +# pylint: disable=protected-access +from __future__ import annotations + +import importlib +import sys +import unittest +import warnings +from unittest.mock import Mock, patch + +import opentelemetry.logs +import opentelemetry.logs._internal +import opentelemetry.logs.severity + +_DEPRECATED_MODULES = ( + "opentelemetry._logs", + "opentelemetry._logs._internal", + "opentelemetry._logs.severity", +) + + +def _unload_deprecated_modules() -> None: + for name in _DEPRECATED_MODULES: + sys.modules.pop(name, None) + sys.modules["opentelemetry"].__dict__.pop("_logs", None) + + +class TestDeprecatedLogsModule(unittest.TestCase): + def setUp(self) -> None: + _unload_deprecated_modules() + + def test_import_emits_deprecation_warning(self) -> None: + for name in _DEPRECATED_MODULES: + with self.subTest(module=name): + _unload_deprecated_modules() + with self.assertWarns(DeprecationWarning) as context: + importlib.import_module(name) + message = str(context.warning) + self.assertIn("opentelemetry.logs", message) + self.assertIn("will be removed in a future release", message) + + def test_deprecation_warning_points_at_importer(self) -> None: + # pylint: disable=import-outside-toplevel,unused-import,redefined-outer-name,import-error + # Literal import statements are required here since importlib.import_module + # would attribute the warning to importlib itself. + with self.subTest(statement="import opentelemetry._logs"): + _unload_deprecated_modules() + with self.assertWarns(DeprecationWarning) as context: + import opentelemetry._logs # noqa: F401, PLC0415 + self.assertEqual(context.filename, __file__) + + with self.subTest(statement="from opentelemetry._logs import ..."): + _unload_deprecated_modules() + with self.assertWarns(DeprecationWarning) as context: + from opentelemetry._logs import get_logger # noqa: F401, PLC0415 + self.assertEqual(context.filename, __file__) + + with self.subTest(statement="from opentelemetry._logs.severity import ..."): + _unload_deprecated_modules() + with self.assertWarns(DeprecationWarning) as context: + from opentelemetry._logs.severity import ( # noqa: F401, PLC0415 + SeverityNumber, + ) + self.assertEqual(context.filename, __file__) + + def test_new_module_does_not_emit_deprecation_warning(self) -> None: + with warnings.catch_warnings(record=True) as caught: + warnings.simplefilter("always") + importlib.reload(opentelemetry.logs) + self.assertEqual( + [w for w in caught if issubclass(w.category, DeprecationWarning)], + [], + ) + self.assertNotIn("opentelemetry._logs", sys.modules) + + def test_reexports_are_identical(self) -> None: + with self.assertWarns(DeprecationWarning): + deprecated = importlib.import_module("opentelemetry._logs") + + self.assertEqual(deprecated.__all__, opentelemetry.logs.__all__) + for name in opentelemetry.logs.__all__: + with self.subTest(name=name): + self.assertIs(getattr(deprecated, name), getattr(opentelemetry.logs, name)) + + def test_submodules_are_aliased(self) -> None: + with self.assertWarns(DeprecationWarning): + importlib.import_module("opentelemetry._logs") + + self.assertIs( + importlib.import_module("opentelemetry._logs._internal"), + opentelemetry.logs._internal, + ) + self.assertIs( + importlib.import_module("opentelemetry._logs.severity"), + opentelemetry.logs.severity, + ) + + def test_patching_deprecated_path_patches_new_module(self) -> None: + with self.assertWarns(DeprecationWarning): + importlib.import_module("opentelemetry._logs") + + mock_load_provider = Mock() + with patch("opentelemetry._logs._internal._load_provider", mock_load_provider): + self.assertIs(opentelemetry.logs._internal._load_provider, mock_load_provider) diff --git a/opentelemetry-api/tests/logs/test_log_record.py b/opentelemetry-api/tests/logs/test_log_record.py index 2b6f893374c..e0fc5bc9718 100644 --- a/opentelemetry-api/tests/logs/test_log_record.py +++ b/opentelemetry-api/tests/logs/test_log_record.py @@ -4,13 +4,13 @@ import unittest from unittest.mock import patch -from opentelemetry._logs import LogRecord +from opentelemetry.logs import LogRecord OBSERVED_TIMESTAMP = "OBSERVED_TIMESTAMP" class TestLogRecord(unittest.TestCase): - @patch("opentelemetry._logs._internal.time_ns") + @patch("opentelemetry.logs._internal.time_ns") def test_log_record_observed_timestamp_default(self, time_ns_mock): # type: ignore time_ns_mock.return_value = OBSERVED_TIMESTAMP self.assertEqual(LogRecord().observed_timestamp, OBSERVED_TIMESTAMP) diff --git a/opentelemetry-api/tests/logs/test_logger_provider.py b/opentelemetry-api/tests/logs/test_logger_provider.py index b7de110ede5..f13954f7906 100644 --- a/opentelemetry-api/tests/logs/test_logger_provider.py +++ b/opentelemetry-api/tests/logs/test_logger_provider.py @@ -5,9 +5,9 @@ import unittest from unittest.mock import Mock, patch -import opentelemetry._logs._internal as logs_internal -from opentelemetry._logs import get_logger_provider, set_logger_provider +import opentelemetry.logs._internal as logs_internal from opentelemetry.environment_variables import _OTEL_PYTHON_LOGGER_PROVIDER +from opentelemetry.logs import get_logger_provider, set_logger_provider from opentelemetry.test.globals_test import reset_logging_globals @@ -41,10 +41,10 @@ def test_get_logger_provider(self): "os.environ", {_OTEL_PYTHON_LOGGER_PROVIDER: "test_logger_provider"}, ), - patch("opentelemetry._logs._internal._load_provider", Mock()), + patch("opentelemetry.logs._internal._load_provider", Mock()), ): with patch( - "opentelemetry._logs._internal.cast", + "opentelemetry.logs._internal.cast", Mock(return_value="test_logger_provider"), ): self.assertEqual(get_logger_provider(), "test_logger_provider") diff --git a/opentelemetry-api/tests/logs/test_proxy.py b/opentelemetry-api/tests/logs/test_proxy.py index fff99e04a83..8a749abc7ad 100644 --- a/opentelemetry-api/tests/logs/test_proxy.py +++ b/opentelemetry-api/tests/logs/test_proxy.py @@ -5,27 +5,27 @@ import unittest from unittest.mock import Mock -import opentelemetry._logs._internal as _logs_internal -from opentelemetry import _logs +import opentelemetry.logs._internal as logs_internal +from opentelemetry import logs from opentelemetry.test.globals_test import LoggingGlobalsTest from opentelemetry.util.types import Attributes -class TestProvider(_logs.NoOpLoggerProvider): +class TestProvider(logs.NoOpLoggerProvider): def get_logger( self, name: str, version: str | None = None, schema_url: str | None = None, attributes: Attributes = None, - ) -> _logs.Logger: + ) -> logs.Logger: return LoggerTest(name) -class LoggerTest(_logs.NoOpLogger): +class LoggerTest(logs.NoOpLogger): def emit( self, - record: _logs.LogRecord | None = None, + record: logs.LogRecord | None = None, *, timestamp=None, observed_timestamp=None, @@ -42,31 +42,31 @@ def emit( class TestProxy(LoggingGlobalsTest, unittest.TestCase): def test_proxy_logger(self): - provider = _logs.get_logger_provider() + provider = logs.get_logger_provider() # proxy provider - self.assertIsInstance(provider, _logs_internal.ProxyLoggerProvider) + self.assertIsInstance(provider, logs_internal.ProxyLoggerProvider) # provider returns proxy logger logger = provider.get_logger("proxy-test") - self.assertIsInstance(logger, _logs_internal.ProxyLogger) + self.assertIsInstance(logger, logs_internal.ProxyLogger) # set a real provider - _logs.set_logger_provider(TestProvider()) + logs.set_logger_provider(TestProvider()) # get_logger_provider() now returns the real provider - self.assertIsInstance(_logs.get_logger_provider(), TestProvider) + self.assertIsInstance(logs.get_logger_provider(), TestProvider) # logger provider now returns real instance - self.assertIsInstance(_logs.get_logger_provider().get_logger("fresh"), LoggerTest) + self.assertIsInstance(logs.get_logger_provider().get_logger("fresh"), LoggerTest) # references to the old provider still work but return real logger now real_logger = provider.get_logger("proxy-test") self.assertIsInstance(real_logger, LoggerTest) def test_proxy_logger_forwards_record_with_exception(self): - logger = _logs_internal.ProxyLogger("proxy-test") + logger = logs_internal.ProxyLogger("proxy-test") logger._real_logger = Mock(spec=LoggerTest("proxy-test")) - record = _logs.LogRecord(exception=ValueError("boom")) + record = logs.LogRecord(exception=ValueError("boom")) self.assertIsNotNone(logger._real_logger) logger.emit(record) @@ -74,25 +74,25 @@ def test_proxy_logger_forwards_record_with_exception(self): logger._real_logger.emit.assert_called_once_with(record) def test_proxy_logger_enabled_delegates_to_real_logger(self): - logger = _logs_internal.ProxyLogger("proxy-test") + logger = logs_internal.ProxyLogger("proxy-test") real_logger = Mock(spec=LoggerTest("proxy-test")) real_logger.enabled.return_value = True logger._real_logger = real_logger - result = logger.enabled(severity_number=_logs.SeverityNumber.INFO, event_name="test") + result = logger.enabled(severity_number=logs.SeverityNumber.INFO, event_name="test") self.assertTrue(result) real_logger.enabled.assert_called_once_with( context=None, - severity_number=_logs.SeverityNumber.INFO, + severity_number=logs.SeverityNumber.INFO, event_name="test", ) def test_proxy_logger_enabled_falls_back_to_noop(self): - logger = _logs_internal.ProxyLogger("proxy-test") + logger = logs_internal.ProxyLogger("proxy-test") self.assertFalse(logger.enabled()) def test_noop_logger_enabled_returns_false(self): - logger = _logs.NoOpLogger("noop-test") + logger = logs.NoOpLogger("noop-test") self.assertFalse(logger.enabled()) - self.assertFalse(logger.enabled(severity_number=_logs.SeverityNumber.ERROR, event_name="e")) + self.assertFalse(logger.enabled(severity_number=logs.SeverityNumber.ERROR, event_name="e")) diff --git a/opentelemetry-configuration/src/opentelemetry/configuration/_logger_provider.py b/opentelemetry-configuration/src/opentelemetry/configuration/_logger_provider.py index 7f43da40af3..58de32420c7 100644 --- a/opentelemetry-configuration/src/opentelemetry/configuration/_logger_provider.py +++ b/opentelemetry-configuration/src/opentelemetry/configuration/_logger_provider.py @@ -5,7 +5,6 @@ import logging -from opentelemetry._logs import set_logger_provider from opentelemetry.configuration._common import ( _map_compression, _parse_headers, @@ -52,6 +51,7 @@ from opentelemetry.configuration.models import ( SimpleLogRecordProcessor as SimpleLogRecordProcessorConfig, ) +from opentelemetry.logs import set_logger_provider from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs._internal import ( LogRecordLimits, diff --git a/opentelemetry-configuration/tests/test_logger_provider.py b/opentelemetry-configuration/tests/test_logger_provider.py index 098c9bc3fd2..2b6bf3e08e4 100644 --- a/opentelemetry-configuration/tests/test_logger_provider.py +++ b/opentelemetry-configuration/tests/test_logger_provider.py @@ -9,7 +9,6 @@ import unittest from unittest.mock import MagicMock, patch -from opentelemetry._logs import get_logger_provider from opentelemetry.configuration._logger_provider import ( _DEFAULT_EXPORT_TIMEOUT_MILLIS, _DEFAULT_MAX_EXPORT_BATCH_SIZE, @@ -64,6 +63,7 @@ from opentelemetry.configuration.models import ( SimpleLogRecordProcessor as SimpleLogRecordProcessorConfig, ) +from opentelemetry.logs import get_logger_provider from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs._internal.export import ( BatchLogRecordProcessor, diff --git a/opentelemetry-sdk/benchmarks/logs/test_benchmark_logs.py b/opentelemetry-sdk/benchmarks/logs/test_benchmark_logs.py index 94d08cc09e0..c38386d0bf8 100644 --- a/opentelemetry-sdk/benchmarks/logs/test_benchmark_logs.py +++ b/opentelemetry-sdk/benchmarks/logs/test_benchmark_logs.py @@ -3,7 +3,7 @@ import pytest -from opentelemetry._logs import SeverityNumber +from opentelemetry.logs import SeverityNumber from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import ( BatchLogRecordProcessor, diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index 2516e14146a..11dfc81413b 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -17,13 +17,13 @@ from os import environ from typing import Any, Literal, Protocol -from opentelemetry._logs import set_logger_provider from opentelemetry.environment_variables import ( OTEL_LOGS_EXPORTER, OTEL_METRICS_EXPORTER, OTEL_PYTHON_ID_GENERATOR, OTEL_TRACES_EXPORTER, ) +from opentelemetry.logs import set_logger_provider from opentelemetry.metrics import set_meter_provider from opentelemetry.sdk._logs import ( LoggerProvider, diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py index bc09fd1db0f..f4aca9c48e7 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py @@ -29,18 +29,18 @@ from typing_extensions import deprecated -from opentelemetry._logs import Logger as APILogger -from opentelemetry._logs import LoggerProvider as APILoggerProvider -from opentelemetry._logs import ( +from opentelemetry.attributes import BoundedAttributes +from opentelemetry.context import get_current +from opentelemetry.context.context import Context +from opentelemetry.logs import Logger as APILogger +from opentelemetry.logs import LoggerProvider as APILoggerProvider +from opentelemetry.logs import ( LogRecord, NoOpLogger, SeverityNumber, get_logger, get_logger_provider, ) -from opentelemetry.attributes import BoundedAttributes -from opentelemetry.context import get_current -from opentelemetry.context.context import Context from opentelemetry.metrics import MeterProvider, get_meter_provider from opentelemetry.sdk._logs._internal._exceptions import ( _copy_log_record_with_exception, diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_exceptions.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_exceptions.py index bd4a9538d00..784d1089d2b 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_exceptions.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_exceptions.py @@ -4,8 +4,8 @@ import traceback -from opentelemetry._logs import LogRecord from opentelemetry.attributes import BoundedAttributes +from opentelemetry.logs import LogRecord from opentelemetry.semconv.attributes import exception_attributes from opentelemetry.util.types import AnyValue, Attributes diff --git a/opentelemetry-sdk/tests/logs/scripts/logger_provider_resource_after_fork.py b/opentelemetry-sdk/tests/logs/scripts/logger_provider_resource_after_fork.py index 68cd4d80e2c..df227a37b9e 100644 --- a/opentelemetry-sdk/tests/logs/scripts/logger_provider_resource_after_fork.py +++ b/opentelemetry-sdk/tests/logs/scripts/logger_provider_resource_after_fork.py @@ -4,7 +4,7 @@ import json import os -from opentelemetry._logs import LogRecord +from opentelemetry.logs import LogRecord from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import ( InMemoryLogRecordExporter, diff --git a/opentelemetry-sdk/tests/logs/test_export.py b/opentelemetry-sdk/tests/logs/test_export.py index a3265772eff..42ca5418df2 100644 --- a/opentelemetry-sdk/tests/logs/test_export.py +++ b/opentelemetry-sdk/tests/logs/test_export.py @@ -17,7 +17,7 @@ from pytest import mark -from opentelemetry._logs import LogRecord, SeverityNumber +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.metrics import NoOpMeterProvider from opentelemetry.sdk import trace from opentelemetry.sdk._logs import ( diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index 1c706cbe3b1..b00f1690794 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -6,9 +6,9 @@ import unittest from unittest.mock import Mock, patch -from opentelemetry._logs import NoOpLoggerProvider, SeverityNumber -from opentelemetry._logs import get_logger as APIGetLogger from opentelemetry.attributes import BoundedAttributes +from opentelemetry.logs import NoOpLoggerProvider, SeverityNumber +from opentelemetry.logs import get_logger as APIGetLogger from opentelemetry.sdk import trace from opentelemetry.sdk._logs import ( LoggerProvider, diff --git a/opentelemetry-sdk/tests/logs/test_log_record.py b/opentelemetry-sdk/tests/logs/test_log_record.py index 78f24704b48..59d6d11e767 100644 --- a/opentelemetry-sdk/tests/logs/test_log_record.py +++ b/opentelemetry-sdk/tests/logs/test_log_record.py @@ -5,9 +5,9 @@ import unittest import warnings -from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.attributes import BoundedAttributes from opentelemetry.context import get_current +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.sdk._logs import ( LogRecordDroppedAttributesWarning, LogRecordLimits, diff --git a/opentelemetry-sdk/tests/logs/test_logs.py b/opentelemetry-sdk/tests/logs/test_logs.py index 38e38375a58..bd904ddfd36 100644 --- a/opentelemetry-sdk/tests/logs/test_logs.py +++ b/opentelemetry-sdk/tests/logs/test_logs.py @@ -11,9 +11,9 @@ from pathlib import Path from unittest.mock import Mock, patch -from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.attributes import BoundedAttributes from opentelemetry.context import get_current +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.sdk._logs import ( Logger, LoggerProvider, diff --git a/opentelemetry-sdk/tests/logs/test_multi_log_processor.py b/opentelemetry-sdk/tests/logs/test_multi_log_processor.py index e88854fc7c4..0160d3230fb 100644 --- a/opentelemetry-sdk/tests/logs/test_multi_log_processor.py +++ b/opentelemetry-sdk/tests/logs/test_multi_log_processor.py @@ -10,7 +10,7 @@ from abc import ABC, abstractmethod from unittest.mock import Mock -from opentelemetry._logs import LogRecord, SeverityNumber +from opentelemetry.logs import LogRecord, SeverityNumber from opentelemetry.sdk._logs._internal import ( ConcurrentMultiLogRecordProcessor, LoggerProvider, diff --git a/opentelemetry-sdk/tests/shared_internal/test_batch_processor.py b/opentelemetry-sdk/tests/shared_internal/test_batch_processor.py index 49186404350..a352a66a10d 100644 --- a/opentelemetry-sdk/tests/shared_internal/test_batch_processor.py +++ b/opentelemetry-sdk/tests/shared_internal/test_batch_processor.py @@ -17,7 +17,7 @@ import pytest -from opentelemetry._logs import ( +from opentelemetry.logs import ( LogRecord, ) from opentelemetry.sdk._logs import ( diff --git a/tests/opentelemetry-docker-tests/tests/otlpexporter/test_otlp_logs_functional.py b/tests/opentelemetry-docker-tests/tests/otlpexporter/test_otlp_logs_functional.py index c15f1fdf845..c4a4b086f56 100644 --- a/tests/opentelemetry-docker-tests/tests/otlpexporter/test_otlp_logs_functional.py +++ b/tests/opentelemetry-docker-tests/tests/otlpexporter/test_otlp_logs_functional.py @@ -10,7 +10,6 @@ from grpc import Compression as GRPCCompression from inline_snapshot import snapshot -from opentelemetry._logs import Logger, SeverityNumber from opentelemetry.exporter.http.transport._requests import ( RequestsHTTPTransport, ) @@ -35,6 +34,7 @@ from opentelemetry.exporter.otlp.proto.http._log_exporter import ( OTLPLogExporter as HTTPLogExporter, ) +from opentelemetry.logs import Logger, SeverityNumber from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import ( LogRecordExporter, diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/globals_test.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/globals_test.py index fc0bec3a1e7..fdfbbe04b3c 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/globals_test.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/globals_test.py @@ -4,7 +4,7 @@ import unittest from opentelemetry import trace as trace_api -from opentelemetry._logs import _internal as logging_api +from opentelemetry.logs import _internal as logging_api from opentelemetry.metrics import _internal as metrics_api from opentelemetry.metrics._internal import _ProxyMeterProvider from opentelemetry.util._once import Once diff --git a/tests/opentelemetry-test-utils/tests/test_otlp_test_server.py b/tests/opentelemetry-test-utils/tests/test_otlp_test_server.py index 4cccdbeda8f..b4a412e5d57 100644 --- a/tests/opentelemetry-test-utils/tests/test_otlp_test_server.py +++ b/tests/opentelemetry-test-utils/tests/test_otlp_test_server.py @@ -8,7 +8,7 @@ import requests -from opentelemetry._logs import SeverityNumber +from opentelemetry.logs import SeverityNumber from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs.export import SimpleLogRecordProcessor from opentelemetry.sdk.metrics import MeterProvider From f6329d17b4502f6e8a660f0363ec81767edf8cc4 Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Fri, 2 Oct 2026 21:56:56 -0400 Subject: [PATCH 2/3] fix typecheck errors --- opentelemetry-api/tests/logs/test_deprecated_logs_module.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/opentelemetry-api/tests/logs/test_deprecated_logs_module.py b/opentelemetry-api/tests/logs/test_deprecated_logs_module.py index de1de4dca3a..0484389d8d3 100644 --- a/opentelemetry-api/tests/logs/test_deprecated_logs_module.py +++ b/opentelemetry-api/tests/logs/test_deprecated_logs_module.py @@ -60,7 +60,8 @@ def test_deprecation_warning_points_at_importer(self) -> None: with self.subTest(statement="from opentelemetry._logs.severity import ..."): _unload_deprecated_modules() with self.assertWarns(DeprecationWarning) as context: - from opentelemetry._logs.severity import ( # noqa: F401, PLC0415 + # opentelemetry._logs.severity only exists as a sys.modules alias at runtime. + from opentelemetry._logs.severity import ( # noqa: F401, PLC0415 # pyright: ignore[reportMissingImports] SeverityNumber, ) self.assertEqual(context.filename, __file__) From c454e57e3b09f302a9339e551a35e49f2eb8dd62 Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Fri, 2 Oct 2026 23:07:33 -0400 Subject: [PATCH 3/3] add changelog fragments --- .changelog/5731.changed | 1 + .changelog/5731.deprecated | 1 + 2 files changed, 2 insertions(+) create mode 100644 .changelog/5731.changed create mode 100644 .changelog/5731.deprecated diff --git a/.changelog/5731.changed b/.changelog/5731.changed new file mode 100644 index 00000000000..43055159540 --- /dev/null +++ b/.changelog/5731.changed @@ -0,0 +1 @@ +`opentelemetry-api`: stabilize the logs API as `opentelemetry.logs` diff --git a/.changelog/5731.deprecated b/.changelog/5731.deprecated new file mode 100644 index 00000000000..7b1aa9c2d0b --- /dev/null +++ b/.changelog/5731.deprecated @@ -0,0 +1 @@ +`opentelemetry-api`: deprecate `opentelemetry._logs` in favor of `opentelemetry.logs`