diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java new file mode 100644 index 00000000000..f1b7d303a68 --- /dev/null +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java @@ -0,0 +1,30 @@ +package datadog.trace.bootstrap.instrumentation.api; + +/** + * A helper for accessing methods that rely on new Java 8 bytecode features such as calling a static + * interface methods. In instrumentation, we may need to call these methods in code that is inlined + * into an instrumented class, however many times the instrumented class has been compiled to a + * previous version of bytecode, and so we cannot inline calls to static interface methods, as those + * were not supported prior to Java 8 and will lead to a class verification error. + */ +public class Java8BytecodeBridge { + /** @see AgentScope#noop() */ + public static AgentScope noopScope() { + return AgentScope.noop(); + } + + /** @see AgentSpanContext#noop() */ + public static AgentSpanContext noopSpanContext() { + return AgentSpanContext.noop(); + } + + /** @see AgentTracer#noopSpan() */ + public static AgentSpan noopSpan() { + return AgentTracer.noopSpan(); + } + + /** @see AgentTracer#blackholeSpan() */ + public static AgentSpan blackHoleSpan() { + return AgentTracer.blackholeSpan(); + } +} 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 73028d59e8b..56561adec28 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 @@ -1,10 +1,10 @@ package datadog.trace.bootstrap.instrumentation.java.concurrent; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import static datadog.trace.bootstrap.instrumentation.java.concurrent.ContinuationClaim.CLAIMED; 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 +32,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() == noopSpan()) { 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..3339d51b774 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 @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.aws.v0; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static datadog.trace.api.DDSpanId.ZERO; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; import static datadog.trace.instrumentation.aws.v0.OnErrorDecorator.DECORATE; import static datadog.trace.instrumentation.aws.v0.OnErrorDecorator.SPAN_CONTEXT_KEY; @@ -12,7 +13,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 +50,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().getSpanId() == ZERO)) { 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..b47467262ff 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 @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.aws.v0; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static datadog.trace.api.DDSpanId.ZERO; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; import static datadog.trace.instrumentation.aws.v0.OnErrorDecorator.DECORATE; import static datadog.trace.instrumentation.aws.v0.OnErrorDecorator.SPAN_CONTEXT_KEY; @@ -10,7 +11,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 +47,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().getSpanId() == ZERO)) { 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..efb13355a5d 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 @@ -4,9 +4,10 @@ import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.nameStartsWith; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.namedOneOf; +import static datadog.trace.api.DDSpanId.ZERO; 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.noopSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.noopSpan; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -15,7 +16,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 +76,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().getSpanId() == ZERO || 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..a0557728952 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.Java8BytecodeBridge.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..641e718a6ff 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.Java8BytecodeBridge.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/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..cf1920c410f 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,10 @@ package datadog.trace.instrumentation.opentelemetry; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; + 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 +17,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(AgentSpanContext.noop()); + noopScopeWrapper = new OtelScope(AgentScope.noop()); } 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 +43,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 +63,7 @@ public Scope toScope(final AgentScope scope) { attachableScopeWrapper.attachWrapper(otScope); return otScope; } - if (scope == AgentTracer.NoopAgentScope.INSTANCE) { + if (scope == AgentScope.noop()) { return noopScopeWrapper; } return new OtelScope(scope); @@ -73,7 +74,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 == AgentSpanContext.noop()) { return noopContextWrapper; } return new OtelSpanContext(context); @@ -83,6 +84,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 : AgentSpanContext.noop(); } } 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..00160dfc1ef 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,6 +2,8 @@ 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.AgentScope +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopPathwayContext import datadog.trace.bootstrap.instrumentation.api.ScopeSource @@ -16,7 +18,7 @@ class TypeConverterTest extends AgentTestRunner { TypeConverter typeConverter = new TypeConverter() def "should avoid the noop span wrapper allocation"() { - def noopAgentSpan = AgentTracer.NoopAgentSpan.INSTANCE + def noopAgentSpan = AgentTracer.noopSpan() expect: typeConverter.toSpan(noopAgentSpan) is typeConverter.toSpan(noopAgentSpan) } @@ -33,13 +35,13 @@ class TypeConverterTest extends AgentTestRunner { } def "should avoid the noop context wrapper allocation"() { - def noopContext = AgentTracer.NoopContext.INSTANCE + def noopContext = AgentSpanContext.noop() expect: typeConverter.toSpanContext(noopContext) is typeConverter.toSpanContext(noopContext) } def "should avoid the noop scope wrapper allocation"() { - def noopScope = AgentTracer.NoopAgentScope.INSTANCE + def noopScope = AgentScope.noop() 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..074cd6c5036 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,10 @@ package datadog.trace.instrumentation.opentracing31; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; + 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 +20,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(AgentSpanContext.noop()); + noopScopeWrapper = new OTScopeManager.OTScope(AgentScope.noop(), 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 +46,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 +69,7 @@ public Scope toScope(final AgentScope scope, final boolean finishSpanOnClose) { attachableScopeWrapper.attachWrapper(otScope); return otScope; } - if (scope == AgentTracer.NoopAgentScope.INSTANCE) { + if (scope == AgentScope.noop()) { return noopScopeWrapper; } return new OTScopeManager.OTScope(scope, finishSpanOnClose, this); @@ -79,7 +80,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 == AgentSpanContext.noop()) { return noopContextWrapper; } return new OTSpanContext(context); @@ -89,6 +90,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 : AgentSpanContext.noop(); } } 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..10fe9505b3e 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,6 +2,8 @@ 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.AgentScope +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopPathwayContext import datadog.trace.bootstrap.instrumentation.api.ScopeSource @@ -17,7 +19,7 @@ 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 = AgentTracer.noopSpan() expect: typeConverter.toSpan(noopAgentSpan) is typeConverter.toSpan(noopAgentSpan) } @@ -34,13 +36,13 @@ class TypeConverterTest extends AgentTestRunner { } def "should avoid the noop context wrapper allocation"() { - def noopContext = AgentTracer.NoopContext.INSTANCE + def noopContext = AgentSpanContext.noop() expect: typeConverter.toSpanContext(noopContext) is typeConverter.toSpanContext(noopContext) } def "should avoid the noop scope wrapper allocation"() { - def noopScope = AgentTracer.NoopAgentScope.INSTANCE + def noopScope = AgentScope.noop() 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..ef265cbf426 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,10 @@ package datadog.trace.instrumentation.opentracing32; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; + 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 +20,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(AgentSpanContext.noop()); + noopScopeWrapper = new OTScopeManager.OTScope(AgentScope.noop(), 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 +46,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 +69,7 @@ public Scope toScope(final AgentScope scope, final boolean finishSpanOnClose) { attachableScopeWrapper.attachWrapper(otScope); return otScope; } - if (scope == AgentTracer.NoopAgentScope.INSTANCE) { + if (scope == AgentScope.noop()) { return noopScopeWrapper; } return new OTScopeManager.OTScope(scope, finishSpanOnClose, this); @@ -79,7 +80,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 == AgentSpanContext.noop()) { return noopContextWrapper; } return new OTSpanContext(context); @@ -89,6 +90,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 : AgentSpanContext.noop(); } } 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..9cc0a2fcdf6 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,6 +2,8 @@ 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.AgentScope +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopPathwayContext import datadog.trace.bootstrap.instrumentation.api.ScopeSource @@ -17,7 +19,7 @@ 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 = AgentTracer.noopSpan() expect: typeConverter.toSpan(noopAgentSpan) is typeConverter.toSpan(noopAgentSpan) } @@ -34,13 +36,13 @@ class TypeConverterTest extends AgentTestRunner { } def "should avoid the noop context wrapper allocation"() { - def noopContext = AgentTracer.NoopContext.INSTANCE + def noopContext = AgentSpanContext.noop() expect: typeConverter.toSpanContext(noopContext) is typeConverter.toSpanContext(noopContext) } def "should avoid the noop scope wrapper allocation"() { - def noopScope = AgentTracer.NoopAgentScope.INSTANCE + def noopScope = AgentScope.noop() 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..83cb36b105b 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 @@ -12,7 +12,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 +54,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 AgentScope.noop(); } final AgentSpan clientSpan = @@ -78,8 +77,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 == AgentScope.noop() ? 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..07fcdd03d6c 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 @@ -12,7 +12,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 +50,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 AgentScope.noop(); } 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..52ba462f6f5 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 @@ -9,7 +9,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 +54,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) : AgentScope.noop()) { 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..f5e161c366a 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 @@ -8,7 +8,6 @@ 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 +48,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) : AgentScope.noop()) { 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..cf8b92bd8ed 100644 --- a/dd-java-agent/testing/src/test/groovy/AgentTestRunnerTest.groovy +++ b/dd-java-agent/testing/src/test/groovy/AgentTestRunnerTest.groovy @@ -113,7 +113,7 @@ class AgentTestRunnerTest extends AgentTestRunner { when: AgentScope scope runUnderTrace("parent") { - scope = TEST_TRACER.activateSpan(AgentTracer.NoopAgentSpan.INSTANCE, ScopeSource.INSTRUMENTATION) + scope = TEST_TRACER.activateSpan(TEST_TRACER.noopSpan(), ScopeSource.INSTRUMENTATION) blockUntilChildSpansFinished(1) } 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 bc31ee1722b..73c0c9456ea 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,7 @@ 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.noopSpan; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; @@ -12,7 +12,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 +115,7 @@ private AgentScope activate( if (depthLimit <= currentDepth) { healthMetrics.onScopeStackOverflow(); log.debug("Scope depth limit exceeded ({}). Returning NoopScope.", currentDepth); - return AgentTracer.NoopAgentScope.INSTANCE; + return AgentScope.noop(); } assert span != null; @@ -192,7 +191,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 AgentScope.noop(); } assert span != null; @@ -243,7 +242,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/tagprocessor/SpanPointersProcessor.java b/dd-trace-core/src/main/java/datadog/trace/core/tagprocessor/SpanPointersProcessor.java index 685ad55fa89..62c83891c64 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 @@ -4,8 +4,8 @@ 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.AgentSpanContext; 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,7 +57,7 @@ public Map processTags( .put("link.kind", LINK_KIND) .build(); - AgentTracer.NoopContext zeroContext = AgentTracer.NoopContext.INSTANCE; + AgentSpanContext zeroContext = AgentSpanContext.noop(); AgentSpanLink link = SpanLink.from(zeroContext, AgentSpanLink.DEFAULT_FLAGS, "", attributes); spanLinks.add(link); } catch (Exception e) { 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..6cf30c4b923 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 @@ -41,7 +40,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 +71,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 +91,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { span = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName("foo") .withResourceName(expectedResource) .withServiceName(expectedService) @@ -114,7 +113,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 +147,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { DDSpan span = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName("foo") .withStartTimestamp(expectedTimestamp) .start() @@ -160,7 +159,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 +186,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { final DDSpan span = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName("foo") .asChildOf(mockedContext) .start() @@ -202,14 +201,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()) + tracer.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 +243,7 @@ class CoreSpanBuilderTest extends DDCoreSpecification { final DDSpan parent = tracer - .buildSpan(expectedName) + .buildSpan("test", expectedName) .withServiceName("foo") .withResourceName(expectedParentResourceName) .withSpanType(expectedParentType) @@ -255,7 +254,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 +271,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 +294,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 +318,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 +344,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 +369,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 +403,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 +426,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 +437,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..d4bb60c7333 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,8 +3,6 @@ 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 @@ -16,9 +14,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 +25,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 == AgentScope.noop() when: "activate a noop scope over the limit" - scope = scopeManager.activate(NoopAgentSpan.INSTANCE, ScopeSource.MANUAL) + scope = scopeManager.activate(tracer.noopSpan(), ScopeSource.MANUAL) then: "still have a noop instance" - scope instanceof NoopAgentScope + scope == AgentScope.noop() and: "scope stack not effected." scopeManager.scopeStack().depth() == depth @@ -57,9 +55,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 +66,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 != AgentScope.noop() scopeManager.scopeStack().depth() == defaultLimit + 1 when: "activate a noop span" - scope = scopeManager.activate(NoopAgentSpan.INSTANCE, ScopeSource.MANUAL) + scope = scopeManager.activate(tracer.noopSpan(), ScopeSource.MANUAL) then: "a real instance is still returned" - !(scope instanceof NoopAgentScope) + scope != AgentScope.noop() and: "scope stack not effected." scopeManager.scopeStack().depth() == defaultLimit + 2 @@ -101,10 +99,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 f63a4134158..ea442827faf 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 @@ -84,7 +83,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 +120,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 +154,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(tracer.noopSpan(), ScopeSource.INSTRUMENTATION) then: scopeManager.active() == scope @@ -170,7 +169,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 +179,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 +209,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 +231,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 = tracer.noopSpan() def childScope = tracer.activateSpan(childSpan) then: @@ -1062,7 +1061,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..8318cc87efb 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,10 @@ package datadog.opentracing; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; + 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 +19,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(AgentSpanContext.noop()); + noopScopeWrapper = new OTScopeManager.OTScope(AgentScope.noop(), false, this); } public AgentSpan toAgentSpan(final Span span) { @@ -30,7 +31,7 @@ public AgentSpan toAgentSpan(final Span span) { return ((OTSpan) span).asAgentSpan(); } else { // NOOP Span - return AgentTracer.NoopAgentSpan.INSTANCE; + return noopSpan(); } } @@ -48,7 +49,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 +72,7 @@ public Scope toScope(final AgentScope scope, final boolean finishSpanOnClose) { attachableScopeWrapper.attachWrapper(otScope); return otScope; } - if (scope == AgentTracer.NoopAgentScope.INSTANCE) { + if (scope == AgentScope.noop()) { return noopScopeWrapper; } return new OTScopeManager.OTScope(scope, finishSpanOnClose, this); @@ -82,7 +83,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 == AgentSpanContext.noop()) { return noopContextWrapper; } return new OTSpanContext(context); @@ -94,7 +95,7 @@ public AgentSpanContext toContext(final SpanContext spanContext) { } else if (spanContext instanceof OTSpanContext) { return ((OTSpanContext) spanContext).getDelegate(); } else { - return AgentTracer.NoopContext.INSTANCE; + return AgentSpanContext.noop(); } } } 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..4496507eac2 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/TypeConverterTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/TypeConverterTest.groovy @@ -3,6 +3,8 @@ 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.AgentScope +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.ScopeSource import datadog.trace.core.CoreTracer @@ -19,7 +21,7 @@ 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 = AgentTracer.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 = AgentSpanContext.noop() expect: typeConverter.toSpanContext(noopContext) is typeConverter.toSpanContext(noopContext) } def "should avoid the noop scope wrapper allocation"() { - def noopScope = AgentTracer.NoopAgentScope.INSTANCE + def noopScope = AgentScope.noop() 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 396acd80140..f01cfe1f772 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 @@ -4,6 +4,18 @@ import java.io.Closeable; public interface AgentScope extends TraceScope, Closeable { + /** + * 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. + */ + static AgentScope noop() { + return NoopScope.INSTANCE; + } + AgentSpan span(); byte source(); 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..b703c970290 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 @@ -10,8 +10,6 @@ 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,18 +30,18 @@ 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(); @@ -165,8 +163,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/AgentSpanContext.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpanContext.java index 1f10c1ed24b..3257ad2dcfa 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpanContext.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpanContext.java @@ -13,6 +13,18 @@ * contextualize the associated Span instance. */ public interface AgentSpanContext { + /** + * 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. + */ + static AgentSpanContext noop() { + return NoopSpanContext.INSTANCE; + } + /** * Gets the TraceId of the span's trace. * 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 77876e922ab..31783a8eb64 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; @@ -264,9 +259,14 @@ AgentSpan startSpan( AgentPropagation propagate(); - AgentSpan noopSpan(); + default AgentSpan noopSpan() { + return NoopSpan.INSTANCE; + } - 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 +353,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 +367,7 @@ public AgentSpan startSpan( final String instrumentationName, final CharSequence spanName, final AgentSpanContext parent) { - return NoopAgentSpan.INSTANCE; + return NoopSpan.INSTANCE; } @Override @@ -376,18 +376,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 +408,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 @@ -428,12 +428,12 @@ public AgentPropagation propagate() { @Override public AgentSpan noopSpan() { - return NoopAgentSpan.INSTANCE; + return NoopSpan.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 +491,7 @@ public boolean addTraceInterceptor(final TraceInterceptor traceInterceptor) { @Override public TraceScope muteTracing() { - return NoopAgentScope.INSTANCE; + return NoopScope.INSTANCE; } @Override @@ -559,458 +559,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 AgentScope.Continuation captureConcurrent() { - return NoopContinuation.INSTANCE; - } - - @Override - public void close() {} - - @Override - public boolean isAsyncPropagating() { - return false; - } - } - static class NoopAgentPropagation implements AgentPropagation { static final NoopAgentPropagation INSTANCE = new NoopAgentPropagation(); @@ -1044,7 +592,7 @@ public void injectPathwayContextWithoutSendingStats( @Override public AgentSpanContext.Extracted extract(final C carrier, final ContextVisitor getter) { - return NoopContext.INSTANCE; + return NoopSpanContext.INSTANCE; } } @@ -1053,7 +601,7 @@ static class NoopContinuation implements AgentScope.Continuation { @Override public AgentScope activate() { - return NoopAgentScope.INSTANCE; + return NoopScope.INSTANCE; } @Override @@ -1061,129 +609,7 @@ public void cancel() {} @Override public AgentSpan getSpan() { - return NoopAgentSpan.INSTANCE; - } - } - - 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; + return NoopSpan.INSTANCE; } } 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..359e089143d --- /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 + 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 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..d6b08fa9c65 --- /dev/null +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/NoopScope.java @@ -0,0 +1,38 @@ +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 void setAsyncPropagation(final boolean value) {} + + @Override + public Continuation capture() { + return AgentTracer.NoopContinuation.INSTANCE; + } + + @Override + public Continuation captureConcurrent() { + return AgentTracer.NoopContinuation.INSTANCE; + } + + @Override + public void close() {} + + @Override + public boolean isAsyncPropagating() { + return false; + } +} 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();