8
8
from fastapi .testclient import TestClient as FastAPITestClient
9
9
from litestar .middleware .base import DefineMiddleware
10
10
from litestar .testing import TestClient as LitestarTestClient
11
+ from opentelemetry .instrumentation .dependencies import DependencyConflictError
11
12
12
13
from microbootstrap import OpentelemetryConfig
13
14
from microbootstrap .bootstrappers .fastapi import FastApiOpentelemetryInstrument
14
15
from microbootstrap .bootstrappers .litestar import LitestarOpentelemetryInstrument
16
+ from microbootstrap .instruments import opentelemetry_instrument
15
17
from microbootstrap .instruments .opentelemetry_instrument import OpentelemetryInstrument
16
18
17
19
18
20
def test_opentelemetry_is_ready (
19
21
minimal_opentelemetry_config : OpentelemetryConfig ,
20
22
) -> 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 ()
23
25
24
26
25
27
def test_opentelemetry_bootstrap_is_not_ready (minimal_opentelemetry_config : OpentelemetryConfig ) -> None :
26
28
minimal_opentelemetry_config .service_debug = False
27
29
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 ()
30
32
31
33
32
34
def test_opentelemetry_bootstrap_after (
33
35
default_litestar_app : litestar .Litestar ,
34
36
minimal_opentelemetry_config : OpentelemetryConfig ,
35
37
) -> 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
38
40
39
41
40
42
def test_opentelemetry_teardown (
41
43
minimal_opentelemetry_config : OpentelemetryConfig ,
42
44
) -> 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]
45
47
46
48
47
49
def test_litestar_opentelemetry_bootstrap (
48
50
minimal_opentelemetry_config : OpentelemetryConfig ,
49
51
magic_mock : MagicMock ,
50
52
) -> None :
51
53
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 )
53
55
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 ()
56
58
57
59
assert opentelemetry_bootstrap_result
58
60
assert "middleware" in opentelemetry_bootstrap_result
@@ -66,18 +68,18 @@ def test_litestar_opentelemetry_teardown(
66
68
magic_mock : MagicMock ,
67
69
) -> None :
68
70
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 )
70
72
71
- opentelemetry_instrument .teardown ()
73
+ test_opentelemetry_instrument .teardown ()
72
74
73
75
74
76
def test_litestar_opentelemetry_bootstrap_working (
75
77
minimal_opentelemetry_config : OpentelemetryConfig ,
76
78
async_mock : AsyncMock ,
77
79
) -> 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 ()
81
83
82
84
opentelemetry_middleware = opentelemetry_bootstrap_result ["middleware" ][0 ]
83
85
assert isinstance (opentelemetry_middleware , DefineMiddleware )
@@ -104,9 +106,9 @@ def test_fastapi_opentelemetry_bootstrap_working(
104
106
) -> None :
105
107
monkeypatch .setattr ("opentelemetry.sdk.trace.TracerProvider.shutdown" , Mock ())
106
108
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 ())
110
112
111
113
@fastapi_application .get ("/test-handler" )
112
114
async def test_handler () -> None :
@@ -115,3 +117,52 @@ async def test_handler() -> None:
115
117
with patch ("opentelemetry.trace.use_span" ) as mock_capture_event :
116
118
FastAPITestClient (app = fastapi_application ).get ("/test-handler" )
117
119
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