@@ -203,9 +203,9 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A
203203from opentelemetry .instrumentation .fastapi .package import _instruments
204204from opentelemetry .instrumentation .fastapi .version import __version__
205205from opentelemetry .instrumentation .instrumentor import BaseInstrumentor
206- from opentelemetry .metrics import get_meter
206+ from opentelemetry .metrics import Meter , get_meter
207207from opentelemetry .semconv .trace import SpanAttributes
208- from opentelemetry .trace import get_tracer
208+ from opentelemetry .trace import Tracer , get_tracer
209209from opentelemetry .util .http import (
210210 get_excluded_urls ,
211211 parse_excluded_urls ,
@@ -230,9 +230,9 @@ def instrument_app(
230230 server_request_hook : ServerRequestHook = None ,
231231 client_request_hook : ClientRequestHook = None ,
232232 client_response_hook : ClientResponseHook = None ,
233- tracer_provider = None ,
234- meter_provider = None ,
235- excluded_urls = None ,
233+ tracer_provider : Tracer | None = None ,
234+ meter_provider : Meter | None = None ,
235+ excluded_urls : str | None = None ,
236236 http_capture_headers_server_request : list [str ] | None = None ,
237237 http_capture_headers_server_response : list [str ] | None = None ,
238238 http_capture_headers_sanitize_fields : list [str ] | None = None ,
@@ -290,9 +290,9 @@ def instrument_app(
290290 # to faithfully record what is returned to the client since it technically cannot know what `ServerErrorMiddleware` is going to do.
291291
292292 def build_middleware_stack (self : Starlette ) -> ASGIApp :
293- stack = type (self ).build_middleware_stack (self )
294- stack = OpenTelemetryMiddleware (
295- stack ,
293+ app = type (self ).build_middleware_stack (self )
294+ app = OpenTelemetryMiddleware (
295+ app ,
296296 excluded_urls = excluded_urls ,
297297 default_span_details = _get_default_span_details ,
298298 server_request_hook = server_request_hook ,
@@ -310,8 +310,9 @@ def build_middleware_stack(self: Starlette) -> ASGIApp:
310310 # are handled.
311311 # This should not happen unless there is a bug in OpenTelemetryMiddleware, but if there is we don't want that
312312 # to impact the user's application just because we wrapped the middlewares in this order.
313- stack = ServerErrorMiddleware (stack )
314- return stack
313+ app = ServerErrorMiddleware (app )
314+ return app
315+
315316
316317 app ._original_build_middleware_stack = app .build_middleware_stack
317318 app .build_middleware_stack = types .MethodType (
@@ -385,43 +386,29 @@ class _InstrumentedFastAPI(fastapi.FastAPI):
385386 _server_request_hook : ServerRequestHook = None
386387 _client_request_hook : ClientRequestHook = None
387388 _client_response_hook : ClientResponseHook = None
389+ _http_capture_headers_server_request : list [str ] | None = None
390+ _http_capture_headers_server_response : list [str ] | None = None
391+ _http_capture_headers_sanitize_fields : list [str ] | None = None
392+ _exclude_spans : list [Literal ["receive" , "send" ]] | None = None
393+
388394 _instrumented_fastapi_apps = set ()
389395 _sem_conv_opt_in_mode = _HTTPStabilityMode .DEFAULT
390396
391397 def __init__ (self , * args , ** kwargs ):
392398 super ().__init__ (* args , ** kwargs )
393- tracer = get_tracer (
394- __name__ ,
395- __version__ ,
396- _InstrumentedFastAPI ._tracer_provider ,
397- schema_url = _get_schema_url (
398- _InstrumentedFastAPI ._sem_conv_opt_in_mode
399- ),
400- )
401- meter = get_meter (
402- __name__ ,
403- __version__ ,
404- _InstrumentedFastAPI ._meter_provider ,
405- schema_url = _get_schema_url (
406- _InstrumentedFastAPI ._sem_conv_opt_in_mode
407- ),
408- )
409- self .add_middleware (
410- OpenTelemetryMiddleware ,
411- excluded_urls = _InstrumentedFastAPI ._excluded_urls ,
412- default_span_details = _get_default_span_details ,
413- server_request_hook = _InstrumentedFastAPI ._server_request_hook ,
414- client_request_hook = _InstrumentedFastAPI ._client_request_hook ,
415- client_response_hook = _InstrumentedFastAPI ._client_response_hook ,
416- # Pass in tracer/meter to get __name__and __version__ of fastapi instrumentation
417- tracer = tracer ,
418- meter = meter ,
419- http_capture_headers_server_request = _InstrumentedFastAPI ._http_capture_headers_server_request ,
420- http_capture_headers_server_response = _InstrumentedFastAPI ._http_capture_headers_server_response ,
421- http_capture_headers_sanitize_fields = _InstrumentedFastAPI ._http_capture_headers_sanitize_fields ,
422- exclude_spans = _InstrumentedFastAPI ._exclude_spans ,
399+ FastAPIInstrumentor .instrument_app (
400+ self ,
401+ server_request_hook = self ._server_request_hook ,
402+ client_request_hook = self ._client_request_hook ,
403+ client_response_hook = self ._client_response_hook ,
404+ tracer_provider = self ._tracer_provider ,
405+ meter_provider = self ._meter_provider ,
406+ excluded_urls = self ._excluded_urls ,
407+ http_capture_headers_server_request = self ._http_capture_headers_server_request ,
408+ http_capture_headers_server_response = self ._http_capture_headers_server_response ,
409+ http_capture_headers_sanitize_fields = self ._http_capture_headers_sanitize_fields ,
410+ exclude_spans = self ._exclude_spans ,
423411 )
424- self ._is_instrumented_by_opentelemetry = True
425412 _InstrumentedFastAPI ._instrumented_fastapi_apps .add (self )
426413
427414 def __del__ (self ):
0 commit comments