diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy index b9de4adad0e..53d5ad5d9de 100644 --- a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/TrackingSpanDecorator.groovy @@ -414,4 +414,9 @@ class TrackingSpanDecorator implements AgentSpan { boolean isOutbound() { return delegate.isOutbound() } + + @Override + boolean isFinished() { + return delegate.isFinished() + } } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java index a05e9d982c4..b3103f7f161 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java @@ -26,6 +26,7 @@ import datadog.trace.api.datastreams.NoopPathwayContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.api.sampling.PrioritySampling; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities; import datadog.trace.bootstrap.instrumentation.api.TagContext; @@ -61,6 +62,15 @@ void setup() { tracer = tracerBuilder().writer(writer).sampler(new RateByServiceTraceSampler()).build(); } + @Test + void isFinishedReflectsSpanCompletion() { + // Exercised via the AgentSpan interface to prove the new default resolves to DDSpan's override. + AgentSpan span = tracer.buildSpan("datadog", "finishTest").start(); + assertFalse(span.isFinished(), "span must not report finished before finish()"); + span.finish(); + assertTrue(span.isFinished(), "span must report finished after finish()"); + } + @Test void gettersAndSetters() { DDSpan span = diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java index c42d98b5f3d..3fed5c481d0 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java @@ -222,6 +222,14 @@ default AgentSpan asAgentSpan() { return this; } + /** + * @return {@code true} once this span has finished (its duration is set). Implementations that do + * not track finish state always return {@code false}. + */ + default boolean isFinished() { + return false; + } + default void copyPropagationAndBaggage(final AgentSpan source) { // no op default }