diff --git a/src/datadog/trace_segment.cpp b/src/datadog/trace_segment.cpp index c2eb639b..555f648c 100644 --- a/src/datadog/trace_segment.cpp +++ b/src/datadog/trace_segment.cpp @@ -328,16 +328,12 @@ void TraceSegment::span_finished() { } } - // RFC seems to only mandate that this be set if the trace is kept. - // However, system-tests expect this to always be set. - // Add it all the time; can't hurt - if (!tracing_enabled_) { - local_root.numeric_tags[tags::internal::apm_enabled] = 0; - } - // Some tags are repeated on all spans. for (const auto& span_ptr : spans_) { SpanData& span = *span_ptr; + if (!tracing_enabled_) { + span.numeric_tags[tags::internal::apm_enabled] = 0; + } if (origin_) { span.tags[tags::internal::origin] = *origin_; } diff --git a/test/test_tracer.cpp b/test/test_tracer.cpp index d41d51b7..94c14b6f 100644 --- a/test/test_tracer.cpp +++ b/test/test_tracer.cpp @@ -2118,6 +2118,29 @@ TEST_TRACER("move semantics") { (void)tracer2; } +TEST_TRACER("APM tracing enabled") { + TracerConfig config; + config.service = "testsvc"; + config.name = "test.op"; + const std::shared_ptr collector = + std::make_shared(); + config.collector = collector; + config.logger = std::make_shared(); + config.tracing_enabled = true; + + Expected finalized_config = finalize_config(config); + REQUIRE(finalized_config); + Tracer tracer{*finalized_config}; + + tracer.create_span(); + + REQUIRE(collector->chunks.size() == 1); + REQUIRE(collector->chunks.front().size() == 1); + const SpanData& span = *collector->chunks.front().front(); + // tracing needs to be disabled for this tag to be set + CHECK(span.numeric_tags.count(tags::internal::apm_enabled) == 0); +} + TEST_TRACER("APM tracing disabled") { TracerConfig config; config.service = "testsvc"; @@ -2130,6 +2153,29 @@ TEST_TRACER("APM tracing disabled") { TimePoint current_time = default_clock(); auto clock = [¤t_time]() { return current_time; }; + SECTION("_dd.apm.enabled is added to every span") { + Expected finalized_config = + finalize_config(config, clock); + REQUIRE(finalized_config); + Tracer tracer{*finalized_config}; + + SpanConfig service_entry_config; + service_entry_config.service = "child-service"; + + { + Span root = tracer.create_span(); + root.create_child(); + root.create_child(service_entry_config); + } + + REQUIRE(collector->chunks.size() == 1); + const auto& chunk = collector->chunks.front(); + REQUIRE(chunk.size() == 3); + for (const auto& span : chunk) { + CHECK(span->numeric_tags.at(tags::internal::apm_enabled) == 0); + } + } + SECTION("sampling behaviour") { SECTION("span with _dd.p.ts is kept") { auto finalized_config = finalize_config(config, clock);