diff --git a/packages/traceloop-sdk/tests/test_sdk_initialization.py b/packages/traceloop-sdk/tests/test_sdk_initialization.py index 18ef5d7d0f..53c7c90c29 100644 --- a/packages/traceloop-sdk/tests/test_sdk_initialization.py +++ b/packages/traceloop-sdk/tests/test_sdk_initialization.py @@ -358,3 +358,25 @@ def probe(): del TracerWrapper.instance if saved_instance is not None: TracerWrapper.instance = saved_instance + + +def test_tracing_disabled_via_env_var_is_silent_noop( + isolated_tracer_wrapper, monkeypatch, capsys +): + """When tracing is disabled via TRACELOOP_TRACING_ENABLED=false, init() must + mark the tracer disabled so @workflow becomes a silent no-op rather than + warning that Traceloop was never initialized (issue #4191).""" + monkeypatch.setenv("TRACELOOP_TRACING_ENABLED", "false") + try: + Traceloop.init(app_name="test") + assert TracerWrapper.verify_initialized() is False + + @workflow(name="w") + def f(): + return 42 + + capsys.readouterr() # discard init() output + assert f() == 42 + assert "Traceloop not initialized" not in capsys.readouterr().out + finally: + TracerWrapper.set_disabled(False) diff --git a/packages/traceloop-sdk/traceloop/sdk/__init__.py b/packages/traceloop-sdk/traceloop/sdk/__init__.py index 6663429d99..c5776bafd6 100644 --- a/packages/traceloop-sdk/traceloop/sdk/__init__.py +++ b/packages/traceloop-sdk/traceloop/sdk/__init__.py @@ -122,6 +122,10 @@ def init( Traceloop.__app_name = app_name if not is_tracing_enabled(): + # Mirror the `enabled=False` path: mark the tracer disabled so the + # @workflow/@task decorators become silent no-ops instead of warning + # that Traceloop was never initialized. + TracerWrapper.set_disabled(True) print(Fore.YELLOW + "Tracing is disabled" + Fore.RESET) return