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
12
+ from opentelemetry .instrumentation .environment_variables import OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
11
13
12
14
from microbootstrap import OpentelemetryConfig
13
15
from microbootstrap .bootstrappers .fastapi import FastApiOpentelemetryInstrument
14
16
from microbootstrap .bootstrappers .litestar import LitestarOpentelemetryInstrument
17
+ from microbootstrap .instruments import opentelemetry_instrument
15
18
from microbootstrap .instruments .opentelemetry_instrument import OpentelemetryInstrument
16
19
17
20
18
21
def test_opentelemetry_is_ready (
19
22
minimal_opentelemetry_config : OpentelemetryConfig ,
20
23
) -> None :
21
- opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
22
- assert opentelemetry_instrument .is_ready ()
24
+ test_opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
25
+ assert test_opentelemetry_instrument .is_ready ()
23
26
24
27
25
28
def test_opentelemetry_bootstrap_is_not_ready (minimal_opentelemetry_config : OpentelemetryConfig ) -> None :
26
29
minimal_opentelemetry_config .service_debug = False
27
30
minimal_opentelemetry_config .opentelemetry_endpoint = None
28
- opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
29
- assert not opentelemetry_instrument .is_ready ()
31
+ test_opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
32
+ assert not test_opentelemetry_instrument .is_ready ()
30
33
31
34
32
35
def test_opentelemetry_bootstrap_after (
33
36
default_litestar_app : litestar .Litestar ,
34
37
minimal_opentelemetry_config : OpentelemetryConfig ,
35
38
) -> None :
36
- opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
37
- assert opentelemetry_instrument .bootstrap_after (default_litestar_app ) == default_litestar_app
39
+ test_opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
40
+ assert test_opentelemetry_instrument .bootstrap_after (default_litestar_app ) == default_litestar_app
38
41
39
42
40
43
def test_opentelemetry_teardown (
41
44
minimal_opentelemetry_config : OpentelemetryConfig ,
42
45
) -> None :
43
- opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
44
- assert opentelemetry_instrument .teardown () is None # type: ignore[func-returns-value]
46
+ test_opentelemetry_instrument : typing .Final = OpentelemetryInstrument (minimal_opentelemetry_config )
47
+ assert test_opentelemetry_instrument .teardown () is None # type: ignore[func-returns-value]
45
48
46
49
47
50
def test_litestar_opentelemetry_bootstrap (
48
51
minimal_opentelemetry_config : OpentelemetryConfig ,
49
52
magic_mock : MagicMock ,
50
53
) -> None :
51
54
minimal_opentelemetry_config .opentelemetry_instrumentors = [magic_mock ]
52
- opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
55
+ test_opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
53
56
54
- opentelemetry_instrument .bootstrap ()
55
- opentelemetry_bootstrap_result : typing .Final = opentelemetry_instrument .bootstrap_before ()
57
+ test_opentelemetry_instrument .bootstrap ()
58
+ opentelemetry_bootstrap_result : typing .Final = test_opentelemetry_instrument .bootstrap_before ()
56
59
57
60
assert opentelemetry_bootstrap_result
58
61
assert "middleware" in opentelemetry_bootstrap_result
@@ -66,18 +69,18 @@ def test_litestar_opentelemetry_teardown(
66
69
magic_mock : MagicMock ,
67
70
) -> None :
68
71
minimal_opentelemetry_config .opentelemetry_instrumentors = [magic_mock ]
69
- opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
72
+ test_opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
70
73
71
- opentelemetry_instrument .teardown ()
74
+ test_opentelemetry_instrument .teardown ()
72
75
73
76
74
77
def test_litestar_opentelemetry_bootstrap_working (
75
78
minimal_opentelemetry_config : OpentelemetryConfig ,
76
79
async_mock : AsyncMock ,
77
80
) -> None :
78
- opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
79
- opentelemetry_instrument .bootstrap ()
80
- opentelemetry_bootstrap_result : typing .Final = opentelemetry_instrument .bootstrap_before ()
81
+ test_opentelemetry_instrument : typing .Final = LitestarOpentelemetryInstrument (minimal_opentelemetry_config )
82
+ test_opentelemetry_instrument .bootstrap ()
83
+ opentelemetry_bootstrap_result : typing .Final = test_opentelemetry_instrument .bootstrap_before ()
81
84
82
85
opentelemetry_middleware = opentelemetry_bootstrap_result ["middleware" ][0 ]
83
86
assert isinstance (opentelemetry_middleware , DefineMiddleware )
@@ -104,9 +107,9 @@ def test_fastapi_opentelemetry_bootstrap_working(
104
107
) -> None :
105
108
monkeypatch .setattr ("opentelemetry.sdk.trace.TracerProvider.shutdown" , Mock ())
106
109
107
- opentelemetry_instrument : typing .Final = FastApiOpentelemetryInstrument (minimal_opentelemetry_config )
108
- opentelemetry_instrument .bootstrap ()
109
- fastapi_application : typing .Final = opentelemetry_instrument .bootstrap_after (fastapi .FastAPI ())
110
+ test_opentelemetry_instrument : typing .Final = FastApiOpentelemetryInstrument (minimal_opentelemetry_config )
111
+ test_opentelemetry_instrument .bootstrap ()
112
+ fastapi_application : typing .Final = test_opentelemetry_instrument .bootstrap_after (fastapi .FastAPI ())
110
113
111
114
@fastapi_application .get ("/test-handler" )
112
115
async def test_handler () -> None :
@@ -115,3 +118,47 @@ async def test_handler() -> None:
115
118
with patch ("opentelemetry.trace.use_span" ) as mock_capture_event :
116
119
FastAPITestClient (app = fastapi_application ).get ("/test-handler" )
117
120
assert mock_capture_event .called
121
+
122
+
123
+ @pytest .mark .parametrize (
124
+ ("instruments" , "result" ),
125
+ [
126
+ (
127
+ [
128
+ MagicMock (),
129
+ MagicMock (load = MagicMock (side_effect = ImportError )),
130
+ MagicMock (load = MagicMock (side_effect = DependencyConflictError ("Hello" ))),
131
+ MagicMock (load = MagicMock (side_effect = ModuleNotFoundError )),
132
+ ],
133
+ "ok" ,
134
+ ),
135
+ (
136
+ [
137
+ MagicMock (load = MagicMock (side_effect = ValueError )),
138
+ ],
139
+ "raise" ,
140
+ ),
141
+ (
142
+ [
143
+ MagicMock (load = MagicMock (side_effect = ValueError )),
144
+ ],
145
+ "exclude" ,
146
+ ),
147
+ ],
148
+ )
149
+ def test_instrumentator_loader (instruments : list [MagicMock ], result : str , monkeypatch : pytest .MonkeyPatch ) -> None :
150
+ if result == "exclude" :
151
+ monkeypatch .setenv (OTEL_PYTHON_DISABLED_INSTRUMENTATIONS , "exclude_this,exclude_that" )
152
+ instruments [0 ].name = "exclude_this"
153
+ monkeypatch .setattr (
154
+ opentelemetry_instrument ,
155
+ "entry_points" ,
156
+ MagicMock (return_value = [* instruments ]),
157
+ )
158
+
159
+ if result != "raise" :
160
+ opentelemetry_instrument ._load_instrumentors (MagicMock ()) # noqa: SLF001
161
+ return
162
+
163
+ with pytest .raises (ValueError ): # noqa: PT011
164
+ opentelemetry_instrument ._load_instrumentors (MagicMock ()) # noqa: SLF001
0 commit comments