diff --git a/src/instana/tracer.py b/src/instana/tracer.py index 83ea05ec..9a07d9c3 100644 --- a/src/instana/tracer.py +++ b/src/instana/tracer.py @@ -30,6 +30,7 @@ from instana.propagators.text_propagator import TextPropagator from instana.recorder import StanRecorder from instana.sampling import InstanaSampler, Sampler +from instana.singletons import agent from instana.span.kind import EXIT_SPANS from instana.span.span import InstanaSpan, get_current_span from instana.span_context import SpanContext @@ -179,6 +180,10 @@ def _add_stack(self, span: InstanaSpan, limit: Optional[int] = 30) -> None: Adds a backtrace to . The default length limit for stack traces is 30 frames. A hard limit of 40 frames is enforced. """ + # Skip stack trace collection if it's disabled + if agent.options.is_span_disabled(category="stack"): + return + try: sanitized_stack = [] if limit > 40: diff --git a/src/instana/util/config.py b/src/instana/util/config.py index 6cc1e109..772e2dea 100644 --- a/src/instana/util/config.py +++ b/src/instana/util/config.py @@ -14,6 +14,7 @@ "databases", "messaging", "protocols", # http, grpc, etc. + "stack", # stack trace collection ] # Mapping of span type calls (framework, library name, instrumentation name) to categories diff --git a/tests/test_span_disabling.py b/tests/test_span_disabling.py index e1e1cbf5..d2c5c17d 100644 --- a/tests/test_span_disabling.py +++ b/tests/test_span_disabling.py @@ -19,6 +19,7 @@ def test_is_span_disabled_default(self): options = BaseOptions() assert not options.is_span_disabled(category="logging") assert not options.is_span_disabled(category="databases") + assert not options.is_span_disabled(category="stack") assert not options.is_span_disabled(span_type="redis") def test_disable_category(self): @@ -55,6 +56,7 @@ def test_env_var_disable_all(self, value, monkeypatch): assert options.is_span_disabled(category="databases") is True assert options.is_span_disabled(category="messaging") is True assert options.is_span_disabled(category="protocols") is True + assert options.is_span_disabled(category="stack") is True def test_env_var_disable_specific(self, monkeypatch): monkeypatch.setenv("INSTANA_TRACING_DISABLE", "logging, redis") @@ -75,5 +77,17 @@ def test_yaml_config(self): assert options.is_span_disabled(span_type="mysql") assert not options.is_span_disabled(span_type="redis") + def test_disable_stack_category(self): + options = BaseOptions() + options.disabled_spans = ["stack"] + assert options.is_span_disabled(category="stack") + assert not options.is_span_disabled(category="logging") + + def test_env_var_disable_stack(self, monkeypatch): + monkeypatch.setenv("INSTANA_TRACING_DISABLE", "stack") + options = BaseOptions() + assert options.is_span_disabled(category="stack") is True + assert options.is_span_disabled(category="logging") is False + # Made with Bob diff --git a/tests/test_tracer.py b/tests/test_tracer.py index 79991d8d..74be17f7 100644 --- a/tests/test_tracer.py +++ b/tests/test_tracer.py @@ -185,6 +185,25 @@ def test_tracer_add_stack_high_limit( assert "m" in stack_0.keys() +def test_tracer_add_stack_disabled( + span: InstanaSpan, tracer_provider: InstanaTracerProvider, mocker +) -> None: + tracer = InstanaTracer( + tracer_provider.sampler, + tracer_provider._span_processor, + tracer_provider._exporter, + tracer_provider._propagators, + ) + + # Mock agent.options.is_span_disabled to return True for "stack" category + mocker.patch("instana.singletons.agent.options.is_span_disabled", return_value=True) + + tracer._add_stack(span, 30) + + # Verify that no stack trace was added to the span + assert span.stack is None + + def test_tracer_add_stack_low_limit( span: InstanaSpan, tracer_provider: InstanaTracerProvider ) -> None: