diff --git a/components/context/src/main/java/datadog/context/ThreadLocalContextManager.java b/components/context/src/main/java/datadog/context/ThreadLocalContextManager.java index 27c17445d14..d9f964c8733 100644 --- a/components/context/src/main/java/datadog/context/ThreadLocalContextManager.java +++ b/components/context/src/main/java/datadog/context/ThreadLocalContextManager.java @@ -15,6 +15,8 @@ public ContextScope attach(Context context) { Context[] holder = CURRENT_HOLDER.get(); Context previous = holder[0]; holder[0] = context; + + System.out.println("ThreadLocalContextManager"); return new ContextScope() { private boolean closed; diff --git a/components/context/src/main/java/datadog/context/propagation/CompositePropagator.java b/components/context/src/main/java/datadog/context/propagation/CompositePropagator.java index 9484b2a8054..3a3ca6403f2 100644 --- a/components/context/src/main/java/datadog/context/propagation/CompositePropagator.java +++ b/components/context/src/main/java/datadog/context/propagation/CompositePropagator.java @@ -27,7 +27,9 @@ public Context extract(Context context, C carrier, CarrierVisitor visitor // Run the multiple extractions on cache for (Propagator propagator : this.propagators) { context = propagator.extract(context, carrierCache, carrierCache); + System.out.println("Propagator: " + propagator + " context: " + context); } + System.out.println("Context after composite propagator: " + context); return context; } diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java index 29e33a3dd8c..e5b6ff931f7 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java @@ -8,6 +8,8 @@ import static datadog.trace.bootstrap.instrumentation.decorator.http.HttpResourceDecorator.HTTP_RESOURCE_DECORATOR; import datadog.appsec.api.blocking.BlockingException; +import datadog.context.Context; +import datadog.context.propagation.Propagators; import datadog.trace.api.Config; import datadog.trace.api.DDTags; import datadog.trace.api.function.TriConsumer; @@ -132,6 +134,16 @@ public AgentSpanContext.Extracted extract(REQUEST_CARRIER carrier) { return extractContextAndGetSpanContext(carrier, getter); } + public Context extract(REQUEST_CARRIER carrier, boolean temp) { + AgentPropagation.ContextVisitor getter = getter(); + if (null == carrier || null == getter) { + return null; + } + Context context = Propagators.defaultPropagator().extract(Context.root(), carrier, getter); + System.out.println("context in extract: " + context); + return context; + } + /** Deprecated. Use {@link #startSpan(String, Object, AgentSpanContext.Extracted)} instead. */ @Deprecated public AgentSpan startSpan(REQUEST_CARRIER carrier, AgentSpanContext.Extracted context) { diff --git a/dd-java-agent/instrumentation/akka-http/akka-http-10.6/src/main/java11/datadog/trace/instrumentation/akkahttp106/SingleRequestAdvice.java b/dd-java-agent/instrumentation/akka-http/akka-http-10.6/src/main/java11/datadog/trace/instrumentation/akkahttp106/SingleRequestAdvice.java index 105ac824f93..87b490ff882 100644 --- a/dd-java-agent/instrumentation/akka-http/akka-http-10.6/src/main/java11/datadog/trace/instrumentation/akkahttp106/SingleRequestAdvice.java +++ b/dd-java-agent/instrumentation/akka-http/akka-http-10.6/src/main/java11/datadog/trace/instrumentation/akkahttp106/SingleRequestAdvice.java @@ -8,6 +8,7 @@ import akka.http.scaladsl.HttpExt; import akka.http.scaladsl.model.HttpRequest; import akka.http.scaladsl.model.HttpResponse; +import datadog.context.Context; import datadog.trace.api.datastreams.DataStreamsContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; @@ -30,7 +31,7 @@ public static AgentScope methodEnter( if (request != null) { DataStreamsContext dsmContext = DataStreamsContext.fromTags(CLIENT_PATHWAY_EDGE_TAGS); - defaultPropagator().inject(span.with(dsmContext), request, headers); + defaultPropagator().inject(Context.current().with(span).with(dsmContext), request, headers); // Request is immutable, so we have to assign new value once we update headers request = headers.getRequest(); } diff --git a/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java b/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java index fa9b076cae8..929ee53aa19 100644 --- a/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java +++ b/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java @@ -8,9 +8,11 @@ import static datadog.trace.instrumentation.okhttp3.OkHttpClientDecorator.OKHTTP_REQUEST; import static datadog.trace.instrumentation.okhttp3.RequestBuilderInjectAdapter.SETTER; +import datadog.context.Context; import datadog.trace.api.datastreams.DataStreamsContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.Baggage; import java.io.IOException; import okhttp3.Interceptor; import okhttp3.Request; @@ -23,15 +25,30 @@ public Response intercept(final Chain chain) throws IOException { return chain.proceed(chain.request()); } + System.out.println("before activateSpan: " + Context.current().getClass()); final AgentSpan span = startSpan("okhttp", OKHTTP_REQUEST); - try (final AgentScope scope = activateSpan(span)) { + System.out.println("AgentScope: " + scope.getClass()); + System.out.println("scope.context(): " + scope.context().getClass()); + System.out.print("Context.current(): "); + System.out.println(Context.current() == Context.root()); + System.out.println(Context.current().getClass()); DECORATE.afterStart(span); DECORATE.onRequest(span, chain.request()); final Request.Builder requestBuilder = chain.request().newBuilder(); DataStreamsContext dsmContext = DataStreamsContext.fromTags(CLIENT_PATHWAY_EDGE_TAGS); - defaultPropagator().inject(span.with(dsmContext), requestBuilder, SETTER); + + Baggage baggage = Baggage.fromContext(Context.current()); + if (baggage != null) { + System.out.println("Baggage: " + baggage.getW3cHeader()); + } else { + System.out.println("null baggage"); + } + System.out.println("span: " + span); + System.out.println("span.with(baggage): " + span.with(baggage)); + defaultPropagator() + .inject(Context.current().with(span).with(dsmContext), requestBuilder, SETTER); final Response response; try { diff --git a/dd-java-agent/instrumentation/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java b/dd-java-agent/instrumentation/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java index 3ae2690d000..6a8e2436143 100644 --- a/dd-java-agent/instrumentation/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java +++ b/dd-java-agent/instrumentation/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java @@ -12,6 +12,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; +import datadog.context.Context; import datadog.trace.agent.tooling.ExcludeFilterProvider; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; @@ -122,15 +123,27 @@ public static AgentScope onService(@Advice.Argument(0) org.apache.coyote.Request return activateSpan((AgentSpan) existingSpan); } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(req); - req.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, extractedContext); + final Context extractedContext = DECORATE.extract(req, true); + AgentSpan extractedSpan = AgentSpan.fromContext(extractedContext); + AgentSpanContext.Extracted extractedSpanContext = + extractedSpan == null ? null : (AgentSpanContext.Extracted) extractedSpan.context(); + + req.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, extractedSpanContext); + + final AgentSpan span = DECORATE.startSpan(req, extractedSpanContext); + + System.out.println("ExtractedContext: " + extractedContext); + extractedContext.with(span); + final AgentScope scope = (AgentScope) extractedContext.attach(); + System.out.print("after attach: "); + System.out.println("Scope: " + scope); + System.out.println(Context.current().getClass()); - final AgentSpan span = DECORATE.startSpan(req, extractedContext); - final AgentScope scope = activateSpan(span); // This span is finished when Request.recycle() is called by RequestInstrumentation. DECORATE.afterStart(span); req.setAttribute(DD_SPAN_ATTRIBUTE, span); + req.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); req.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); return scope; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java b/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java index b7d32e7b9ea..2caf2fe95d9 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java @@ -61,10 +61,11 @@ public void inject(Context context, C carrier, CarrierSetter setter) { } String headerValue = baggage.getW3cHeader(); - if (headerValue != null) { - setter.set(carrier, BAGGAGE_KEY, headerValue); - return; - } + // if (headerValue != null) { + // System.out.println("Returning cached value immediately"); + // setter.set(carrier, BAGGAGE_KEY, headerValue); + // return; + // }e int processedItems = 0; int currentBytes = 0; @@ -162,6 +163,8 @@ private Map parseBaggageHeaders(String input) { @Override public void accept(String key, String value) { + System.out.println("key: " + key + " ;value: " + value); + // Only process tags that are relevant to baggage if (BAGGAGE_KEY.equalsIgnoreCase(key)) { Map baggage = parseBaggageHeaders(value); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/HttpCodec.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/HttpCodec.java index 9835d2e1c03..08a3b03d38a 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/HttpCodec.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/HttpCodec.java @@ -139,6 +139,7 @@ public static Extractor createExtractor( Config config, Supplier traceConfigSupplier) { final List extractors = new ArrayList<>(); for (final TracePropagationStyle style : config.getTracePropagationStylesToExtract()) { + System.out.println("TracePropagationStyle: " + style); switch (style) { case DATADOG: extractors.add(DatadogHttpCodec.newExtractor(config, traceConfigSupplier)); @@ -221,7 +222,8 @@ public TagContext extract( TagContext partialContext = null; // Extract and cache all headers in advance ExtractionCache extractionCache = new ExtractionCache<>(carrier, getter); - + System.out.println("extractors size: " + this.extractors.size()); + System.out.println("extractors size: " + this.extractors); for (final Extractor extractor : this.extractors) { TagContext extracted = extractor.extract(extractionCache, extractionCache); // Check if context is valid @@ -260,7 +262,7 @@ else if (extracted != null && partialContext == null) { partialContext = extracted; } } - + System.out.println("CompoundExtractor context: " + context); if (context != null) { log.debug("Extract complete context {}", context); return context; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/TracingPropagator.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/TracingPropagator.java index 89bb8ea5d59..88be6aa549b 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/TracingPropagator.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/TracingPropagator.java @@ -65,7 +65,9 @@ public Context extract(Context context, C carrier, CarrierVisitor visitor if (context == null || carrier == null || visitor == null) { return context; } + System.out.println("before httpcodec extract"); TagContext spanContext = this.extractor.extract(carrier, toContextVisitor(visitor)); + System.out.println("span context post tracing extract: " + spanContext); // If the extraction fails, return the original context if (spanContext == null) { return context; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScope.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScope.java index eb38e2289ff..a01a98689c8 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScope.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScope.java @@ -131,6 +131,7 @@ public final AgentSpan span() { @Override public Context context() { + System.out.println("Coming here"); return context; } 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 8e0cb9a7326..3db60832ba5 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 @@ -182,12 +182,13 @@ private AgentScope activate(final Context context) { // Inherit the async propagation from the active scope boolean asyncPropagation = top != null ? top.isAsyncPropagating() : DEFAULT_ASYNC_PROPAGATING; - + System.out.println("context in activate: " + context); final ContinuableScope scope = new ContinuableScope(this, context, CONTEXT, asyncPropagation, createScopeState(context)); scopeStack.push(scope); healthMetrics.onActivateScope(); + System.out.println("ContinuableScopeManager"); return scope; } diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index 01429f7f9fb..79d3e083bee 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -2356,11 +2356,13 @@ public boolean isTracePropagationExtractFirst() { } public boolean isBaggageExtract() { - return tracePropagationStylesToExtract.contains(TracePropagationStyle.BAGGAGE); + return tracePropagationStylesToExtract.contains(TracePropagationStyle.BAGGAGE) + && tracePropagationBehaviorExtract != TracePropagationBehaviorExtract.IGNORE; } public boolean isBaggageInject() { - return tracePropagationStylesToInject.contains(TracePropagationStyle.BAGGAGE); + return tracePropagationStylesToInject.contains(TracePropagationStyle.BAGGAGE) + && tracePropagationBehaviorExtract != TracePropagationBehaviorExtract.IGNORE; } public boolean isBaggagePropagationEnabled() { diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentPropagation.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentPropagation.java index a25c0abfee5..f572a27074e 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentPropagation.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentPropagation.java @@ -9,6 +9,7 @@ import datadog.context.propagation.Propagators; import java.util.function.BiConsumer; import javax.annotation.ParametersAreNonnullByDefault; +import javax.swing.*; public final class AgentPropagation { public static final Concern TRACING_CONCERN = named("tracing"); @@ -43,6 +44,7 @@ default void forEachKeyValue(C carrier, BiConsumer visitor) { forEachKey( carrier, (key, value) -> { + System.out.println("carrier key: " + key + " value: " + value); visitor.accept(key, value); return true; });