From 466ff09dae2e905f3bd7ec0a9ebd8b9adaeb171b Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 3 Feb 2025 07:47:03 +0100 Subject: [PATCH] feat(core): Extract and refactor span and scope implementations from tracer Add dedicated noop methods for span, span context and scope Remove unused eligibleForDropping method Improve Javadoc --- .../java/concurrent/ConcurrentState.java | 3 +- .../AkkaActorCellInstrumentation.java | 6 +- .../AkkaMailboxInstrumentation.java | 6 +- .../aws/v0/AWSHttpClientInstrumentation.java | 3 +- .../v0/RequestExecutorInstrumentation.java | 3 +- .../aws/v2/AwsHttpClientInstrumentation.java | 3 +- ...yChannelHandlerContextInstrumentation.java | 4 +- ...yChannelHandlerContextInstrumentation.java | 4 +- .../src/test/groovy/OkHttp2AsyncTest.groovy | 3 +- .../src/test/groovy/OkHttp3AsyncTest.groovy | 3 +- .../opentelemetry/TypeConverter.java | 21 +- .../src/test/groovy/TypeConverterTest.groovy | 11 +- .../opentracing31/TypeConverter.java | 21 +- .../src/test/groovy/TypeConverterTest.groovy | 11 +- .../opentracing32/TypeConverter.java | 21 +- .../src/test/groovy/TypeConverterTest.groovy | 11 +- .../PekkoActorCellInstrumentation.java | 6 +- .../PekkoMailboxInstrumentation.java | 6 +- .../RedisFutureSendAdvice.java | 7 +- .../vertx_redis_client/RedisSendAdvice.java | 4 +- .../vertx_3_4/server/RouteHandlerWrapper.java | 5 +- .../vertx_4_0/server/RouteHandlerWrapper.java | 5 +- .../test/groovy/AgentTestRunnerTest.groovy | 3 +- .../main/java/datadog/trace/api/Tracer.java | 2 +- .../datadog/trace/context/TraceScope.java | 2 +- .../java/datadog/trace/core/CoreTracer.java | 17 +- .../main/java/datadog/trace/core/DDSpan.java | 8 - .../scopemanager/ContinuableScopeManager.java | 10 +- .../core/scopemanager/ScopeContinuation.java | 5 +- .../tagprocessor/SpanPointersProcessor.java | 6 +- .../trace/core/CoreSpanBuilderTest.groovy | 44 +- .../scopemanager/ScopeManagerDepthTest.groovy | 33 +- .../core/scopemanager/ScopeManagerTest.groovy | 22 +- .../datadog/opentracing/TypeConverter.java | 21 +- .../opentracing/TypeConverterTest.groovy | 10 +- internal-api/build.gradle | 15 +- .../instrumentation/api/AgentScope.java | 1 - .../instrumentation/api/AgentSpan.java | 28 +- .../instrumentation/api/AgentTracer.java | 648 ++---------------- .../instrumentation/api/BlackHoleSpan.java | 35 + .../instrumentation/api/ExtractedSpan.java | 171 +++++ .../instrumentation/api/ImmutableSpan.java | 193 ++++++ .../instrumentation/api/NoopScope.java | 25 + .../instrumentation/api/NoopSpan.java | 147 ++++ .../instrumentation/api/NoopSpanContext.java | 125 ++++ .../api/ExtractedSpanTest.groovy | 1 - .../gateway/InstrumentationGatewayTest.java | 4 +- 47 files changed, 952 insertions(+), 791 deletions(-) create mode 100644 internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/BlackHoleSpan.java create mode 100644 internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ExtractedSpan.java create mode 100644 internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java create mode 100644 internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopScope.java create mode 100644 internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopSpan.java create mode 100644 internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopSpanContext.java diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ConcurrentState.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ConcurrentState.java index e12a896e69e..8ca12bd383a 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ConcurrentState.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ConcurrentState.java @@ -4,7 +4,6 @@ import datadog.trace.bootstrap.ContextStore; import datadog.trace.bootstrap.instrumentation.api.AgentScope; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,7 +31,7 @@ private ConcurrentState() {} public static ConcurrentState captureScope( ContextStore contextStore, K key, AgentScope scope) { if (scope != null && scope.isAsyncPropagating()) { - if (scope.span() instanceof AgentTracer.NoopAgentSpan) { + if (!scope.span().isValid()) { return null; } final ConcurrentState state = contextStore.putIfAbsent(key, FACTORY); diff --git a/dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java b/dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java index e2f260b6754..84bb970c141 100644 --- a/dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java +++ b/dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java @@ -4,6 +4,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -13,7 +14,6 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.java.concurrent.AdviceUtils; import datadog.trace.bootstrap.instrumentation.java.concurrent.State; import java.util.Map; @@ -72,11 +72,11 @@ public static AgentScope enter( return null; } // If there is a noop span in the active scope, we can clean all the way to this scope - if (activeSpan() instanceof AgentTracer.NoopAgentSpan) { + if (activeSpan() == noopSpan()) { return activeScope; } // Create an active scope with a noop span, and clean all the way to the previous scope - localScope = activateSpan(AgentTracer.NoopAgentSpan.INSTANCE, false); + localScope = activateSpan(noopSpan(), false); return activeScope; } diff --git a/dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaMailboxInstrumentation.java b/dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaMailboxInstrumentation.java index c72405ce7e7..64e894bb59e 100644 --- a/dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaMailboxInstrumentation.java +++ b/dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaMailboxInstrumentation.java @@ -4,6 +4,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static java.util.Collections.singletonList; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -12,7 +13,6 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.api.AgentScope; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter; import java.util.Collection; import java.util.EnumMap; @@ -69,11 +69,11 @@ public static AgentScope enter() { return null; } // If there is a noop span in the active scope, we can clean all the way to this scope - if (activeSpan() instanceof AgentTracer.NoopAgentSpan) { + if (activeSpan() == noopSpan()) { return activeScope; } // Create an active scope with a noop span, and clean all the way to the previous scope - activateSpan(AgentTracer.NoopAgentSpan.INSTANCE, false); + activateSpan(noopSpan(), false); return activeScope; } diff --git a/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/AWSHttpClientInstrumentation.java b/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/AWSHttpClientInstrumentation.java index c92b66c68e0..03a0e53bc65 100644 --- a/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/AWSHttpClientInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/AWSHttpClientInstrumentation.java @@ -12,7 +12,6 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import net.bytebuddy.asm.Advice; /** @@ -50,7 +49,7 @@ public static void methodExit( // check name in case TracingRequestHandler failed to activate the span if (scope != null && (AwsNameCache.spanName(request).equals(scope.span().getSpanName()) - || scope.span() instanceof AgentTracer.NoopAgentSpan)) { + || !scope.span().isValid())) { scope.close(); } diff --git a/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/RequestExecutorInstrumentation.java b/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/RequestExecutorInstrumentation.java index 6b93dbe2d82..ba4334650b2 100644 --- a/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/RequestExecutorInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/RequestExecutorInstrumentation.java @@ -10,7 +10,6 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import net.bytebuddy.asm.Advice; /** @@ -47,7 +46,7 @@ public static void methodExit( // check name in case TracingRequestHandler failed to activate the span if (scope != null && (AwsNameCache.spanName(request).equals(scope.span().getSpanName()) - || scope.span() instanceof AgentTracer.NoopAgentSpan)) { + || !scope.span().isValid())) { scope.close(); } diff --git a/dd-java-agent/instrumentation/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsHttpClientInstrumentation.java b/dd-java-agent/instrumentation/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsHttpClientInstrumentation.java index 54862564ee1..1c77d737b54 100644 --- a/dd-java-agent/instrumentation/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsHttpClientInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsHttpClientInstrumentation.java @@ -15,7 +15,6 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.api.AgentScope; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -76,7 +75,7 @@ public static AgentScope methodEnter( final AgentScope scope = activeScope(); // check name in case TracingExecutionInterceptor failed to activate the span if (scope != null - && (scope.span() instanceof AgentTracer.NoopAgentSpan + && ((!scope.span().isValid()) || AwsSdkClientDecorator.DECORATE .spanName(requestExecutionContext.executionAttributes()) .equals(scope.span().getSpanName()))) { diff --git a/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/NettyChannelHandlerContextInstrumentation.java b/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/NettyChannelHandlerContextInstrumentation.java index 0e310e9fe2a..7fe652004ff 100644 --- a/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/NettyChannelHandlerContextInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/NettyChannelHandlerContextInstrumentation.java @@ -5,6 +5,7 @@ import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; import static datadog.trace.instrumentation.netty40.AttributeKeys.SPAN_ATTRIBUTE_KEY; import static datadog.trace.instrumentation.netty40.NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES; import static datadog.trace.instrumentation.netty40.NettyChannelPipelineInstrumentation.INSTRUMENTATION_NAME; @@ -16,7 +17,6 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.instrumentation.netty40.client.NettyHttpClientDecorator; import datadog.trace.instrumentation.netty40.server.NettyHttpServerDecorator; import io.netty.channel.ChannelHandlerContext; @@ -72,7 +72,7 @@ public static AgentScope scopeSpan(@Advice.This final ChannelHandlerContext ctx) final AgentSpan channelSpan = ctx.channel().attr(SPAN_ATTRIBUTE_KEY).get(); if (channelSpan == null || channelSpan == activeSpan()) { // don't modify the scope - return AgentTracer.NoopAgentScope.INSTANCE; + return noopScope(); } return activateSpan(channelSpan); } diff --git a/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyChannelHandlerContextInstrumentation.java b/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyChannelHandlerContextInstrumentation.java index 4589bc34a46..66f89dc58d9 100644 --- a/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyChannelHandlerContextInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyChannelHandlerContextInstrumentation.java @@ -5,6 +5,7 @@ import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; import static datadog.trace.instrumentation.netty41.AttributeKeys.SPAN_ATTRIBUTE_KEY; import static datadog.trace.instrumentation.netty41.NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES; import static datadog.trace.instrumentation.netty41.NettyChannelPipelineInstrumentation.INSTRUMENTATION_NAME; @@ -16,7 +17,6 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.instrumentation.netty41.client.NettyHttpClientDecorator; import datadog.trace.instrumentation.netty41.server.NettyHttpServerDecorator; import io.netty.channel.ChannelHandlerContext; @@ -72,7 +72,7 @@ public static AgentScope scopeSpan(@Advice.This final ChannelHandlerContext ctx) final AgentSpan channelSpan = ctx.channel().attr(SPAN_ATTRIBUTE_KEY).get(); if (channelSpan == null || channelSpan == activeSpan()) { // don't modify the scope - return AgentTracer.NoopAgentScope.INSTANCE; + return noopScope(); } return activateSpan(channelSpan); } diff --git a/dd-java-agent/instrumentation/okhttp-2/src/test/groovy/OkHttp2AsyncTest.groovy b/dd-java-agent/instrumentation/okhttp-2/src/test/groovy/OkHttp2AsyncTest.groovy index c2ae5c06a6f..246d842023c 100644 --- a/dd-java-agent/instrumentation/okhttp-2/src/test/groovy/OkHttp2AsyncTest.groovy +++ b/dd-java-agent/instrumentation/okhttp-2/src/test/groovy/OkHttp2AsyncTest.groovy @@ -7,6 +7,7 @@ import datadog.trace.bootstrap.instrumentation.api.AgentTracer import java.util.concurrent.CountDownLatch import java.util.concurrent.atomic.AtomicReference +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan import static java.util.concurrent.TimeUnit.SECONDS abstract class OkHttp2AsyncTest extends OkHttp2Test { @@ -52,7 +53,7 @@ abstract class OkHttp2AsyncTest extends OkHttp2Test { def "callbacks should carry context with error = #error" () { when: - def captured = AgentTracer.noopSpan() + def captured = noopSpan() try { TraceUtils.runUnderTrace("parent", { doRequest(method, url, ["Datadog-Meta-Lang": "java"], "", { captured = AgentTracer.activeSpan() }) diff --git a/dd-java-agent/instrumentation/okhttp-3/src/test/groovy/OkHttp3AsyncTest.groovy b/dd-java-agent/instrumentation/okhttp-3/src/test/groovy/OkHttp3AsyncTest.groovy index 335c778bf7b..fba9089cff1 100644 --- a/dd-java-agent/instrumentation/okhttp-3/src/test/groovy/OkHttp3AsyncTest.groovy +++ b/dd-java-agent/instrumentation/okhttp-3/src/test/groovy/OkHttp3AsyncTest.groovy @@ -13,6 +13,7 @@ import okhttp3.internal.http.HttpMethod import java.util.concurrent.CountDownLatch import java.util.concurrent.atomic.AtomicReference +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan import static java.util.concurrent.TimeUnit.SECONDS abstract class OkHttp3AsyncTest extends OkHttp3Test { @@ -52,7 +53,7 @@ abstract class OkHttp3AsyncTest extends OkHttp3Test { def "callbacks should carry context with error = #error" () { when: - def captured = AgentTracer.noopSpan() + def captured = noopSpan() try { TraceUtils.runUnderTrace("parent", { doRequest(method, url, ["Datadog-Meta-Lang": "java"], "", { captured = AgentTracer.activeSpan() }) diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/TypeConverter.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/TypeConverter.java index 4aa57231e3d..1e4ff5dbdbe 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/TypeConverter.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/TypeConverter.java @@ -1,9 +1,12 @@ package datadog.trace.instrumentation.opentelemetry; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpanContext; + import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.AttachableWrapper; import io.opentelemetry.context.Scope; import io.opentelemetry.trace.Span; @@ -16,16 +19,16 @@ public class TypeConverter { private final OtelScope noopScopeWrapper; public TypeConverter() { - noopSpanWrapper = new OtelSpan(AgentTracer.NoopAgentSpan.INSTANCE, this); - noopContextWrapper = new OtelSpanContext(AgentTracer.NoopContext.INSTANCE); - noopScopeWrapper = new OtelScope(AgentTracer.NoopAgentScope.INSTANCE); + noopSpanWrapper = new OtelSpan(noopSpan(), this); + noopContextWrapper = new OtelSpanContext(noopSpanContext()); + noopScopeWrapper = new OtelScope(noopScope()); } public AgentSpan toAgentSpan(final Span span) { if (span instanceof OtelSpan) { return ((OtelSpan) span).asAgentSpan(); } - return null == span ? null : AgentTracer.NoopAgentSpan.INSTANCE; + return null == span ? null : noopSpan(); } public Span toSpan(final AgentSpan agentSpan) { @@ -42,7 +45,7 @@ public Span toSpan(final AgentSpan agentSpan) { attachableSpanWrapper.attachWrapper(spanWrapper); return spanWrapper; } - if (agentSpan == AgentTracer.NoopAgentSpan.INSTANCE) { + if (agentSpan == noopSpan()) { return noopSpanWrapper; } return new OtelSpan(agentSpan, this); @@ -62,7 +65,7 @@ public Scope toScope(final AgentScope scope) { attachableScopeWrapper.attachWrapper(otScope); return otScope; } - if (scope == AgentTracer.NoopAgentScope.INSTANCE) { + if (scope == noopScope()) { return noopScopeWrapper; } return new OtelScope(scope); @@ -73,7 +76,7 @@ public SpanContext toSpanContext(final AgentSpanContext context) { return null; } // avoid a new SpanContext wrapper allocation for the noop context - if (context == AgentTracer.NoopContext.INSTANCE) { + if (context == noopSpanContext()) { return noopContextWrapper; } return new OtelSpanContext(context); @@ -83,6 +86,6 @@ public AgentSpanContext toContext(final SpanContext spanContext) { if (spanContext instanceof OtelSpanContext) { return ((OtelSpanContext) spanContext).getDelegate(); } - return null == spanContext ? null : AgentTracer.NoopContext.INSTANCE; + return null == spanContext ? null : noopSpanContext(); } } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/TypeConverterTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/TypeConverterTest.groovy index dbdb9476021..b5c93348fac 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/TypeConverterTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/TypeConverterTest.groovy @@ -2,7 +2,6 @@ import datadog.trace.agent.test.AgentTestRunner import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId import datadog.trace.api.sampling.PrioritySampling -import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopPathwayContext import datadog.trace.bootstrap.instrumentation.api.ScopeSource import datadog.trace.core.DDSpan @@ -12,11 +11,15 @@ import datadog.trace.core.propagation.PropagationTags import datadog.trace.core.scopemanager.ContinuableScopeManager import datadog.trace.instrumentation.opentelemetry.TypeConverter +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpanContext +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan + class TypeConverterTest extends AgentTestRunner { TypeConverter typeConverter = new TypeConverter() def "should avoid the noop span wrapper allocation"() { - def noopAgentSpan = AgentTracer.NoopAgentSpan.INSTANCE + def noopAgentSpan = noopSpan() expect: typeConverter.toSpan(noopAgentSpan) is typeConverter.toSpan(noopAgentSpan) } @@ -33,13 +36,13 @@ class TypeConverterTest extends AgentTestRunner { } def "should avoid the noop context wrapper allocation"() { - def noopContext = AgentTracer.NoopContext.INSTANCE + def noopContext = noopSpanContext() expect: typeConverter.toSpanContext(noopContext) is typeConverter.toSpanContext(noopContext) } def "should avoid the noop scope wrapper allocation"() { - def noopScope = AgentTracer.NoopAgentScope.INSTANCE + def noopScope = noopScope() expect: typeConverter.toScope(noopScope) is typeConverter.toScope(noopScope) } diff --git a/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/TypeConverter.java b/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/TypeConverter.java index 21dbfc21c51..bd85386c0c8 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/TypeConverter.java +++ b/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/TypeConverter.java @@ -1,9 +1,12 @@ package datadog.trace.instrumentation.opentracing31; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpanContext; + import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.AttachableWrapper; import datadog.trace.instrumentation.opentracing.LogHandler; import io.opentracing.Scope; @@ -19,16 +22,16 @@ public class TypeConverter { public TypeConverter(final LogHandler logHandler) { this.logHandler = logHandler; - noopSpanWrapper = new OTSpan(AgentTracer.NoopAgentSpan.INSTANCE, this, logHandler); - noopContextWrapper = new OTSpanContext(AgentTracer.NoopContext.INSTANCE); - noopScopeWrapper = new OTScopeManager.OTScope(AgentTracer.NoopAgentScope.INSTANCE, false, this); + noopSpanWrapper = new OTSpan(noopSpan(), this, logHandler); + noopContextWrapper = new OTSpanContext(noopSpanContext()); + noopScopeWrapper = new OTScopeManager.OTScope(noopScope(), false, this); } public AgentSpan toAgentSpan(final Span span) { if (span instanceof OTSpan) { return ((OTSpan) span).asAgentSpan(); } - return null == span ? null : AgentTracer.NoopAgentSpan.INSTANCE; + return null == span ? null : noopSpan(); } public OTSpan toSpan(final AgentSpan agentSpan) { @@ -45,7 +48,7 @@ public OTSpan toSpan(final AgentSpan agentSpan) { attachableSpanWrapper.attachWrapper(spanWrapper); return spanWrapper; } - if (agentSpan == AgentTracer.NoopAgentSpan.INSTANCE) { + if (agentSpan == noopSpan()) { return noopSpanWrapper; } return new OTSpan(agentSpan, this, logHandler); @@ -68,7 +71,7 @@ public Scope toScope(final AgentScope scope, final boolean finishSpanOnClose) { attachableScopeWrapper.attachWrapper(otScope); return otScope; } - if (scope == AgentTracer.NoopAgentScope.INSTANCE) { + if (scope == noopScope()) { return noopScopeWrapper; } return new OTScopeManager.OTScope(scope, finishSpanOnClose, this); @@ -79,7 +82,7 @@ public SpanContext toSpanContext(final AgentSpanContext context) { return null; } // avoid a new SpanContext wrapper allocation for the noop context - if (context == AgentTracer.NoopContext.INSTANCE) { + if (context == noopSpanContext()) { return noopContextWrapper; } return new OTSpanContext(context); @@ -89,6 +92,6 @@ public AgentSpanContext toContext(final SpanContext spanContext) { if (spanContext instanceof OTSpanContext) { return ((OTSpanContext) spanContext).getDelegate(); } - return null == spanContext ? null : AgentTracer.NoopContext.INSTANCE; + return null == spanContext ? null : noopSpanContext(); } } diff --git a/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/TypeConverterTest.groovy b/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/TypeConverterTest.groovy index d819cc6c5cb..694103be815 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/TypeConverterTest.groovy +++ b/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/TypeConverterTest.groovy @@ -2,7 +2,6 @@ import datadog.trace.agent.test.AgentTestRunner import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId import datadog.trace.api.sampling.PrioritySampling -import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopPathwayContext import datadog.trace.bootstrap.instrumentation.api.ScopeSource import datadog.trace.core.DDSpan @@ -13,11 +12,15 @@ import datadog.trace.core.scopemanager.ContinuableScopeManager import datadog.trace.instrumentation.opentracing.DefaultLogHandler import datadog.trace.instrumentation.opentracing31.TypeConverter +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpanContext +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan + class TypeConverterTest extends AgentTestRunner { TypeConverter typeConverter = new TypeConverter(new DefaultLogHandler()) def "should avoid the noop span wrapper allocation"() { - def noopAgentSpan = AgentTracer.NoopAgentSpan.INSTANCE + def noopAgentSpan = noopSpan() expect: typeConverter.toSpan(noopAgentSpan) is typeConverter.toSpan(noopAgentSpan) } @@ -34,13 +37,13 @@ class TypeConverterTest extends AgentTestRunner { } def "should avoid the noop context wrapper allocation"() { - def noopContext = AgentTracer.NoopContext.INSTANCE + def noopContext = noopSpanContext() expect: typeConverter.toSpanContext(noopContext) is typeConverter.toSpanContext(noopContext) } def "should avoid the noop scope wrapper allocation"() { - def noopScope = AgentTracer.NoopAgentScope.INSTANCE + def noopScope = noopScope() expect: typeConverter.toScope(noopScope, true) is typeConverter.toScope(noopScope, true) typeConverter.toScope(noopScope, false) is typeConverter.toScope(noopScope, false) diff --git a/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/TypeConverter.java b/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/TypeConverter.java index a41f9bc793b..c0fd113cdb5 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/TypeConverter.java +++ b/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/TypeConverter.java @@ -1,9 +1,12 @@ package datadog.trace.instrumentation.opentracing32; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpanContext; + import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.AttachableWrapper; import datadog.trace.instrumentation.opentracing.LogHandler; import io.opentracing.Scope; @@ -19,16 +22,16 @@ public class TypeConverter { public TypeConverter(final LogHandler logHandler) { this.logHandler = logHandler; - noopSpanWrapper = new OTSpan(AgentTracer.NoopAgentSpan.INSTANCE, this, logHandler); - noopContextWrapper = new OTSpanContext(AgentTracer.NoopContext.INSTANCE); - noopScopeWrapper = new OTScopeManager.OTScope(AgentTracer.NoopAgentScope.INSTANCE, false, this); + noopSpanWrapper = new OTSpan(noopSpan(), this, logHandler); + noopContextWrapper = new OTSpanContext(noopSpanContext()); + noopScopeWrapper = new OTScopeManager.OTScope(noopScope(), false, this); } public AgentSpan toAgentSpan(final Span span) { if (span instanceof OTSpan) { return ((OTSpan) span).asAgentSpan(); } - return null == span ? null : AgentTracer.NoopAgentSpan.INSTANCE; + return null == span ? null : noopSpan(); } public OTSpan toSpan(final AgentSpan agentSpan) { @@ -45,7 +48,7 @@ public OTSpan toSpan(final AgentSpan agentSpan) { attachableSpanWrapper.attachWrapper(spanWrapper); return spanWrapper; } - if (agentSpan == AgentTracer.NoopAgentSpan.INSTANCE) { + if (agentSpan == noopSpan()) { return noopSpanWrapper; } return new OTSpan(agentSpan, this, logHandler); @@ -68,7 +71,7 @@ public Scope toScope(final AgentScope scope, final boolean finishSpanOnClose) { attachableScopeWrapper.attachWrapper(otScope); return otScope; } - if (scope == AgentTracer.NoopAgentScope.INSTANCE) { + if (scope == noopScope()) { return noopScopeWrapper; } return new OTScopeManager.OTScope(scope, finishSpanOnClose, this); @@ -79,7 +82,7 @@ public SpanContext toSpanContext(final AgentSpanContext context) { return null; } // avoid a new SpanContext wrapper allocation for the noop context - if (context == AgentTracer.NoopContext.INSTANCE) { + if (context == noopSpanContext()) { return noopContextWrapper; } return new OTSpanContext(context); @@ -89,6 +92,6 @@ public AgentSpanContext toContext(final SpanContext spanContext) { if (spanContext instanceof OTSpanContext) { return ((OTSpanContext) spanContext).getDelegate(); } - return null == spanContext ? null : AgentTracer.NoopContext.INSTANCE; + return null == spanContext ? null : noopSpanContext(); } } diff --git a/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/TypeConverterTest.groovy b/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/TypeConverterTest.groovy index 9497a78bc84..1e2f64b876c 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/TypeConverterTest.groovy +++ b/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/TypeConverterTest.groovy @@ -2,7 +2,6 @@ import datadog.trace.agent.test.AgentTestRunner import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId import datadog.trace.api.sampling.PrioritySampling -import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopPathwayContext import datadog.trace.bootstrap.instrumentation.api.ScopeSource import datadog.trace.core.DDSpan @@ -13,11 +12,15 @@ import datadog.trace.core.scopemanager.ContinuableScopeManager import datadog.trace.instrumentation.opentracing.DefaultLogHandler import datadog.trace.instrumentation.opentracing32.TypeConverter +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpanContext +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan + class TypeConverterTest extends AgentTestRunner { TypeConverter typeConverter = new TypeConverter(new DefaultLogHandler()) def "should avoid the noop span wrapper allocation"() { - def noopAgentSpan = AgentTracer.NoopAgentSpan.INSTANCE + def noopAgentSpan = noopSpan() expect: typeConverter.toSpan(noopAgentSpan) is typeConverter.toSpan(noopAgentSpan) } @@ -34,13 +37,13 @@ class TypeConverterTest extends AgentTestRunner { } def "should avoid the noop context wrapper allocation"() { - def noopContext = AgentTracer.NoopContext.INSTANCE + def noopContext = noopSpanContext() expect: typeConverter.toSpanContext(noopContext) is typeConverter.toSpanContext(noopContext) } def "should avoid the noop scope wrapper allocation"() { - def noopScope = AgentTracer.NoopAgentScope.INSTANCE + def noopScope = noopScope() expect: typeConverter.toScope(noopScope, true) is typeConverter.toScope(noopScope, true) typeConverter.toScope(noopScope, false) is typeConverter.toScope(noopScope, false) diff --git a/dd-java-agent/instrumentation/pekko-concurrent/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoActorCellInstrumentation.java b/dd-java-agent/instrumentation/pekko-concurrent/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoActorCellInstrumentation.java index aa40a6b87ec..45aae18c813 100644 --- a/dd-java-agent/instrumentation/pekko-concurrent/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoActorCellInstrumentation.java +++ b/dd-java-agent/instrumentation/pekko-concurrent/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoActorCellInstrumentation.java @@ -4,6 +4,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -12,7 +13,6 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.java.concurrent.AdviceUtils; import datadog.trace.bootstrap.instrumentation.java.concurrent.State; import java.util.Map; @@ -72,11 +72,11 @@ public static AgentScope enter( return null; } // If there is a noop span in the active scope, we can clean all the way to this scope - if (activeSpan() instanceof AgentTracer.NoopAgentSpan) { + if (activeSpan() == noopSpan()) { return activeScope; } // Create an active scope with a noop span, and clean all the way to the previous scope - localScope = activateSpan(AgentTracer.NoopAgentSpan.INSTANCE, false); + localScope = activateSpan(noopSpan(), false); return activeScope; } diff --git a/dd-java-agent/instrumentation/pekko-concurrent/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoMailboxInstrumentation.java b/dd-java-agent/instrumentation/pekko-concurrent/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoMailboxInstrumentation.java index c052b4b1ff8..43434dce387 100644 --- a/dd-java-agent/instrumentation/pekko-concurrent/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoMailboxInstrumentation.java +++ b/dd-java-agent/instrumentation/pekko-concurrent/src/main/java/datadog/trace/instrumentation/pekko/concurrent/PekkoMailboxInstrumentation.java @@ -4,6 +4,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static java.util.Collections.singletonList; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -12,7 +13,6 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.api.AgentScope; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter; import java.util.Collection; import java.util.EnumMap; @@ -69,11 +69,11 @@ public static AgentScope enter() { return null; } // If there is a noop span in the active scope, we can clean all the way to this scope - if (activeSpan() instanceof AgentTracer.NoopAgentSpan) { + if (activeSpan() == noopSpan()) { return activeScope; } // Create an active scope with a noop span, and clean all the way to the previous scope - activateSpan(AgentTracer.NoopAgentSpan.INSTANCE, false); + activateSpan(noopSpan(), false); return activeScope; } diff --git a/dd-java-agent/instrumentation/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisFutureSendAdvice.java b/dd-java-agent/instrumentation/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisFutureSendAdvice.java index 66d627732b5..44e3a67d9b9 100644 --- a/dd-java-agent/instrumentation/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisFutureSendAdvice.java +++ b/dd-java-agent/instrumentation/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisFutureSendAdvice.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static datadog.trace.instrumentation.vertx_redis_client.VertxRedisClientDecorator.DECORATE; import static datadog.trace.instrumentation.vertx_redis_client.VertxRedisClientDecorator.REDIS_COMMAND; @@ -12,7 +13,6 @@ import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import io.vertx.core.Future; import io.vertx.core.Promise; @@ -55,7 +55,7 @@ public static AgentScope beforeSend( // If we had already wrapped the innermost handler in the RedisAPI call, then we should // not wrap it again here. See comment in RedisAPICallAdvice if (CallDepthThreadLocalMap.incrementCallDepth(RedisAPI.class) > 0) { - return AgentTracer.NoopAgentScope.INSTANCE; + return noopScope(); } final AgentSpan clientSpan = @@ -78,8 +78,7 @@ public static void afterSend( final AgentSpan span = clientScope != null ? clientScope.span() : activeSpan(); if (socketAddress != null && span != null) { - final AgentSpan spanWithConnection = - clientScope == AgentTracer.NoopAgentScope.INSTANCE ? activeSpan() : span; + final AgentSpan spanWithConnection = clientScope == noopScope() ? activeSpan() : span; DECORATE.onConnection(spanWithConnection, socketAddress); DECORATE.setPeerPort(spanWithConnection, socketAddress.port()); } diff --git a/dd-java-agent/instrumentation/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisSendAdvice.java b/dd-java-agent/instrumentation/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisSendAdvice.java index 45f0852a7e5..8268a9fae7b 100644 --- a/dd-java-agent/instrumentation/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisSendAdvice.java +++ b/dd-java-agent/instrumentation/vertx-redis-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_redis_client/RedisSendAdvice.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static datadog.trace.instrumentation.vertx_redis_client.VertxRedisClientDecorator.DECORATE; import static datadog.trace.instrumentation.vertx_redis_client.VertxRedisClientDecorator.REDIS_COMMAND; @@ -12,7 +13,6 @@ import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import io.vertx.core.AsyncResult; import io.vertx.core.Handler; @@ -51,7 +51,7 @@ public static AgentScope beforeSend( // If we had already wrapped the innermost handler in the RedisAPI call, then we should // not wrap it again here. See comment in RedisAPICallAdvice if (CallDepthThreadLocalMap.incrementCallDepth(RedisAPI.class) > 0) { - return AgentTracer.NoopAgentScope.INSTANCE; + return noopScope(); } AgentSpan parentSpan = activeSpan(); diff --git a/dd-java-agent/instrumentation/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteHandlerWrapper.java b/dd-java-agent/instrumentation/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteHandlerWrapper.java index c3755d1f17c..ea62073a1ff 100644 --- a/dd-java-agent/instrumentation/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteHandlerWrapper.java +++ b/dd-java-agent/instrumentation/vertx-web-3.4/src/main/java/datadog/trace/instrumentation/vertx_3_4/server/RouteHandlerWrapper.java @@ -2,6 +2,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static datadog.trace.instrumentation.vertx_3_4.server.VertxDecorator.DECORATE; import static datadog.trace.instrumentation.vertx_3_4.server.VertxDecorator.INSTRUMENTATION_NAME; @@ -9,7 +10,6 @@ import datadog.trace.api.gateway.Flow; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.Tags; import io.vertx.core.Handler; import io.vertx.ext.web.RoutingContext; @@ -55,8 +55,7 @@ public void handle(final RoutingContext routingContext) { updateRoutingContextWithRoute(routingContext); } - try (final AgentScope scope = - span != null ? activateSpan(span, true) : AgentTracer.NoopAgentScope.INSTANCE) { + try (final AgentScope scope = span != null ? activateSpan(span, true) : noopScope()) { try { actual.handle(routingContext); } catch (final Throwable t) { diff --git a/dd-java-agent/instrumentation/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteHandlerWrapper.java b/dd-java-agent/instrumentation/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteHandlerWrapper.java index 8b08d6b91ef..ab292cc2244 100644 --- a/dd-java-agent/instrumentation/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteHandlerWrapper.java +++ b/dd-java-agent/instrumentation/vertx-web-4.0/src/main/java/datadog/trace/instrumentation/vertx_4_0/server/RouteHandlerWrapper.java @@ -2,13 +2,13 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static datadog.trace.instrumentation.vertx_4_0.server.VertxDecorator.DECORATE; import static datadog.trace.instrumentation.vertx_4_0.server.VertxDecorator.INSTRUMENTATION_NAME; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.Tags; import io.vertx.core.Handler; import io.vertx.ext.web.RoutingContext; @@ -49,8 +49,7 @@ public void handle(final RoutingContext routingContext) { updateRoutingContextWithRoute(routingContext); } - try (final AgentScope scope = - span != null ? activateSpan(span, true) : AgentTracer.NoopAgentScope.INSTANCE) { + try (final AgentScope scope = span != null ? activateSpan(span, true) : noopScope()) { try { actual.handle(routingContext); } catch (final Throwable t) { diff --git a/dd-java-agent/testing/src/test/groovy/AgentTestRunnerTest.groovy b/dd-java-agent/testing/src/test/groovy/AgentTestRunnerTest.groovy index 72bda341905..87c30a4e684 100644 --- a/dd-java-agent/testing/src/test/groovy/AgentTestRunnerTest.groovy +++ b/dd-java-agent/testing/src/test/groovy/AgentTestRunnerTest.groovy @@ -14,6 +14,7 @@ import java.util.concurrent.TimeoutException import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_CLASSES_EXCLUDE +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan class AgentTestRunnerTest extends AgentTestRunner { private static final ClassLoader BOOTSTRAP_CLASSLOADER = null @@ -113,7 +114,7 @@ class AgentTestRunnerTest extends AgentTestRunner { when: AgentScope scope runUnderTrace("parent") { - scope = TEST_TRACER.activateSpan(AgentTracer.NoopAgentSpan.INSTANCE, ScopeSource.INSTRUMENTATION) + scope = TEST_TRACER.activateSpan(noopSpan(), ScopeSource.INSTRUMENTATION) blockUntilChildSpansFinished(1) } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java b/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java index d90e7bb94c1..f96a65b0caa 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java @@ -31,7 +31,7 @@ public interface Tracer { * ConfigDefaults#DEFAULT_ASYNC_PROPAGATING}. * * @deprecated Unstable API. Might be removed at any time. - * @param asyncPropagationEnabled @{@code true} to enable asynchronous propagation, {@code false} + * @param asyncPropagationEnabled {@code true} to enable asynchronous propagation, {@code false} * to disable it. */ @Deprecated diff --git a/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java index f7e5df5f803..3f912927568 100644 --- a/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java +++ b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java @@ -40,7 +40,7 @@ default boolean isAsyncPropagating() { * @deprecated Replaced by {@link Tracer#setAsyncPropagationEnabled(boolean)}}. *

Calling this method will enable or disable asynchronous propagation for the * active scope, not this scope instance. - * @param value @{@code true} to enable asynchronous propagation, {@code false} to disable it. + * @param value {@code true} to enable asynchronous propagation, {@code false} to disable it. */ @Deprecated default void setAsyncPropagation(boolean value) { diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index a09c39c49e4..2832cdfdcf5 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -57,6 +57,7 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.bootstrap.instrumentation.api.AgentSpanLink; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; +import datadog.trace.bootstrap.instrumentation.api.BlackHoleSpan; import datadog.trace.bootstrap.instrumentation.api.PathwayContext; import datadog.trace.bootstrap.instrumentation.api.ProfilingContextIntegration; import datadog.trace.bootstrap.instrumentation.api.ScopeSource; @@ -971,18 +972,6 @@ public AgentPropagation propagate() { return this.propagation; } - @Override - public AgentSpan noopSpan() { - return AgentTracer.NoopAgentSpan.INSTANCE; - } - - @Override - public AgentSpan blackholeSpan() { - final AgentSpan active = activeSpan(); - return new AgentTracer.BlackholeAgentSpan( - active != null ? active.getTraceId() : DDTraceId.ZERO); - } - @Override public AgentSpanContext notifyExtensionStart(Object event) { return LambdaHandler.notifyStartInvocation(this, event); @@ -1353,8 +1342,8 @@ public AgentSpan start() { } } - if (pc == AgentTracer.BlackholeContext.INSTANCE) { - return new AgentTracer.BlackholeAgentSpan(pc.getTraceId()); + if (pc == BlackHoleSpan.Context.INSTANCE) { + return new BlackHoleSpan(pc.getTraceId()); } return buildSpan(); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java index 6a8e6f713c1..1732f13bd86 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java @@ -1,8 +1,6 @@ package datadog.trace.core; import static datadog.trace.api.DDTags.TRACE_START_TIME; -import static datadog.trace.api.sampling.PrioritySampling.SAMPLER_DROP; -import static datadog.trace.api.sampling.PrioritySampling.USER_DROP; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.RECORD_END_TO_END_DURATION_MS; import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_STATUS; import static java.util.concurrent.TimeUnit.MICROSECONDS; @@ -559,12 +557,6 @@ public final DDSpan setResourceName(final CharSequence resourceName, byte priori return this; } - @Override - public boolean eligibleForDropping() { - int samplingPriority = context.getSamplingPriority(); - return samplingPriority == USER_DROP || samplingPriority == SAMPLER_DROP; - } - @Override public RequestContext getRequestContext() { return context.getRequestContext(); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java index 9da444a87c5..89873e6f94a 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java @@ -1,7 +1,8 @@ package datadog.trace.core.scopemanager; import static datadog.trace.api.ConfigDefaults.DEFAULT_ASYNC_PROPAGATING; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; @@ -12,7 +13,6 @@ import datadog.trace.api.scopemanager.ScopeListener; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.ProfilerContext; import datadog.trace.bootstrap.instrumentation.api.ProfilingContextIntegration; import datadog.trace.bootstrap.instrumentation.api.ScopeSource; @@ -116,7 +116,7 @@ private AgentScope activate( if (depthLimit <= currentDepth) { healthMetrics.onScopeStackOverflow(); log.debug("Scope depth limit exceeded ({}). Returning NoopScope.", currentDepth); - return AgentTracer.NoopAgentScope.INSTANCE; + return noopScope(); } assert span != null; @@ -192,7 +192,7 @@ public AgentScope activateNext(final AgentSpan span) { if (depthLimit <= currentDepth) { healthMetrics.onScopeStackOverflow(); log.debug("Scope depth limit exceeded ({}). Returning NoopScope.", currentDepth); - return AgentTracer.NoopAgentScope.INSTANCE; + return noopScope(); } assert span != null; @@ -243,7 +243,7 @@ private void addExtendedScopeListener(final ExtendedScopeListener listener) { extendedScopeListeners.add(listener); log.debug("Added scope listener {}", listener); AgentSpan activeSpan = activeSpan(); - if (activeSpan != null && activeSpan != NoopAgentSpan.INSTANCE) { + if (activeSpan != null && activeSpan != noopSpan()) { // Notify the listener about the currently active scope listener.afterScopeActivated(activeSpan.getTraceId(), activeSpan.getSpanId()); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ScopeContinuation.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ScopeContinuation.java index 1c90276d093..7471a97ef78 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ScopeContinuation.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ScopeContinuation.java @@ -1,9 +1,10 @@ package datadog.trace.core.scopemanager; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; + import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentTraceCollector; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentScope; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; /** @@ -79,7 +80,7 @@ public AgentScope activate() { } else { // continuation cancelled or too many activations; rollback count COUNT.decrementAndGet(this); - return NoopAgentScope.INSTANCE; + return noopScope(); } } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/SpanPointersProcessor.java b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/SpanPointersProcessor.java index 685ad55fa89..fabf01fc7a4 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/SpanPointersProcessor.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/SpanPointersProcessor.java @@ -1,11 +1,12 @@ package datadog.trace.core.tagprocessor; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpanLink.DEFAULT_FLAGS; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpanContext; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.AWS_BUCKET_NAME; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.AWS_OBJECT_KEY; import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.S3_ETAG; import datadog.trace.bootstrap.instrumentation.api.AgentSpanLink; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.SpanAttributes; import datadog.trace.bootstrap.instrumentation.api.SpanLink; import datadog.trace.core.DDSpanContext; @@ -57,8 +58,7 @@ public Map processTags( .put("link.kind", LINK_KIND) .build(); - AgentTracer.NoopContext zeroContext = AgentTracer.NoopContext.INSTANCE; - AgentSpanLink link = SpanLink.from(zeroContext, AgentSpanLink.DEFAULT_FLAGS, "", attributes); + AgentSpanLink link = SpanLink.from(noopSpanContext(), DEFAULT_FLAGS, "", attributes); spanLinks.add(link); } catch (Exception e) { LOG.debug("Failed to add span pointer: {}", e.getMessage()); diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/CoreSpanBuilderTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/CoreSpanBuilderTest.groovy index 7f89d08f62d..d4a8457f553 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/CoreSpanBuilderTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/CoreSpanBuilderTest.groovy @@ -12,7 +12,6 @@ import datadog.trace.api.gateway.RequestContextSlot import datadog.trace.api.naming.SpanNaming import datadog.trace.api.sampling.PrioritySampling import datadog.trace.bootstrap.instrumentation.api.AgentScope -import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopPathwayContext import datadog.trace.bootstrap.instrumentation.api.TagContext import datadog.trace.common.writer.ListWriter @@ -28,6 +27,7 @@ import static datadog.trace.api.DDTags.RUNTIME_ID_TAG import static datadog.trace.api.DDTags.THREAD_ID import static datadog.trace.api.DDTags.THREAD_NAME import static datadog.trace.api.TracePropagationStyle.DATADOG +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan import static java.util.concurrent.TimeUnit.MILLISECONDS class CoreSpanBuilderTest extends DDCoreSpecification { @@ -41,7 +41,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { def "build simple span"() { setup: - final DDSpan span = tracer.buildSpan("op name").withServiceName("foo").start() + final DDSpan span = tracer.buildSpan("test", "op name").withServiceName("foo").start() expect: span.operationName == "op name" @@ -72,7 +72,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { when: - span = tracer.buildSpan(expectedName).withServiceName("foo").start() + span = tracer.buildSpan("test", expectedName).withServiceName("foo").start() then: span.getTags() == [ @@ -92,7 +92,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { span = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName("foo") .withResourceName(expectedResource) .withServiceName(expectedService) @@ -114,7 +114,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { def "setting #name should remove"() { setup: - final DDSpan span = tracer.buildSpan("op name") + final DDSpan span = tracer.buildSpan("test", "op name") .withTag(name, "tag value") .withTag(name, value) .start() @@ -148,7 +148,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { DDSpan span = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName("foo") .withStartTimestamp(expectedTimestamp) .start() @@ -160,7 +160,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { when: // auto-timestamp in nanoseconds def start = System.currentTimeMillis() - span = tracer.buildSpan(expectedName).withServiceName("foo").start() + span = tracer.buildSpan("test", expectedName).withServiceName("foo").start() def stop = System.currentTimeMillis() then: @@ -187,7 +187,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { final DDSpan span = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName("foo") .asChildOf(mockedContext) .start() @@ -202,14 +202,14 @@ class CoreSpanBuilderTest extends DDCoreSpecification { def "should link to parent span implicitly"() { setup: final AgentScope parent = tracer.activateSpan(noopParent ? - AgentTracer.NoopAgentSpan.INSTANCE : tracer.buildSpan("parent").withServiceName("service").start()) + noopSpan() : tracer.buildSpan("test", "parent").withServiceName("service").start()) final long expectedParentId = noopParent ? DDSpanId.ZERO : parent.span().context().getSpanId() final String expectedName = "fakeName" final DDSpan span = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName(serviceName) .start() @@ -244,7 +244,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { final DDSpan parent = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName("foo") .withResourceName(expectedParentResourceName) .withSpanType(expectedParentType) @@ -255,7 +255,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { // ServiceName and SpanType are always set by the parent if they are not present in the child DDSpan span = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName(expectedParentServiceName) .asChildOf(parent) .start() @@ -272,7 +272,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { // ServiceName and SpanType are always overwritten by the child if they are present span = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName(expectedChildServiceName) .withResourceName(expectedChildResourceName) .withSpanType(expectedChildType) @@ -295,13 +295,13 @@ class CoreSpanBuilderTest extends DDCoreSpecification { // root (aka spans[0]) is the parent // others are just for fun - def root = tracer.buildSpan("fake_O").withServiceName("foo").start() + def root = tracer.buildSpan("test", "fake_O").withServiceName("foo").start() def lastSpan = root for (int i = 1; i <= 10; i++) { lastSpan = tracer - .buildSpan("fake_" + i) + .buildSpan("test", "fake_" + i) .withServiceName("foo") .asChildOf(lastSpan) .start() @@ -319,7 +319,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { def "ExtractedContext should populate new span details"() { setup: def thread = Thread.currentThread() - final DDSpan span = tracer.buildSpan("op name") + final DDSpan span = tracer.buildSpan("test", "op name") .asChildOf(extractedContext).start() expect: @@ -345,7 +345,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { def "TagContext should populate default span details"() { setup: def thread = Thread.currentThread() - final DDSpan span = tracer.buildSpan("op name").asChildOf(tagContext).start() + final DDSpan span = tracer.buildSpan("test", "op name").asChildOf(tagContext).start() expect: span.traceId != DDTraceId.ZERO @@ -370,7 +370,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { setup: injectSysConfig("dd.trace.span.tags", tagString) def customTracer = tracerBuilder().writer(writer).build() - def span = customTracer.buildSpan("op name").withServiceName("foo").start() + def span = customTracer.buildSpan("test", "op name").withServiceName("foo").start() expect: span.tags == tags + [ @@ -404,7 +404,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { span1.getRequestContext().getData(RequestContextSlot.IAST) == null when: - def span2 = tracer.buildSpan("span2") + def span2 = tracer.buildSpan("test", "span2") .asChildOf(span1.context()) .withRequestContextData(RequestContextSlot.APPSEC, "override") .withRequestContextData(RequestContextSlot.CI_VISIBILITY, "override") @@ -427,10 +427,10 @@ class CoreSpanBuilderTest extends DDCoreSpecification { .withCiVisibilityContextData("value") .withRequestContextDataIast("value") .withRequestContextDataAppSec("value") - def span1 = tracer.buildSpan("span1").asChildOf(context).start() + def span1 = tracer.buildSpan("test", "span1").asChildOf(context).start() when: - def span2 = tracer.buildSpan("span2").asChildOf(span1.context()).start() + def span2 = tracer.buildSpan("test", "span2").asChildOf(span1.context()).start() then: span2.getRequestContext().getData(RequestContextSlot.APPSEC) == "value" @@ -438,7 +438,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { span2.getRequestContext().getData(RequestContextSlot.IAST) == "value" when: - def span3 = tracer.buildSpan("span3") + def span3 = tracer.buildSpan("test", "span3") .asChildOf(span2.context()) .withRequestContextData(RequestContextSlot.APPSEC, "override") .withRequestContextData(RequestContextSlot.CI_VISIBILITY, "override") diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerDepthTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerDepthTest.groovy index 4f15e687550..8e4cd6c7644 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerDepthTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerDepthTest.groovy @@ -3,12 +3,13 @@ package datadog.trace.core.scopemanager import datadog.trace.api.config.TracerConfig import datadog.trace.bootstrap.instrumentation.api.AgentScope import datadog.trace.bootstrap.instrumentation.api.AgentSpan -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentScope -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentSpan import datadog.trace.bootstrap.instrumentation.api.ScopeSource import datadog.trace.common.writer.ListWriter import datadog.trace.core.test.DDCoreSpecification +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan + class ScopeManagerDepthTest extends DDCoreSpecification { def "scopemanager returns noop scope if depth exceeded"() { given: @@ -16,9 +17,9 @@ class ScopeManagerDepthTest extends DDCoreSpecification { def scopeManager = tracer.scopeManager when: "fill up the scope stack" - AgentScope scope = null + AgentScope scope for (int i = 0; i < depth; i++) { - def testSpan = tracer.buildSpan("test").start() + def testSpan = tracer.buildSpan("test", "test").start() scope = tracer.activateSpan(testSpan) assert scope instanceof ContinuableScope } @@ -27,17 +28,17 @@ class ScopeManagerDepthTest extends DDCoreSpecification { scopeManager.scopeStack().depth() == depth when: "activate span over limit" - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() scope = tracer.activateSpan(span) then: "a noop instance is returned" - scope instanceof NoopAgentScope + scope == noopScope() when: "activate a noop scope over the limit" - scope = scopeManager.activate(NoopAgentSpan.INSTANCE, ScopeSource.MANUAL) + scope = scopeManager.activate(noopSpan(), ScopeSource.MANUAL) then: "still have a noop instance" - scope instanceof NoopAgentScope + scope == noopScope() and: "scope stack not effected." scopeManager.scopeStack().depth() == depth @@ -57,9 +58,9 @@ class ScopeManagerDepthTest extends DDCoreSpecification { def scopeManager = tracer.scopeManager when: "fill up the scope stack" - AgentScope scope = null + AgentScope scope for (int i = 0; i < defaultLimit; i++) { - def testSpan = tracer.buildSpan("test").start() + def testSpan = tracer.buildSpan("test", "test").start() scope = tracer.activateSpan(testSpan) assert scope instanceof ContinuableScope } @@ -68,18 +69,18 @@ class ScopeManagerDepthTest extends DDCoreSpecification { scopeManager.scopeStack().depth() == defaultLimit when: "activate a scope" - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() scope = tracer.activateSpan(span) then: "a real scope is returned" - !(scope instanceof NoopAgentScope) + scope != noopScope() scopeManager.scopeStack().depth() == defaultLimit + 1 when: "activate a noop span" - scope = scopeManager.activate(NoopAgentSpan.INSTANCE, ScopeSource.MANUAL) + scope = scopeManager.activate(noopSpan(), ScopeSource.MANUAL) then: "a real instance is still returned" - !(scope instanceof NoopAgentScope) + scope != noopScope() and: "scope stack not effected." scopeManager.scopeStack().depth() == defaultLimit + 2 @@ -101,10 +102,10 @@ class ScopeManagerDepthTest extends DDCoreSpecification { def scopeManager = tracer.scopeManager when: - AgentSpan firstSpan = tracer.buildSpan("foo").start() + AgentSpan firstSpan = tracer.buildSpan("test", "foo").start() AgentScope firstScope = tracer.activateSpan(firstSpan) - AgentSpan secondSpan = tracer.buildSpan("foo").start() + AgentSpan secondSpan = tracer.buildSpan("test", "foo").start() AgentScope secondScope = tracer.activateSpan(secondSpan) then: diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerTest.groovy index 71e25290dae..367aad65a21 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerTest.groovy @@ -8,7 +8,6 @@ import datadog.trace.api.interceptor.TraceInterceptor import datadog.trace.api.scopemanager.ExtendedScopeListener import datadog.trace.bootstrap.instrumentation.api.AgentScope import datadog.trace.bootstrap.instrumentation.api.AgentSpan -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentSpan import datadog.trace.bootstrap.instrumentation.api.ProfilingContextIntegration import datadog.trace.bootstrap.instrumentation.api.ScopeSource import datadog.trace.common.writer.ListWriter @@ -27,6 +26,7 @@ import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicReference +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan import static datadog.trace.core.scopemanager.EVENT.ACTIVATE import static datadog.trace.core.scopemanager.EVENT.CLOSE import static datadog.trace.test.util.GCUtils.awaitGC @@ -84,7 +84,7 @@ class ScopeManagerTest extends DDCoreSpecification { scopeManager.active() == null when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) then: @@ -121,7 +121,7 @@ class ScopeManagerTest extends DDCoreSpecification { def "scope state should be able to fetch and activate state when there is an active span"() { when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) def initialScopeState = scopeManager.newScopeState() initialScopeState.fetchFromActive() @@ -155,7 +155,7 @@ class ScopeManagerTest extends DDCoreSpecification { def "non-ddspan activation results in a continuable scope"() { when: - def scope = scopeManager.activate(NoopAgentSpan.INSTANCE, ScopeSource.INSTRUMENTATION) + def scope = scopeManager.activate(noopSpan(), ScopeSource.INSTRUMENTATION) then: scopeManager.active() == scope @@ -170,7 +170,7 @@ class ScopeManagerTest extends DDCoreSpecification { def "no scope is active before activation"() { setup: - def builder = tracer.buildSpan("test") + def builder = tracer.buildSpan("test", "test") builder.start() expect: @@ -180,7 +180,7 @@ class ScopeManagerTest extends DDCoreSpecification { def "simple scope and span lifecycle"() { when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) then: @@ -210,9 +210,9 @@ class ScopeManagerTest extends DDCoreSpecification { def "sets parent as current upon close"() { when: - def parentSpan = tracer.buildSpan("parent").start() + def parentSpan = tracer.buildSpan("test", "parent").start() def parentScope = tracer.activateSpan(parentSpan) - def childSpan = tracer.buildSpan("child").start() + def childSpan = tracer.buildSpan("test", "child").start() def childScope = tracer.activateSpan(childSpan) then: @@ -232,9 +232,9 @@ class ScopeManagerTest extends DDCoreSpecification { def "sets parent as current upon close with noop child"() { when: - def parentSpan = tracer.buildSpan("parent").start() + def parentSpan = tracer.buildSpan("test", "parent").start() def parentScope = tracer.activateSpan(parentSpan) - def childSpan = NoopAgentSpan.INSTANCE + def childSpan = noopSpan() def childScope = tracer.activateSpan(childSpan) then: @@ -1024,7 +1024,7 @@ class ScopeManagerTest extends DDCoreSpecification { def childScope = tracer.activateSpan(child) try { Thread.sleep(100) - } catch (InterruptedException e) { + } catch (InterruptedException ignored) { Thread.currentThread().interrupt() } childScope.close() diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/TypeConverter.java b/dd-trace-ot/src/main/java/datadog/opentracing/TypeConverter.java index 7d50eb632f8..0a43a508482 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/TypeConverter.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/TypeConverter.java @@ -1,9 +1,12 @@ package datadog.opentracing; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpanContext; + import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.AttachableWrapper; import io.opentracing.Scope; import io.opentracing.Span; @@ -18,9 +21,9 @@ class TypeConverter { public TypeConverter(final LogHandler logHandler) { this.logHandler = logHandler; - noopSpanWrapper = new OTSpan(AgentTracer.NoopAgentSpan.INSTANCE, this, logHandler); - noopContextWrapper = new OTSpanContext(AgentTracer.NoopContext.INSTANCE); - noopScopeWrapper = new OTScopeManager.OTScope(AgentTracer.NoopAgentScope.INSTANCE, false, this); + noopSpanWrapper = new OTSpan(noopSpan(), this, logHandler); + noopContextWrapper = new OTSpanContext(noopSpanContext()); + noopScopeWrapper = new OTScopeManager.OTScope(noopScope(), false, this); } public AgentSpan toAgentSpan(final Span span) { @@ -30,7 +33,7 @@ public AgentSpan toAgentSpan(final Span span) { return ((OTSpan) span).asAgentSpan(); } else { // NOOP Span - return AgentTracer.NoopAgentSpan.INSTANCE; + return noopSpan(); } } @@ -48,7 +51,7 @@ public OTSpan toSpan(final AgentSpan agentSpan) { attachableSpanWrapper.attachWrapper(spanWrapper); return spanWrapper; } - if (agentSpan == AgentTracer.NoopAgentSpan.INSTANCE) { + if (agentSpan == noopSpan()) { return noopSpanWrapper; } return new OTSpan(agentSpan, this, logHandler); @@ -71,7 +74,7 @@ public Scope toScope(final AgentScope scope, final boolean finishSpanOnClose) { attachableScopeWrapper.attachWrapper(otScope); return otScope; } - if (scope == AgentTracer.NoopAgentScope.INSTANCE) { + if (scope == noopScope()) { return noopScopeWrapper; } return new OTScopeManager.OTScope(scope, finishSpanOnClose, this); @@ -82,7 +85,7 @@ public SpanContext toSpanContext(final AgentSpanContext context) { return null; } // avoid a new SpanContext wrapper allocation for the noop context - if (context == AgentTracer.NoopContext.INSTANCE) { + if (context == noopSpanContext()) { return noopContextWrapper; } return new OTSpanContext(context); @@ -94,7 +97,7 @@ public AgentSpanContext toContext(final SpanContext spanContext) { } else if (spanContext instanceof OTSpanContext) { return ((OTSpanContext) spanContext).getDelegate(); } else { - return AgentTracer.NoopContext.INSTANCE; + return noopSpanContext(); } } } diff --git a/dd-trace-ot/src/test/groovy/datadog/opentracing/TypeConverterTest.groovy b/dd-trace-ot/src/test/groovy/datadog/opentracing/TypeConverterTest.groovy index 53884e28797..98a4b53987d 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/TypeConverterTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/TypeConverterTest.groovy @@ -3,7 +3,6 @@ package datadog.opentracing import datadog.trace.api.DDSpanId import datadog.trace.api.DDTraceId import datadog.trace.api.sampling.PrioritySampling -import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.ScopeSource import datadog.trace.core.CoreTracer import datadog.trace.core.DDSpan @@ -13,13 +12,16 @@ import datadog.trace.core.propagation.PropagationTags import datadog.trace.core.scopemanager.ContinuableScopeManager import datadog.trace.test.util.DDSpecification +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpanContext import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopPathwayContext +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan class TypeConverterTest extends DDSpecification { TypeConverter typeConverter = new TypeConverter(new DefaultLogHandler()) def "should avoid the noop span wrapper allocation"() { - def noopAgentSpan = AgentTracer.NoopAgentSpan.INSTANCE + def noopAgentSpan = noopSpan() expect: typeConverter.toSpan(noopAgentSpan) is typeConverter.toSpan(noopAgentSpan) } @@ -36,13 +38,13 @@ class TypeConverterTest extends DDSpecification { } def "should avoid the noop context wrapper allocation"() { - def noopContext = AgentTracer.NoopContext.INSTANCE + def noopContext = noopSpanContext() expect: typeConverter.toSpanContext(noopContext) is typeConverter.toSpanContext(noopContext) } def "should avoid the noop scope wrapper allocation"() { - def noopScope = AgentTracer.NoopAgentScope.INSTANCE + def noopScope = noopScope() expect: typeConverter.toScope(noopScope, true) is typeConverter.toScope(noopScope, true) typeConverter.toScope(noopScope, false) is typeConverter.toScope(noopScope, false) diff --git a/internal-api/build.gradle b/internal-api/build.gradle index 1867ac148ba..b0886477765 100644 --- a/internal-api/build.gradle +++ b/internal-api/build.gradle @@ -66,28 +66,33 @@ excludedClassesCoverage += [ // Caused by empty 'default' interface method "datadog.trace.bootstrap.instrumentation.api.AgentPropagation", "datadog.trace.bootstrap.instrumentation.api.AgentPropagation.ContextVisitor", + "datadog.trace.bootstrap.instrumentation.api.AgentScope", "datadog.trace.bootstrap.instrumentation.api.AgentSpan", "datadog.trace.bootstrap.instrumentation.api.AgentSpanContext", "datadog.trace.bootstrap.instrumentation.api.AgentTracer", - "datadog.trace.bootstrap.instrumentation.api.AgentTracer.BlackholeAgentSpan", - "datadog.trace.bootstrap.instrumentation.api.AgentTracer.BlackholeContext", "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentDataStreamsMonitoring", "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentHistogram", "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentPropagation", - "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentScope", - "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentSpan", "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentTraceCollector", - "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopContext", "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopContinuation", "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopPathwayContext", "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopTraceConfig", "datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopTracerAPI", "datadog.trace.bootstrap.instrumentation.api.AgentTracer.TracerAPI", "datadog.trace.bootstrap.instrumentation.api.Backlog", + "datadog.trace.bootstrap.instrumentation.api.BlackHoleSpan", + "datadog.trace.bootstrap.instrumentation.api.BlackHoleSpan.Context", "datadog.trace.bootstrap.instrumentation.api.ErrorPriorities", + "datadog.trace.bootstrap.instrumentation.api.ExtractedSpan", + "datadog.trace.bootstrap.instrumentation.api.ImmutableSpan", "datadog.trace.bootstrap.instrumentation.api.InstrumentationTags", "datadog.trace.bootstrap.instrumentation.api.InternalContextKeys", "datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes", + "datadog.trace.bootstrap.instrumentation.api.NoopAgentScope", + "datadog.trace.bootstrap.instrumentation.api.NoopAgentSpan", + "datadog.trace.bootstrap.instrumentation.api.NoopScope", + "datadog.trace.bootstrap.instrumentation.api.NoopSpan", + "datadog.trace.bootstrap.instrumentation.api.NoopSpanContext", "datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities", "datadog.trace.bootstrap.instrumentation.api.Schema", "datadog.trace.bootstrap.instrumentation.api.ScopeSource", diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentScope.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentScope.java index 7d2ac8aa848..5da11f4c99b 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentScope.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentScope.java @@ -15,7 +15,6 @@ public interface AgentScope extends TraceScope, Closeable { void close(); interface Continuation extends TraceScope.Continuation { - @Override Continuation hold(); 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 35ed82c6ea8..dd04f806850 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 @@ -5,13 +5,12 @@ import datadog.context.Context; import datadog.context.ContextKey; import datadog.context.ImplicitContextKeyed; +import datadog.trace.api.DDSpanId; import datadog.trace.api.DDTraceId; import datadog.trace.api.TraceConfig; import datadog.trace.api.gateway.IGSpanInfo; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.interceptor.MutableSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopContext; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -32,24 +31,33 @@ static AgentSpan fromContext(Context context) { /** * Creates a span wrapper from a span context. * - *

Creating a such span will not create a tracing span to complete a local root trace. It gives - * a span instance based on a span context for span-based API. It is usually used with an - * extracted span context as parameter to represent a remove span. + *

Creating such span will not create a tracing span to complete a local root trace. It gives a + * span instance based on a span context for span-based API. It is usually used with an extracted + * span context as parameter to represent a remote span. * * @param spanContext the span context to get a full-fledged span. - * @return a span wrapped based on a span context. + * @return a span wrapper based on a span context. */ static AgentSpan fromSpanContext(AgentSpanContext spanContext) { - if (spanContext == null || spanContext == NoopContext.INSTANCE) { - return NoopAgentSpan.INSTANCE; + if (spanContext == null || spanContext == NoopSpanContext.INSTANCE) { + return NoopSpan.INSTANCE; } - return new AgentTracer.ExtractedSpan(spanContext); + return new ExtractedSpan(spanContext); } DDTraceId getTraceId(); long getSpanId(); + /** + * Checks whether a span is considered valid by having valid trace and span identifiers. + * + * @return {@code true} if the span is considered valid, {@code false} otherwise. + */ + default boolean isValid() { + return getTraceId() != DDTraceId.ZERO && getSpanId() != DDSpanId.ZERO; + } + @Override AgentSpan setTag(String key, boolean value); @@ -165,8 +173,6 @@ static AgentSpan fromSpanContext(AgentSpanContext spanContext) { */ AgentSpan setResourceName(final CharSequence resourceName, byte priority); - boolean eligibleForDropping(); - /** RequestContext for the Instrumentation Gateway */ RequestContext getRequestContext(); diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java index 0335aa05ab1..ac5e54d8f7a 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java @@ -1,10 +1,8 @@ package datadog.trace.bootstrap.instrumentation.api; import static datadog.trace.api.ConfigDefaults.DEFAULT_ASYNC_PROPAGATING; -import static java.util.Collections.emptyList; import datadog.trace.api.ConfigDefaults; -import datadog.trace.api.DDSpanId; import datadog.trace.api.DDTraceId; import datadog.trace.api.EndpointCheckpointer; import datadog.trace.api.EndpointTracker; @@ -13,14 +11,11 @@ import datadog.trace.api.experimental.DataStreamsCheckpointer; import datadog.trace.api.experimental.DataStreamsContextCarrier; import datadog.trace.api.gateway.CallbackProvider; -import datadog.trace.api.gateway.Flow; -import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.api.gateway.SubscriptionService; import datadog.trace.api.interceptor.TraceInterceptor; import datadog.trace.api.internal.InternalTracer; import datadog.trace.api.internal.TraceSegment; -import datadog.trace.api.sampling.PrioritySampling; import datadog.trace.api.sampling.SamplingRule; import datadog.trace.api.scopemanager.ScopeListener; import datadog.trace.context.TraceScope; @@ -157,7 +152,7 @@ public static boolean isAsyncPropagationEnabled() { *

Asynchronous propagation is enabled by default from {@link * ConfigDefaults#DEFAULT_ASYNC_PROPAGATING}. * - * @param asyncPropagationEnabled @{@code true} to enable asynchronous propagation, {@code false} + * @param asyncPropagationEnabled {@code true} to enable asynchronous propagation, {@code false} * to disable it. */ public static void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) { @@ -168,14 +163,46 @@ public static AgentPropagation propagate() { return get().propagate(); } + /** + * Returns the noop span instance. + * + *

This instance will always be the same, and can be safely tested using object identity (ie + * {@code ==}). + * + * @return the noop span instance. + */ public static AgentSpan noopSpan() { - return get().noopSpan(); + return NoopSpan.INSTANCE; } public static AgentSpan blackholeSpan() { return get().blackholeSpan(); } + /** + * Returns the noop span context instance. + * + *

This instance will always be the same, and can be safely tested using object identity (ie + * {@code ==}). + * + * @return the noop scope instance. + */ + public static AgentSpanContext noopSpanContext() { + return NoopSpanContext.INSTANCE; + } + + /** + * Returns the noop scope instance. + * + *

This instance will always be the same, and can be safely tested using object identity (ie + * {@code ==}). + * + * @return the noop scope instance. + */ + public static AgentScope noopScope() { + return NoopScope.INSTANCE; + } + public static final TracerAPI NOOP_TRACER = new NoopTracerAPI(); private static volatile TracerAPI provider = NOOP_TRACER; @@ -264,9 +291,10 @@ AgentSpan startSpan( AgentPropagation propagate(); - AgentSpan noopSpan(); - - AgentSpan blackholeSpan(); + default AgentSpan blackholeSpan() { + final AgentSpan active = activeSpan(); + return new BlackHoleSpan(active != null ? active.getTraceId() : DDTraceId.ZERO); + } /** Deprecated. Use {@link #buildSpan(String, CharSequence)} instead. */ @Deprecated @@ -353,13 +381,13 @@ protected NoopTracerAPI() {} @Override public AgentSpan startSpan(final String instrumentationName, final CharSequence spanName) { - return NoopAgentSpan.INSTANCE; + return NoopSpan.INSTANCE; } @Override public AgentSpan startSpan( final String instrumentationName, final CharSequence spanName, final long startTimeMicros) { - return NoopAgentSpan.INSTANCE; + return NoopSpan.INSTANCE; } @Override @@ -367,7 +395,7 @@ public AgentSpan startSpan( final String instrumentationName, final CharSequence spanName, final AgentSpanContext parent) { - return NoopAgentSpan.INSTANCE; + return NoopSpan.INSTANCE; } @Override @@ -376,18 +404,18 @@ public AgentSpan startSpan( final CharSequence spanName, final AgentSpanContext parent, final long startTimeMicros) { - return NoopAgentSpan.INSTANCE; + return NoopSpan.INSTANCE; } @Override public AgentScope activateSpan(final AgentSpan span, final ScopeSource source) { - return NoopAgentScope.INSTANCE; + return NoopScope.INSTANCE; } @Override public AgentScope activateSpan( final AgentSpan span, final ScopeSource source, final boolean isAsyncPropagating) { - return NoopAgentScope.INSTANCE; + return NoopScope.INSTANCE; } @Override @@ -408,12 +436,12 @@ public void closePrevious(final boolean finishSpan) {} @Override public AgentScope activateNext(final AgentSpan span) { - return NoopAgentScope.INSTANCE; + return NoopScope.INSTANCE; } @Override public AgentSpan activeSpan() { - return NoopAgentSpan.INSTANCE; + return NoopSpan.INSTANCE; } @Override @@ -426,14 +454,9 @@ public AgentPropagation propagate() { return NoopAgentPropagation.INSTANCE; } - @Override - public AgentSpan noopSpan() { - return NoopAgentSpan.INSTANCE; - } - @Override public AgentSpan blackholeSpan() { - return NoopAgentSpan.INSTANCE; // no-op tracer stays no-op + return NoopSpan.INSTANCE; // no-op tracer stays no-op } @Override @@ -491,7 +514,7 @@ public boolean addTraceInterceptor(final TraceInterceptor traceInterceptor) { @Override public TraceScope muteTracing() { - return NoopAgentScope.INSTANCE; + return NoopScope.INSTANCE; } @Override @@ -559,453 +582,6 @@ public void updatePreferredServiceName(String serviceName) { } } - public static final class BlackholeAgentSpan extends NoopAgentSpan { - private final DDTraceId ddTraceId; - - public BlackholeAgentSpan(final DDTraceId ddTraceId) { - this.ddTraceId = ddTraceId; - } - - @Override - public boolean isSameTrace(final AgentSpan otherSpan) { - return otherSpan != null - && ((ddTraceId != null && ddTraceId.equals(otherSpan.getTraceId())) - || otherSpan.getTraceId() == null); - } - - @Override - public DDTraceId getTraceId() { - return ddTraceId; - } - - @Override - public AgentSpanContext context() { - return BlackholeContext.INSTANCE; - } - } - - /** - * Represents a remote span from an extracted span context. - * - *

Tags and baggage access are inefficient and only supported as remediation for products - * storing propagated information into span context, until they migrate to the new context API. - */ - static final class ExtractedSpan extends AgentTracer.NoopAgentSpan { - private final AgentSpanContext spanContext; - - ExtractedSpan(AgentSpanContext spanContext) { - super(); - this.spanContext = spanContext; - } - - @Override - public DDTraceId getTraceId() { - return this.spanContext.getTraceId(); - } - - @Override - public long getSpanId() { - return this.spanContext.getSpanId(); - } - - @Override - public Object getTag(final String tag) { - if (this.spanContext instanceof TagContext) { - return ((TagContext) this.spanContext).getTags().get(tag); - } - return null; - } - - @Override - public Map getTags() { - if (this.spanContext instanceof TagContext) { - Map tags = ((TagContext) this.spanContext).getTags(); - //noinspection unchecked - return (Map) (Map) tags; - } - return Collections.emptyMap(); - } - - @Override - public String getBaggageItem(final String key) { - Iterable> baggage = this.spanContext.baggageItems(); - for (Map.Entry stringStringEntry : baggage) { - if (stringStringEntry.getKey().equals(key)) { - return stringStringEntry.getValue(); - } - } - return null; - } - - @Override - public AgentSpanContext context() { - return this.spanContext; - } - - @Override - public boolean isSameTrace(AgentSpan otherSpan) { - return null != otherSpan && getTraceId().equals(otherSpan.getTraceId()); - } - - @Override - public String toString() { - return "ExtractedSpan{spanContext=" + this.spanContext + '}'; - } - } - - public static class NoopAgentSpan implements AgentSpan { - public static final NoopAgentSpan INSTANCE = new NoopAgentSpan(); - - private NoopAgentSpan() {} - - @Override - public DDTraceId getTraceId() { - return DDTraceId.ZERO; - } - - @Override - public long getSpanId() { - return DDSpanId.ZERO; - } - - @Override - public AgentSpan setTag(final String key, final boolean value) { - return this; - } - - @Override - public void setRequestBlockingAction(Flow.Action.RequestBlockingAction rba) {} - - @Override - public Flow.Action.RequestBlockingAction getRequestBlockingAction() { - return null; - } - - @Override - public AgentSpan setTag(final String tag, final Number value) { - return this; - } - - @Override - public boolean isError() { - return false; - } - - @Override - public AgentSpan setTag(final String key, final int value) { - return this; - } - - @Override - public AgentSpan setTag(final String key, final long value) { - return this; - } - - @Override - public AgentSpan setTag(final String key, final double value) { - return this; - } - - @Override - public AgentSpan setTag(final String key, final Object value) { - return this; - } - - @Override - public AgentSpan setAllTags(Map map) { - return this; - } - - @Override - public AgentSpan setMetric(final CharSequence key, final int value) { - return this; - } - - @Override - public AgentSpan setMetric(final CharSequence key, final long value) { - return this; - } - - @Override - public AgentSpan setMetric(final CharSequence key, final double value) { - return this; - } - - @Override - public Object getTag(final String key) { - return null; - } - - @Override - public long getStartTime() { - return 0; - } - - @Override - public long getDurationNano() { - return 0; - } - - @Override - public String getOperationName() { - return null; - } - - @Override - public AgentSpan setOperationName(final CharSequence serviceName) { - return this; - } - - @Override - public String getServiceName() { - return null; - } - - @Override - public AgentSpan setServiceName(final String serviceName) { - return this; - } - - @Override - public CharSequence getResourceName() { - return null; - } - - @Override - public AgentSpan setResourceName(final CharSequence resourceName) { - return this; - } - - @Override - public AgentSpan setResourceName(final CharSequence resourceName, byte priority) { - return this; - } - - @Override - public boolean eligibleForDropping() { - return true; - } - - @Override - public RequestContext getRequestContext() { - return RequestContext.Noop.INSTANCE; - } - - @Override - public Integer forceSamplingDecision() { - return null; - } - - @Override - public AgentSpan setSamplingPriority(int newPriority, int samplingMechanism) { - return this; - } - - @Override - public Integer getSamplingPriority() { - return (int) PrioritySampling.UNSET; - } - - @Override - public AgentSpan setSamplingPriority(final int newPriority) { - return this; - } - - @Override - public String getSpanType() { - return null; - } - - @Override - public AgentSpan setSpanType(final CharSequence type) { - return this; - } - - @Override - public Map getTags() { - return Collections.emptyMap(); - } - - @Override - public AgentSpan setTag(final String key, final String value) { - return this; - } - - @Override - public AgentSpan setTag(final String key, final CharSequence value) { - return this; - } - - @Override - public AgentSpan setError(final boolean error) { - return this; - } - - @Override - public AgentSpan setError(boolean error, byte priority) { - return this; - } - - @Override - public AgentSpan setMeasured(boolean measured) { - return this; - } - - @Override - public AgentSpan getRootSpan() { - return this; - } - - @Override - public AgentSpan setErrorMessage(final String errorMessage) { - return this; - } - - @Override - public AgentSpan addThrowable(final Throwable throwable) { - return this; - } - - @Override - public AgentSpan addThrowable(Throwable throwable, byte errorPriority) { - return this; - } - - @Override - public AgentSpan setHttpStatusCode(int statusCode) { - return this; - } - - @Override - public short getHttpStatusCode() { - return 0; - } - - @Override - public AgentSpan getLocalRootSpan() { - return this; - } - - @Override - public boolean isSameTrace(final AgentSpan otherSpan) { - return otherSpan == INSTANCE; - } - - @Override - public AgentSpanContext context() { - return NoopContext.INSTANCE; - } - - @Override - public String getBaggageItem(final String key) { - return null; - } - - @Override - public AgentSpan setBaggageItem(final String key, final String value) { - return this; - } - - @Override - public void finish() {} - - @Override - public void finish(final long finishMicros) {} - - @Override - public void finishWithDuration(final long durationNanos) {} - - @Override - public void beginEndToEnd() {} - - @Override - public void finishWithEndToEnd() {} - - @Override - public boolean phasedFinish() { - return false; - } - - @Override - public void publish() {} - - @Override - public String getSpanName() { - return ""; - } - - @Override - public void setSpanName(final CharSequence spanName) {} - - @Override - public boolean hasResourceName() { - return false; - } - - @Override - public byte getResourceNamePriority() { - return Byte.MAX_VALUE; - } - - @Override - public TraceConfig traceConfig() { - return NoopTraceConfig.INSTANCE; - } - - @Override - public void addLink(AgentSpanLink link) {} - - @Override - public AgentSpan setMetaStruct(String field, Object value) { - return this; - } - - @Override - public boolean isOutbound() { - return false; - } - - @Override - public boolean isRequiresPostProcessing() { - return false; - } - - @Override - public void setRequiresPostProcessing(boolean requiresPostProcessing) {} - } - - public static final class NoopAgentScope implements AgentScope { - public static final NoopAgentScope INSTANCE = new NoopAgentScope(); - - private NoopAgentScope() {} - - @Override - public AgentSpan span() { - return NoopAgentSpan.INSTANCE; - } - - @Override - public byte source() { - return 0; - } - - @Override - public void setAsyncPropagation(final boolean value) {} - - @Override - public AgentScope.Continuation capture() { - return NoopContinuation.INSTANCE; - } - - @Override - public void close() {} - - @Override - public boolean isAsyncPropagating() { - return false; - } - } - static class NoopAgentPropagation implements AgentPropagation { static final NoopAgentPropagation INSTANCE = new NoopAgentPropagation(); @@ -1039,7 +615,7 @@ public void injectPathwayContextWithoutSendingStats( @Override public AgentSpanContext.Extracted extract(final C carrier, final ContextVisitor getter) { - return NoopContext.INSTANCE; + return NoopSpanContext.INSTANCE; } } @@ -1053,140 +629,18 @@ public AgentScope.Continuation hold() { @Override public AgentScope activate() { - return NoopAgentScope.INSTANCE; + return NoopScope.INSTANCE; } @Override public AgentSpan getSpan() { - return NoopAgentSpan.INSTANCE; + return NoopSpan.INSTANCE; } @Override public void cancel() {} } - public static final class BlackholeContext extends NoopContext { - public static final BlackholeContext INSTANCE = new BlackholeContext(); - - private BlackholeContext() {} - } - - public static class NoopContext implements AgentSpanContext.Extracted { - public static final NoopContext INSTANCE = new NoopContext(); - - private NoopContext() {} - - @Override - public DDTraceId getTraceId() { - return DDTraceId.ZERO; - } - - @Override - public long getSpanId() { - return DDSpanId.ZERO; - } - - @Override - public AgentTraceCollector getTraceCollector() { - return NoopAgentTraceCollector.INSTANCE; - } - - @Override - public int getSamplingPriority() { - return PrioritySampling.UNSET; - } - - @Override - public Iterable> baggageItems() { - return emptyList(); - } - - @Override - public PathwayContext getPathwayContext() { - return NoopPathwayContext.INSTANCE; - } - - @Override - public List getTerminatedContextLinks() { - return emptyList(); - } - - @Override - public String getForwarded() { - return null; - } - - @Override - public String getFastlyClientIp() { - return null; - } - - @Override - public String getCfConnectingIp() { - return null; - } - - @Override - public String getCfConnectingIpv6() { - return null; - } - - @Override - public String getXForwardedProto() { - return null; - } - - @Override - public String getXForwardedHost() { - return null; - } - - @Override - public String getXForwardedPort() { - return null; - } - - @Override - public String getForwardedFor() { - return null; - } - - @Override - public String getXForwardedFor() { - return null; - } - - @Override - public String getXClusterClientIp() { - return null; - } - - @Override - public String getXRealIp() { - return null; - } - - @Override - public String getXClientIp() { - return null; - } - - @Override - public String getUserAgent() { - return null; - } - - @Override - public String getTrueClientIp() { - return null; - } - - @Override - public String getCustomIpHeader() { - return null; - } - } - public static class NoopAgentTraceCollector implements AgentTraceCollector { public static final NoopAgentTraceCollector INSTANCE = new NoopAgentTraceCollector(); diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/BlackHoleSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/BlackHoleSpan.java new file mode 100644 index 00000000000..578dd7b04ae --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/BlackHoleSpan.java @@ -0,0 +1,35 @@ +package datadog.trace.bootstrap.instrumentation.api; + +import datadog.trace.api.DDTraceId; + +/** An {@link AgentSpan} implementation that stops context propagation. */ +public final class BlackHoleSpan extends NoopSpan { + private final DDTraceId traceId; + + public BlackHoleSpan(final DDTraceId traceId) { + this.traceId = traceId; + } + + @Override + public boolean isSameTrace(final AgentSpan otherSpan) { + return otherSpan != null + && ((traceId != null && traceId.equals(otherSpan.getTraceId())) + || otherSpan.getTraceId() == null); + } + + @Override + public DDTraceId getTraceId() { + return traceId; + } + + @Override + public AgentSpanContext context() { + return Context.INSTANCE; + } + + public static final class Context extends NoopSpanContext { + public static final Context INSTANCE = new Context(); + + private Context() {} + } +} diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ExtractedSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ExtractedSpan.java new file mode 100644 index 00000000000..84b9d55ecd1 --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ExtractedSpan.java @@ -0,0 +1,171 @@ +package datadog.trace.bootstrap.instrumentation.api; + +import datadog.trace.api.DDTraceId; +import datadog.trace.api.TraceConfig; +import datadog.trace.api.gateway.Flow.Action.RequestBlockingAction; +import datadog.trace.api.gateway.RequestContext; +import java.util.Collections; +import java.util.Map; + +/** + * An {@link AgentSpan} implementation that represents a remote span from an extracted span context. + * + *

Tags and baggage access are inefficient and only supported as remediation for products storing + * propagated information into span context, until they migrate to the new context API. + */ +class ExtractedSpan extends ImmutableSpan { + private final AgentSpanContext spanContext; + + ExtractedSpan(AgentSpanContext spanContext) { + this.spanContext = spanContext; + } + + @Override + public DDTraceId getTraceId() { + return this.spanContext.getTraceId(); + } + + @Override + public long getSpanId() { + return this.spanContext.getSpanId(); + } + + @Override + public AgentSpan getRootSpan() { + return this; + } + + @Override + public AgentSpan getLocalRootSpan() { + return this; + } + + @Override + public boolean isError() { + return false; + } + + @Override + public short getHttpStatusCode() { + return 0; + } + + @Override + public CharSequence getSpanName() { + return ""; + } + + @Override + public boolean hasResourceName() { + return false; + } + + @Override + public byte getResourceNamePriority() { + return Byte.MAX_VALUE; + } + + @Override + public long getStartTime() { + return 0; + } + + @Override + public long getDurationNano() { + return 0; + } + + @Override + public CharSequence getOperationName() { + return null; + } + + @Override + public String getServiceName() { + return ""; + } + + @Override + public CharSequence getResourceName() { + return null; + } + + @Override + public Integer getSamplingPriority() { + return this.spanContext.getSamplingPriority(); + } + + @Override + public String getSpanType() { + return null; + } + + @Override + public boolean isOutbound() { + return false; + } + + @Override + public Object getTag(final String tag) { + if (this.spanContext instanceof TagContext) { + return ((TagContext) this.spanContext).getTags().get(tag); + } + return null; + } + + @Override + public Map getTags() { + if (this.spanContext instanceof TagContext) { + Map tags = ((TagContext) this.spanContext).getTags(); + //noinspection unchecked,rawtypes + return (Map) tags; + } + return Collections.emptyMap(); + } + + @Override + public String getBaggageItem(final String key) { + Iterable> baggage = this.spanContext.baggageItems(); + for (Map.Entry stringStringEntry : baggage) { + if (stringStringEntry.getKey().equals(key)) { + return stringStringEntry.getValue(); + } + } + return null; + } + + @Override + public AgentSpanContext context() { + return this.spanContext; + } + + @Override + public TraceConfig traceConfig() { + return null; + } + + @Override + public boolean isSameTrace(AgentSpan otherSpan) { + return null != otherSpan && getTraceId().equals(otherSpan.getTraceId()); + } + + @Override + public RequestContext getRequestContext() { + return RequestContext.Noop.INSTANCE; + } + + @Override + public RequestBlockingAction getRequestBlockingAction() { + return null; + } + + @Override + public boolean isRequiresPostProcessing() { + return false; + } + + @Override + public String toString() { + return "ExtractedSpan{spanContext=" + this.spanContext + '}'; + } +} diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java new file mode 100644 index 00000000000..620d51b57a1 --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/ImmutableSpan.java @@ -0,0 +1,193 @@ +package datadog.trace.bootstrap.instrumentation.api; + +import datadog.trace.api.gateway.Flow.Action.RequestBlockingAction; +import datadog.trace.api.interceptor.MutableSpan; +import java.util.Map; + +/** + * An abstract implementation of an {@link AgentSpan} with disabled mutators. + * + *

As {@link AgentSpan} is a {@link MutableSpan} by design, this implementation offers an + * alternative to provide read-only span implementations. + */ +public abstract class ImmutableSpan implements AgentSpan { + @Override + public AgentSpan setTag(String key, boolean value) { + return this; + } + + @Override + public AgentSpan setTag(String key, int value) { + return this; + } + + @Override + public AgentSpan setTag(String key, long value) { + return this; + } + + @Override + public AgentSpan setTag(String key, double value) { + return this; + } + + @Override + public AgentSpan setTag(String key, String value) { + return this; + } + + @Override + public AgentSpan setTag(String key, CharSequence value) { + return this; + } + + @Override + public AgentSpan setTag(String key, Object value) { + return this; + } + + @Override + public AgentSpan setAllTags(Map map) { + return this; + } + + @Override + public AgentSpan setTag(String key, Number value) { + return this; + } + + @Override + public AgentSpan setMetric(CharSequence key, int value) { + return this; + } + + @Override + public AgentSpan setMetric(CharSequence key, long value) { + return this; + } + + @Override + public AgentSpan setMetric(CharSequence key, double value) { + return this; + } + + @Override + public AgentSpan setSpanType(CharSequence type) { + return this; + } + + @Override + public AgentSpan setError(boolean error) { + return this; + } + + @Override + public AgentSpan setError(boolean error, byte priority) { + return this; + } + + @Override + public AgentSpan setMeasured(boolean measured) { + return this; + } + + @Override + public AgentSpan setErrorMessage(String errorMessage) { + return this; + } + + @Override + public AgentSpan addThrowable(Throwable throwable) { + return this; + } + + @Override + public AgentSpan addThrowable(Throwable throwable, byte errorPriority) { + return this; + } + + @Override + public AgentSpan setBaggageItem(String key, String value) { + return null; + } + + @Override + public AgentSpan setHttpStatusCode(int statusCode) { + return this; + } + + @Override + public void finish() {} + + @Override + public void finish(long finishMicros) {} + + @Override + public void finishWithDuration(long durationNanos) {} + + @Override + public void beginEndToEnd() {} + + @Override + public void finishWithEndToEnd() {} + + @Override + public boolean phasedFinish() { + return false; + } + + @Override + public void publish() {} + + @Override + public void setSpanName(CharSequence spanName) {} + + @Override + public MutableSpan setOperationName(CharSequence serviceName) { + return this; + } + + @Override + public MutableSpan setServiceName(String serviceName) { + return this; + } + + @Override + public AgentSpan setResourceName(CharSequence resourceName) { + return this; + } + + @Override + public MutableSpan setSamplingPriority(int newPriority) { + return null; + } + + @Override + public AgentSpan setResourceName(CharSequence resourceName, byte priority) { + return null; + } + + @Override + public Integer forceSamplingDecision() { + return null; + } + + @Override + public AgentSpan setSamplingPriority(int newPriority, int samplingMechanism) { + return this; + } + + @Override + public void addLink(AgentSpanLink link) {} + + @Override + public AgentSpan setMetaStruct(String field, Object value) { + return this; + } + + @Override + public void setRequestBlockingAction(RequestBlockingAction rba) {} + + @Override + public void setRequiresPostProcessing(boolean requiresPostProcessing) {} +} diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopScope.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopScope.java new file mode 100644 index 00000000000..a1d33e520e4 --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopScope.java @@ -0,0 +1,25 @@ +package datadog.trace.bootstrap.instrumentation.api; + +final class NoopScope implements AgentScope { + static final NoopScope INSTANCE = new NoopScope(); + + private NoopScope() {} + + @Override + public AgentSpan span() { + return NoopSpan.INSTANCE; + } + + @Override + public byte source() { + return 0; + } + + @Override + public Continuation capture() { + return AgentTracer.NoopContinuation.INSTANCE; + } + + @Override + public void close() {} +} diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopSpan.java new file mode 100644 index 00000000000..5d476c39b20 --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopSpan.java @@ -0,0 +1,147 @@ +package datadog.trace.bootstrap.instrumentation.api; + +import static java.util.Collections.emptyMap; + +import datadog.trace.api.DDSpanId; +import datadog.trace.api.DDTraceId; +import datadog.trace.api.TraceConfig; +import datadog.trace.api.gateway.Flow.Action.RequestBlockingAction; +import datadog.trace.api.gateway.RequestContext; +import datadog.trace.api.sampling.PrioritySampling; +import java.util.Map; + +class NoopSpan extends ImmutableSpan implements AgentSpan { + static final NoopSpan INSTANCE = new NoopSpan(); + + NoopSpan() {} + + @Override + public DDTraceId getTraceId() { + return DDTraceId.ZERO; + } + + @Override + public long getSpanId() { + return DDSpanId.ZERO; + } + + @Override + public RequestBlockingAction getRequestBlockingAction() { + return null; + } + + @Override + public boolean isError() { + return false; + } + + @Override + public Object getTag(final String key) { + return null; + } + + @Override + public long getStartTime() { + return 0; + } + + @Override + public long getDurationNano() { + return 0; + } + + @Override + public String getOperationName() { + return null; + } + + @Override + public String getServiceName() { + return null; + } + + @Override + public CharSequence getResourceName() { + return null; + } + + @Override + public RequestContext getRequestContext() { + return RequestContext.Noop.INSTANCE; + } + + @Override + public Integer getSamplingPriority() { + return (int) PrioritySampling.UNSET; + } + + @Override + public String getSpanType() { + return null; + } + + @Override + public Map getTags() { + return emptyMap(); + } + + @Override + public AgentSpan getRootSpan() { + return this; + } + + @Override + public short getHttpStatusCode() { + return 0; + } + + @Override + public AgentSpan getLocalRootSpan() { + return this; + } + + @Override + public boolean isSameTrace(final AgentSpan otherSpan) { + return otherSpan == INSTANCE; + } + + @Override + public AgentSpanContext context() { + return NoopSpanContext.INSTANCE; + } + + @Override + public String getBaggageItem(final String key) { + return null; + } + + @Override + public String getSpanName() { + return ""; + } + + @Override + public boolean hasResourceName() { + return false; + } + + @Override + public byte getResourceNamePriority() { + return Byte.MAX_VALUE; + } + + @Override + public TraceConfig traceConfig() { + return AgentTracer.NoopTraceConfig.INSTANCE; + } + + @Override + public boolean isOutbound() { + return false; + } + + @Override + public boolean isRequiresPostProcessing() { + return false; + } +} diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopSpanContext.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopSpanContext.java new file mode 100644 index 00000000000..01cb0c4479d --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopSpanContext.java @@ -0,0 +1,125 @@ +package datadog.trace.bootstrap.instrumentation.api; + +import static java.util.Collections.emptyList; + +import datadog.trace.api.DDSpanId; +import datadog.trace.api.DDTraceId; +import datadog.trace.api.sampling.PrioritySampling; +import java.util.List; +import java.util.Map; + +class NoopSpanContext implements AgentSpanContext.Extracted { + static final NoopSpanContext INSTANCE = new NoopSpanContext(); + + NoopSpanContext() {} + + @Override + public DDTraceId getTraceId() { + return DDTraceId.ZERO; + } + + @Override + public long getSpanId() { + return DDSpanId.ZERO; + } + + @Override + public AgentTraceCollector getTraceCollector() { + return AgentTracer.NoopAgentTraceCollector.INSTANCE; + } + + @Override + public int getSamplingPriority() { + return PrioritySampling.UNSET; + } + + @Override + public Iterable> baggageItems() { + return emptyList(); + } + + @Override + public PathwayContext getPathwayContext() { + return AgentTracer.NoopPathwayContext.INSTANCE; + } + + @Override + public List getTerminatedContextLinks() { + return emptyList(); + } + + @Override + public String getForwarded() { + return null; + } + + @Override + public String getFastlyClientIp() { + return null; + } + + @Override + public String getCfConnectingIp() { + return null; + } + + @Override + public String getCfConnectingIpv6() { + return null; + } + + @Override + public String getXForwardedProto() { + return null; + } + + @Override + public String getXForwardedHost() { + return null; + } + + @Override + public String getXForwardedPort() { + return null; + } + + @Override + public String getForwardedFor() { + return null; + } + + @Override + public String getXForwardedFor() { + return null; + } + + @Override + public String getXClusterClientIp() { + return null; + } + + @Override + public String getXRealIp() { + return null; + } + + @Override + public String getXClientIp() { + return null; + } + + @Override + public String getUserAgent() { + return null; + } + + @Override + public String getTrueClientIp() { + return null; + } + + @Override + public String getCustomIpHeader() { + return null; + } +} diff --git a/internal-api/src/test/groovy/datadog/trace/bootstrap/instrumentation/api/ExtractedSpanTest.groovy b/internal-api/src/test/groovy/datadog/trace/bootstrap/instrumentation/api/ExtractedSpanTest.groovy index 6356b9fc07e..ca1957ad6e0 100644 --- a/internal-api/src/test/groovy/datadog/trace/bootstrap/instrumentation/api/ExtractedSpanTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/bootstrap/instrumentation/api/ExtractedSpanTest.groovy @@ -1,7 +1,6 @@ package datadog.trace.bootstrap.instrumentation.api import datadog.trace.api.DDTraceId -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.ExtractedSpan import spock.lang.Specification class ExtractedSpanTest extends Specification { diff --git a/internal-api/src/test/java/datadog/trace/api/gateway/InstrumentationGatewayTest.java b/internal-api/src/test/java/datadog/trace/api/gateway/InstrumentationGatewayTest.java index 6029c9dbaf1..85e88df9600 100644 --- a/internal-api/src/test/java/datadog/trace/api/gateway/InstrumentationGatewayTest.java +++ b/internal-api/src/test/java/datadog/trace/api/gateway/InstrumentationGatewayTest.java @@ -339,7 +339,7 @@ public void universalCallbackProviderForRequestEnded() { BiFunction> cb = (requestContext, igSpanInfo) -> { assertThat(requestContext).isSameAs(callback.ctxt); - assertThat(igSpanInfo).isSameAs(AgentTracer.NoopAgentSpan.INSTANCE); + assertThat(igSpanInfo).isSameAs(AgentTracer.noopSpan()); count[0]++; return new Flow.ResultFlow<>(null); }; @@ -347,7 +347,7 @@ public void universalCallbackProviderForRequestEnded() { ssIast.registerCallback(events.requestEnded(), cb); BiFunction> uniCb = gateway.getUniversalCallbackProvider().getCallback(events.requestEnded()); - Flow res = uniCb.apply(callback.ctxt, AgentTracer.NoopAgentSpan.INSTANCE); + Flow res = uniCb.apply(callback.ctxt, AgentTracer.noopSpan()); assertThat(count[0]).isEqualTo(2); assertThat(res).isNotNull();