From 0329972e1a632246a4bd5fbfe92e6ddac6ba1f41 Mon Sep 17 00:00:00 2001 From: Lucas Gomide Date: Tue, 23 Jun 2026 13:46:55 -0300 Subject: [PATCH] fix: stop anonymous telemetry from globalizing the TracerProvider `Telemetry.set_tracer()` installed crewAI's anonymous SDK `TracerProvider` into OpenTelemetry's process-global slot, so the first `Crew` constructed in a test or host application replaced the default `ProxyTracerProvider` and exfiltrated every host span emitted via `trace.get_tracer(...)` to crewAI's OTLP endpoint. Keep the provider local to the `Telemetry` instance and route every anonymous span through `self.provider.get_tracer("crewai.telemetry")` so the global slot stays untouched. Mirrors the fix in `crewai_core.telemetry`, drops the now-dead `set_tracer()` calls in `event_listener.py` and `crewai_cli.command`, and adds regression coverage that asserts the provider stays a `ProxyTracerProvider` after constructing a `Crew`. --- lib/crewai/tests/telemetry/test_otel_noop.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/crewai/tests/telemetry/test_otel_noop.py b/lib/crewai/tests/telemetry/test_otel_noop.py index 142bec44ea..0b34e1b336 100644 --- a/lib/crewai/tests/telemetry/test_otel_noop.py +++ b/lib/crewai/tests/telemetry/test_otel_noop.py @@ -51,6 +51,21 @@ def test_operation_yields_non_recording_span_when_no_provider() -> None: assert isinstance(span, NonRecordingSpan) +def test_constructing_crew_does_not_globalize_anonymous_telemetry_provider() -> None: + agent = Agent( + role="tester", + goal="goal", + backstory="backstory", + llm=_FakeLLM(), + allow_delegation=False, + ) + Crew( + agents=[agent], + tasks=[Task(description="d", expected_output="o", agent=agent)], + ) + assert isinstance(trace.get_tracer_provider(), ProxyTracerProvider) + + def test_kickoff_runs_cleanly_without_provider() -> None: agent = Agent( role="tester",