Skip to content

Commit d2ff25f

Browse files
committed
feat(otel): add deprecation shim for litestar.contrib.opentelemetry
Re-introduce litestar/contrib/opentelemetry/ as a __getattr__ shim re-exporting from litestar.plugins.opentelemetry with per-attribute DeprecationWarning. Preserves the migration path for users coming from 2.x; the shim itself will be stripped before 3.0 GA. Mirrors the existing v2 prometheus shim pattern (PR #3755 sqlalchemy). Covers top-level and submodule imports (config, middleware, plugin) so that legacy import paths continue to resolve to the same plugin objects. Tests: 5 new deprecation tests in tests/unit/test_contrib/test_opentelemetry.py; existing 18 OTEL plugin tests still pass.
1 parent 0375635 commit d2ff25f

5 files changed

Lines changed: 210 additions & 0 deletions

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# ruff: noqa: TC004, F401
2+
from typing import TYPE_CHECKING
3+
4+
from litestar.utils import warn_deprecation
5+
6+
__all__ = (
7+
"OpenTelemetryConfig",
8+
"OpenTelemetryInstrumentationMiddleware",
9+
"OpenTelemetryPlugin",
10+
)
11+
12+
13+
def __getattr__(attr_name: str) -> object:
14+
if attr_name in __all__:
15+
from litestar.plugins.opentelemetry import (
16+
OpenTelemetryConfig,
17+
OpenTelemetryInstrumentationMiddleware,
18+
OpenTelemetryPlugin,
19+
)
20+
21+
warn_deprecation(
22+
deprecated_name=f"litestar.contrib.opentelemetry.{attr_name}",
23+
version="3.0.0b0",
24+
kind="import",
25+
removal_in="3.0.0",
26+
info=f"importing {attr_name} from 'litestar.contrib.opentelemetry' is deprecated, please "
27+
f"import it from 'litestar.plugins.opentelemetry' instead",
28+
)
29+
value = globals()[attr_name] = locals()[attr_name]
30+
return value
31+
32+
raise AttributeError(f"module {__name__!r} has no attribute {attr_name!r}") # pragma: no cover
33+
34+
35+
if TYPE_CHECKING:
36+
from litestar.plugins.opentelemetry import (
37+
OpenTelemetryConfig,
38+
OpenTelemetryInstrumentationMiddleware,
39+
OpenTelemetryPlugin,
40+
)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# ruff: noqa: TC004, F401
2+
from typing import TYPE_CHECKING
3+
4+
from litestar.utils import warn_deprecation
5+
6+
__all__ = ("OpenTelemetryConfig",)
7+
8+
9+
def __getattr__(attr_name: str) -> object:
10+
if attr_name in __all__:
11+
from litestar.plugins.opentelemetry import OpenTelemetryConfig
12+
13+
warn_deprecation(
14+
deprecated_name=f"litestar.contrib.opentelemetry.config.{attr_name}",
15+
version="3.0.0b0",
16+
kind="import",
17+
removal_in="3.0.0",
18+
info=f"importing {attr_name} from 'litestar.contrib.opentelemetry.config' is deprecated, please "
19+
f"import it from 'litestar.plugins.opentelemetry' instead",
20+
)
21+
value = globals()[attr_name] = locals()[attr_name]
22+
return value
23+
24+
raise AttributeError(f"module {__name__!r} has no attribute {attr_name!r}") # pragma: no cover
25+
26+
27+
if TYPE_CHECKING:
28+
from litestar.plugins.opentelemetry import OpenTelemetryConfig
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# ruff: noqa: TC004, F401
2+
from typing import TYPE_CHECKING
3+
4+
from litestar.utils import warn_deprecation
5+
6+
__all__ = ("OpenTelemetryInstrumentationMiddleware",)
7+
8+
9+
def __getattr__(attr_name: str) -> object:
10+
if attr_name in __all__:
11+
from litestar.plugins.opentelemetry import OpenTelemetryInstrumentationMiddleware
12+
13+
warn_deprecation(
14+
deprecated_name=f"litestar.contrib.opentelemetry.middleware.{attr_name}",
15+
version="3.0.0b0",
16+
kind="import",
17+
removal_in="3.0.0",
18+
info=f"importing {attr_name} from 'litestar.contrib.opentelemetry.middleware' is deprecated, please "
19+
f"import it from 'litestar.plugins.opentelemetry' instead",
20+
)
21+
value = globals()[attr_name] = locals()[attr_name]
22+
return value
23+
24+
raise AttributeError(f"module {__name__!r} has no attribute {attr_name!r}") # pragma: no cover
25+
26+
27+
if TYPE_CHECKING:
28+
from litestar.plugins.opentelemetry import OpenTelemetryInstrumentationMiddleware
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# ruff: noqa: TC004, F401
2+
from typing import TYPE_CHECKING
3+
4+
from litestar.utils import warn_deprecation
5+
6+
__all__ = ("OpenTelemetryPlugin",)
7+
8+
9+
def __getattr__(attr_name: str) -> object:
10+
if attr_name in __all__:
11+
from litestar.plugins.opentelemetry import OpenTelemetryPlugin
12+
13+
warn_deprecation(
14+
deprecated_name=f"litestar.contrib.opentelemetry.plugin.{attr_name}",
15+
version="3.0.0b0",
16+
kind="import",
17+
removal_in="3.0.0",
18+
info=f"importing {attr_name} from 'litestar.contrib.opentelemetry.plugin' is deprecated, please "
19+
f"import it from 'litestar.plugins.opentelemetry' instead",
20+
)
21+
value = globals()[attr_name] = locals()[attr_name]
22+
return value
23+
24+
raise AttributeError(f"module {__name__!r} has no attribute {attr_name!r}") # pragma: no cover
25+
26+
27+
if TYPE_CHECKING:
28+
from litestar.plugins.opentelemetry import OpenTelemetryPlugin
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# ruff: noqa: TC004, F401
2+
import importlib
3+
import sys
4+
from importlib.util import cache_from_source
5+
from pathlib import Path
6+
from typing import Union
7+
8+
import pytest
9+
10+
11+
def purge_module(module_names: "list[str]", path: "Union[str, Path]") -> None:
12+
for name in module_names:
13+
if name in sys.modules:
14+
del sys.modules[name]
15+
Path(cache_from_source(str(path))).unlink(missing_ok=True)
16+
17+
18+
def test_deprecated_opentelemetry_imports() -> None:
19+
purge_module(["litestar.contrib.opentelemetry"], __file__)
20+
with pytest.warns(
21+
DeprecationWarning,
22+
match="importing OpenTelemetryConfig from 'litestar.contrib.opentelemetry' is deprecated",
23+
):
24+
from litestar.contrib.opentelemetry import OpenTelemetryConfig
25+
26+
purge_module(["litestar.contrib.opentelemetry"], __file__)
27+
with pytest.warns(
28+
DeprecationWarning,
29+
match="importing OpenTelemetryInstrumentationMiddleware from 'litestar.contrib.opentelemetry' is deprecated",
30+
):
31+
from litestar.contrib.opentelemetry import OpenTelemetryInstrumentationMiddleware
32+
33+
purge_module(["litestar.contrib.opentelemetry"], __file__)
34+
with pytest.warns(
35+
DeprecationWarning,
36+
match="importing OpenTelemetryPlugin from 'litestar.contrib.opentelemetry' is deprecated",
37+
):
38+
from litestar.contrib.opentelemetry import OpenTelemetryPlugin
39+
40+
41+
def test_deprecated_opentelemetry_config_imports() -> None:
42+
purge_module(["litestar.contrib.opentelemetry.config"], __file__)
43+
with pytest.warns(
44+
DeprecationWarning,
45+
match="importing OpenTelemetryConfig from 'litestar.contrib.opentelemetry.config' is deprecated",
46+
):
47+
from litestar.contrib.opentelemetry.config import OpenTelemetryConfig
48+
49+
50+
def test_deprecated_opentelemetry_middleware_imports() -> None:
51+
purge_module(["litestar.contrib.opentelemetry.middleware"], __file__)
52+
with pytest.warns(
53+
DeprecationWarning,
54+
match="importing OpenTelemetryInstrumentationMiddleware from 'litestar.contrib.opentelemetry.middleware' is deprecated",
55+
):
56+
from litestar.contrib.opentelemetry.middleware import OpenTelemetryInstrumentationMiddleware
57+
58+
59+
def test_deprecated_opentelemetry_plugin_imports() -> None:
60+
purge_module(["litestar.contrib.opentelemetry.plugin"], __file__)
61+
with pytest.warns(
62+
DeprecationWarning,
63+
match="importing OpenTelemetryPlugin from 'litestar.contrib.opentelemetry.plugin' is deprecated",
64+
):
65+
from litestar.contrib.opentelemetry.plugin import OpenTelemetryPlugin
66+
67+
68+
def test_contrib_imports_resolve_to_plugin_objects() -> None:
69+
"""Sanity check: deprecated symbols are the same object as the plugin location."""
70+
purge_module(["litestar.contrib.opentelemetry"], __file__)
71+
with pytest.warns(DeprecationWarning):
72+
from litestar.contrib.opentelemetry import (
73+
OpenTelemetryConfig as ContribConfig,
74+
OpenTelemetryInstrumentationMiddleware as ContribMiddleware,
75+
OpenTelemetryPlugin as ContribPlugin,
76+
)
77+
78+
from litestar.plugins.opentelemetry import (
79+
OpenTelemetryConfig,
80+
OpenTelemetryInstrumentationMiddleware,
81+
OpenTelemetryPlugin,
82+
)
83+
84+
assert ContribConfig is OpenTelemetryConfig
85+
assert ContribMiddleware is OpenTelemetryInstrumentationMiddleware
86+
assert ContribPlugin is OpenTelemetryPlugin

0 commit comments

Comments
 (0)