88from fastapi .testclient import TestClient as FastAPITestClient
99from litestar .middleware .base import DefineMiddleware
1010from litestar .testing import TestClient as LitestarTestClient
11+ from opentelemetry .instrumentation .dependencies import DependencyConflictError
1112
1213from microbootstrap import OpentelemetryConfig
1314from microbootstrap .bootstrappers .fastapi import FastApiOpentelemetryInstrument
1415from microbootstrap .bootstrappers .litestar import LitestarOpentelemetryInstrument
16+ from microbootstrap .instruments import opentelemetry_instrument
1517from microbootstrap .instruments .opentelemetry_instrument import OpentelemetryInstrument
1618
1719
1820def test_opentelemetry_is_ready (
1921 minimal_opentelemetry_config : OpentelemetryConfig ,
2022) -> None :
21- opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
22- assert opentelemetry_instrument .is_ready ()
23+ test_opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
24+ assert test_opentelemetry_instrument .is_ready ()
2325
2426
2527def test_opentelemetry_bootstrap_is_not_ready (minimal_opentelemetry_config : OpentelemetryConfig ) -> None :
2628 minimal_opentelemetry_config .service_debug = False
2729 minimal_opentelemetry_config .opentelemetry_endpoint = None
28- opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
29- assert not opentelemetry_instrument .is_ready ()
30+ test_opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
31+ assert not test_opentelemetry_instrument .is_ready ()
3032
3133
3234def test_opentelemetry_bootstrap_after (
3335 default_litestar_app : litestar .Litestar ,
3436 minimal_opentelemetry_config : OpentelemetryConfig ,
3537) -> None :
36- opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
37- assert opentelemetry_instrument .bootstrap_after (default_litestar_app ) == default_litestar_app
38+ test_opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
39+ assert test_opentelemetry_instrument .bootstrap_after (default_litestar_app ) == default_litestar_app
3840
3941
4042def test_opentelemetry_teardown (
4143 minimal_opentelemetry_config : OpentelemetryConfig ,
4244) -> None :
43- opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
44- assert opentelemetry_instrument .teardown () is None # type: ignore[func-returns-value]
45+ test_opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
46+ assert test_opentelemetry_instrument .teardown () is None # type: ignore[func-returns-value]
4547
4648
4749def test_litestar_opentelemetry_bootstrap (
4850 minimal_opentelemetry_config : OpentelemetryConfig ,
4951 magic_mock : MagicMock ,
5052) -> None :
5153 minimal_opentelemetry_config .opentelemetry_instrumentors = [magic_mock ]
52- opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
54+ test_opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
5355
54- opentelemetry_instrument .bootstrap ()
55- opentelemetry_bootstrap_result : typing .Final = opentelemetry_instrument .bootstrap_before ()
56+ test_opentelemetry_instrument .bootstrap ()
57+ opentelemetry_bootstrap_result : typing .Final = test_opentelemetry_instrument .bootstrap_before ()
5658
5759 assert opentelemetry_bootstrap_result
5860 assert "middleware" in opentelemetry_bootstrap_result
@@ -66,18 +68,18 @@ def test_litestar_opentelemetry_teardown(
6668 magic_mock : MagicMock ,
6769) -> None :
6870 minimal_opentelemetry_config .opentelemetry_instrumentors = [magic_mock ]
69- opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
71+ test_opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
7072
71- opentelemetry_instrument .teardown ()
73+ test_opentelemetry_instrument .teardown ()
7274
7375
7476def test_litestar_opentelemetry_bootstrap_working (
7577 minimal_opentelemetry_config : OpentelemetryConfig ,
7678 async_mock : AsyncMock ,
7779) -> None :
78- opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
79- opentelemetry_instrument .bootstrap ()
80- opentelemetry_bootstrap_result : typing .Final = opentelemetry_instrument .bootstrap_before ()
80+ test_opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
81+ test_opentelemetry_instrument .bootstrap ()
82+ opentelemetry_bootstrap_result : typing .Final = test_opentelemetry_instrument .bootstrap_before ()
8183
8284 opentelemetry_middleware = opentelemetry_bootstrap_result ["middleware" ][0 ]
8385 assert isinstance (opentelemetry_middleware , DefineMiddleware )
@@ -104,9 +106,9 @@ def test_fastapi_opentelemetry_bootstrap_working(
104106) -> None :
105107 monkeypatch .setattr ("opentelemetry.sdk.trace.TracerProvider.shutdown" , Mock ())
106108
107- opentelemetry_instrument : typing .Final = FastApiOpentelemetryInstrument (minimal_opentelemetry_config )
108- opentelemetry_instrument .bootstrap ()
109- fastapi_application : typing .Final = opentelemetry_instrument .bootstrap_after (fastapi .FastAPI ())
109+ test_opentelemetry_instrument : typing .Final = FastApiOpentelemetryInstrument (minimal_opentelemetry_config )
110+ test_opentelemetry_instrument .bootstrap ()
111+ fastapi_application : typing .Final = test_opentelemetry_instrument .bootstrap_after (fastapi .FastAPI ())
110112
111113 @fastapi_application .get ("/test-handler" )
112114 async def test_handler () -> None :
@@ -115,3 +117,52 @@ async def test_handler() -> None:
115117 with patch ("opentelemetry.trace.use_span" ) as mock_capture_event :
116118 FastAPITestClient (app = fastapi_application ).get ("/test-handler" )
117119 assert mock_capture_event .called
120+
121+
122+ @pytest .mark .parametrize (
123+ ("instruments" , "result" ),
124+ [
125+ (
126+ [
127+ MagicMock (),
128+ MagicMock (load = MagicMock (side_effect = ImportError )),
129+ MagicMock (load = MagicMock (side_effect = DependencyConflictError ("Hello" ))),
130+ MagicMock (load = MagicMock (side_effect = ModuleNotFoundError )),
131+ ],
132+ "ok" ,
133+ ),
134+ (
135+ [
136+ MagicMock (load = MagicMock (side_effect = ValueError )),
137+ ],
138+ "raise" ,
139+ ),
140+ (
141+ [
142+ MagicMock (load = MagicMock (side_effect = ValueError )),
143+ ],
144+ "exclude" ,
145+ ),
146+ ],
147+ )
148+ def test_instrumentors_loader (
149+ minimal_opentelemetry_config : OpentelemetryConfig ,
150+ instruments : list [MagicMock ],
151+ result : str ,
152+ monkeypatch : pytest .MonkeyPatch ,
153+ ) -> None :
154+ if result == "exclude" :
155+ minimal_opentelemetry_config .opentelemetry_disabled_instrumentations = ["exclude_this" , "exclude_that" ]
156+ instruments [0 ].name = "exclude_this"
157+ monkeypatch .setattr (
158+ opentelemetry_instrument ,
159+ "entry_points" ,
160+ MagicMock (return_value = [* instruments ]),
161+ )
162+
163+ if result != "raise" :
164+ opentelemetry_instrument .OpentelemetryInstrument (instrument_config = minimal_opentelemetry_config ).bootstrap ()
165+ return
166+
167+ with pytest .raises (ValueError ): # noqa: PT011
168+ opentelemetry_instrument .OpentelemetryInstrument (instrument_config = minimal_opentelemetry_config ).bootstrap ()
0 commit comments