Skip to content

Commit 4e47ffe

Browse files
Call to _auto_instrument_frameworks
1 parent 2cbf97b commit 4e47ffe

1 file changed

Lines changed: 53 additions & 0 deletions

File tree

src/sap_cloud_sdk/core/telemetry/auto_instrument.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
159212
def _merge_resource_attrs_into_active_provider_if_wrapper_installed(
160213
sap_attrs: dict,
161214
) -> None:

0 commit comments

Comments
 (0)