@@ -87,6 +87,8 @@ def auto_instrument(
8787 if middlewares :
8888 _register_middleware_processors (middlewares )
8989
90+ _auto_instrument_frameworks (middlewares )
91+
9092 logger .info ("Cloud auto instrumentation initialized successfully" )
9193
9294
@@ -156,6 +158,57 @@ def _register_middleware_processors(middlewares: list[TelemetryMiddleware]) -> N
156158 )
157159
158160
161+ def _auto_instrument_frameworks (
162+ middlewares : list [TelemetryMiddleware ] | None = None ,
163+ ) -> None :
164+ from sap_cloud_sdk .core .telemetry .middleware .registry import get_available
165+ from sap_cloud_sdk .core .telemetry .middleware .span_processor import (
166+ MiddlewareSpanProcessor ,
167+ )
168+
169+ provider = trace .get_tracer_provider ()
170+ if not isinstance (provider , TracerProvider ):
171+ logger .warning (
172+ "Unknown TracerProvider type. Skipping framework auto-instrumentation"
173+ )
174+ return
175+
176+ manual_keys = {m .framework_key for m in (middlewares or []) if m .framework_key }
177+
178+ instrumentors = [
179+ i for i in get_available ()
180+ if not i .__class__ ._processor_registered
181+ and i .framework_key not in manual_keys
182+ ]
183+
184+ if not instrumentors :
185+ return
186+
187+ skipped = [
188+ i for i in get_available ()
189+ if i .framework_key in manual_keys
190+ ]
191+ for i in skipped :
192+ logger .warning (
193+ "%s skipped: framework '%s' is already covered by an explicit middlewares= entry. "
194+ "Remove the explicit middleware or do not pass it to avoid duplicate IAS span attributes." ,
195+ type (i ).__name__ ,
196+ i .framework_key ,
197+ )
198+
199+ for instr in instrumentors :
200+ instr .instrument ()
201+
202+ provider .add_span_processor (MiddlewareSpanProcessor (instrumentors ))
203+ for instr in instrumentors :
204+ instr .__class__ ._processor_registered = True
205+ logger .info (
206+ "Auto-instrumented %d framework(s): %s" ,
207+ len (instrumentors ),
208+ ", " .join (type (i ).__name__ for i in instrumentors ),
209+ )
210+
211+
159212def _merge_resource_attrs_into_active_provider_if_wrapper_installed (
160213 sap_attrs : dict ,
161214) -> None :
0 commit comments