Skip to content

Commit 13ced73

Browse files
amarzialidevflow.devflow-routing-intake
andauthored
Split tracing and context tracking in server and messaging integrations (#10767)
wip wip2 wip3 more instrumentations add more integrations Migrate netty server Fix jetty 12 advices Co-authored-by: devflow.devflow-routing-intake <devflow.devflow-routing-intake@kubernetes.us1.ddbuild.io>
1 parent 748292c commit 13ced73

File tree

45 files changed

+1007
-314
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1007
-314
lines changed

dd-java-agent/instrumentation/axis2-1.3/src/main/java/datadog/trace/instrumentation/axis2/AxisTransportInstrumentation.java

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package datadog.trace.instrumentation.axis2;
22

33
import static datadog.context.propagation.Propagators.defaultPropagator;
4+
import static datadog.trace.agent.tooling.InstrumenterModule.TargetSystem.CONTEXT_TRACKING;
45
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
56
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
7+
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
68
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
79
import static datadog.trace.instrumentation.axis2.AxisMessageDecorator.AXIS2_ASYNC_SPAN_KEY;
810
import static datadog.trace.instrumentation.axis2.AxisMessageDecorator.AXIS2_TRANSPORT;
@@ -12,11 +14,12 @@
1214
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1315

1416
import datadog.trace.agent.tooling.Instrumenter;
17+
import datadog.trace.agent.tooling.annotation.AppliesOn;
1518
import datadog.trace.api.InstrumenterConfig;
1619
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
1720
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
18-
import java.util.HashMap;
1921
import java.util.Map;
22+
import java.util.TreeMap;
2023
import net.bytebuddy.asm.Advice;
2124
import org.apache.axis2.context.MessageContext;
2225

@@ -38,11 +41,12 @@ public String configuredMatchingType() {
3841

3942
@Override
4043
public void methodAdvice(MethodTransformer transformer) {
41-
transformer.applyAdvice(
44+
transformer.applyAdvices(
4245
isMethod()
4346
.and(named("invoke"))
4447
.and(takesArgument(0, named("org.apache.axis2.context.MessageContext"))),
45-
getClass().getName() + "$TransportAdvice");
48+
getClass().getName() + "$TransportAdvice",
49+
getClass().getName() + "$TransportContextPropagationAdvice");
4650
}
4751

4852
public static final class TransportAdvice {
@@ -54,19 +58,6 @@ public static AgentScope beginTransport(@Advice.Argument(0) final MessageContext
5458
DECORATE.afterStart(span);
5559
DECORATE.onTransport(span, message);
5660
DECORATE.onMessage(span, message);
57-
58-
// the transport handler will copy TRANSPORT_HEADERS to the outgoing request
59-
@SuppressWarnings({"unchecked", "rawtypes"})
60-
Map<String, Object> headers = (Map) message.getProperty("TRANSPORT_HEADERS");
61-
if (null == headers) {
62-
headers = new HashMap<>();
63-
message.setProperty("TRANSPORT_HEADERS", headers);
64-
}
65-
try {
66-
defaultPropagator().inject(span, headers, SETTER);
67-
} catch (Throwable ignore) {
68-
}
69-
7061
return activateSpan(span);
7162
}
7263
return null;
@@ -100,4 +91,24 @@ public static void finishTransport(
10091
}
10192
}
10293
}
94+
95+
@AppliesOn(CONTEXT_TRACKING)
96+
public static final class TransportContextPropagationAdvice {
97+
@Advice.OnMethodEnter(suppress = Throwable.class)
98+
public static void onEnter(@Advice.Argument(0) final MessageContext message) {
99+
AgentSpan span = activeSpan();
100+
if (span == null) return;
101+
// the transport handler will copy TRANSPORT_HEADERS to the outgoing request
102+
@SuppressWarnings({"unchecked", "rawtypes"})
103+
Map<String, Object> headers = (Map) message.getProperty("TRANSPORT_HEADERS");
104+
if (null == headers) {
105+
headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
106+
message.setProperty("TRANSPORT_HEADERS", headers);
107+
}
108+
try {
109+
defaultPropagator().inject(span, headers, SETTER);
110+
} catch (Throwable ignore) {
111+
}
112+
}
113+
}
103114
}

dd-java-agent/instrumentation/azure-functions-1.2.2/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsInstrumentation.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package datadog.trace.instrumentation.azure.functions;
22

3+
import static datadog.trace.agent.tooling.InstrumenterModule.TargetSystem.CONTEXT_TRACKING;
34
import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.declaresMethod;
45
import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.isAnnotatedWith;
56
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
67
import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext;
8+
import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.getCurrentContext;
79
import static datadog.trace.bootstrap.instrumentation.decorator.http.HttpResourceDecorator.HTTP_RESOURCE_DECORATOR;
810
import static datadog.trace.instrumentation.azure.functions.AzureFunctionsDecorator.DECORATE;
911
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@@ -18,6 +20,7 @@
1820
import datadog.context.ContextScope;
1921
import datadog.trace.agent.tooling.Instrumenter;
2022
import datadog.trace.agent.tooling.InstrumenterModule;
23+
import datadog.trace.agent.tooling.annotation.AppliesOn;
2124
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
2225
import net.bytebuddy.asm.Advice;
2326
import net.bytebuddy.description.type.TypeDescription;
@@ -54,20 +57,36 @@ public String[] helperClassNames() {
5457
}
5558

5659
public void methodAdvice(MethodTransformer transformer) {
57-
transformer.applyAdvice(
60+
transformer.applyAdvices(
5861
isMethod()
5962
.and(isPublic())
6063
.and(takesArgument(0, named("com.microsoft.azure.functions.HttpRequestMessage")))
6164
.and(takesArgument(1, named("com.microsoft.azure.functions.ExecutionContext"))),
65+
AzureFunctionsInstrumentation.class.getName() + "$ContextTrackingAdvice",
6266
AzureFunctionsInstrumentation.class.getName() + "$AzureFunctionsAdvice");
6367
}
6468

69+
@AppliesOn(CONTEXT_TRACKING)
70+
public static class ContextTrackingAdvice {
71+
@Advice.OnMethodEnter(suppress = Throwable.class)
72+
public static ContextScope onEnter(@Advice.Argument(0) final HttpRequestMessage<?> request) {
73+
Context parentContext = DECORATE.extract(request);
74+
return parentContext.attach();
75+
}
76+
77+
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
78+
public static void closeScope(@Advice.Enter final ContextScope scope) {
79+
scope.close();
80+
}
81+
}
82+
6583
public static class AzureFunctionsAdvice {
6684
@Advice.OnMethodEnter(suppress = Throwable.class)
6785
public static ContextScope methodEnter(
6886
@Advice.Argument(0) final HttpRequestMessage<?> request,
6987
@Advice.Argument(1) final ExecutionContext executionContext) {
70-
final Context parentContext = DECORATE.extract(request);
88+
final Context parentContext =
89+
getCurrentContext(); // parent context attached by ContextTrackingAdvice
7190
final Context context = DECORATE.startSpan(request, parentContext);
7291
final AgentSpan span = fromContext(context);
7392
DECORATE.afterStart(span, executionContext.getFunctionName());

dd-java-agent/instrumentation/google-pubsub-1.116/src/main/java/datadog/trace/instrumentation/googlepubsub/PublisherInstrumentation.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package datadog.trace.instrumentation.googlepubsub;
22

33
import static datadog.context.propagation.Propagators.defaultPropagator;
4+
import static datadog.trace.agent.tooling.InstrumenterModule.TargetSystem.CONTEXT_TRACKING;
45
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
56
import static datadog.trace.api.datastreams.DataStreamsTags.Direction.OUTBOUND;
67
import static datadog.trace.api.datastreams.DataStreamsTags.create;
78
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
9+
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
810
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
911
import static datadog.trace.instrumentation.googlepubsub.PubSubDecorator.PRODUCER_DECORATE;
1012
import static datadog.trace.instrumentation.googlepubsub.PubSubDecorator.PUBSUB_PRODUCE;
@@ -14,6 +16,7 @@
1416
import com.google.cloud.pubsub.v1.Publisher;
1517
import com.google.pubsub.v1.PubsubMessage;
1618
import datadog.trace.agent.tooling.Instrumenter;
19+
import datadog.trace.agent.tooling.annotation.AppliesOn;
1720
import datadog.trace.api.datastreams.DataStreamsContext;
1821
import datadog.trace.api.datastreams.DataStreamsTags;
1922
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
@@ -30,25 +33,21 @@ public String instrumentedType() {
3033

3134
@Override
3235
public void methodAdvice(MethodTransformer transformer) {
33-
transformer.applyAdvice(isMethod().and(named("publish")), getClass().getName() + "$Wrap");
36+
transformer.applyAdvices(
37+
isMethod().and(named("publish")),
38+
getClass().getName() + "$Wrap",
39+
getClass().getName() + "$ContextPropagationAdvice");
3440
}
3541

3642
public static final class Wrap {
3743
@Advice.OnMethodEnter(suppress = Throwable.class)
38-
public static AgentScope before(
39-
@Advice.Argument(value = 0, readOnly = false) PubsubMessage msg,
40-
@Advice.This Publisher publisher) {
44+
public static AgentScope before(@Advice.This Publisher publisher) {
4145
final AgentSpan span = startSpan(PUBSUB_PRODUCE);
4246

4347
final CharSequence topicName = PRODUCER_DECORATE.extractTopic(publisher.getTopicNameString());
4448
PRODUCER_DECORATE.afterStart(span);
4549
PRODUCER_DECORATE.onProduce(span, topicName);
4650

47-
DataStreamsTags tags = create("google-pubsub", OUTBOUND, topicName.toString());
48-
PubsubMessage.Builder builder = msg.toBuilder();
49-
DataStreamsContext dsmContext = DataStreamsContext.fromTags(tags);
50-
defaultPropagator().inject(span.with(dsmContext), builder, SETTER);
51-
msg = builder.build();
5251
return activateSpan(span);
5352
}
5453

@@ -61,4 +60,24 @@ public static void stopSpan(
6160
scope.close();
6261
}
6362
}
63+
64+
@AppliesOn(CONTEXT_TRACKING)
65+
public static final class ContextPropagationAdvice {
66+
@Advice.OnMethodEnter(suppress = Throwable.class)
67+
public static void onEnter(
68+
@Advice.Argument(value = 0, readOnly = false) PubsubMessage msg,
69+
@Advice.This Publisher publisher) {
70+
AgentSpan span = activeSpan();
71+
if (span == null) return;
72+
DataStreamsTags tags =
73+
create(
74+
"google-pubsub",
75+
OUTBOUND,
76+
PRODUCER_DECORATE.extractTopic(publisher.getTopicNameString()).toString());
77+
PubsubMessage.Builder builder = msg.toBuilder();
78+
DataStreamsContext dsmContext = DataStreamsContext.fromTags(tags);
79+
defaultPropagator().inject(span.with(dsmContext), builder, SETTER);
80+
msg = builder.build();
81+
}
82+
}
6483
}

dd-java-agent/instrumentation/grizzly/grizzly-2.0/src/main/java/datadog/trace/instrumentation/grizzly/GrizzlyHttpHandlerInstrumentation.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package datadog.trace.instrumentation.grizzly;
22

3+
import static datadog.trace.agent.tooling.InstrumenterModule.TargetSystem.CONTEXT_TRACKING;
34
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
5+
import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.getCurrentContext;
46
import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext;
57
import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_CONTEXT_ATTRIBUTE;
68
import static datadog.trace.instrumentation.grizzly.GrizzlyDecorator.DECORATE;
@@ -10,6 +12,7 @@
1012
import datadog.context.Context;
1113
import datadog.context.ContextScope;
1214
import datadog.trace.agent.tooling.Instrumenter;
15+
import datadog.trace.agent.tooling.annotation.AppliesOn;
1316
import datadog.trace.api.CorrelationIdentifier;
1417
import datadog.trace.api.gateway.Flow;
1518
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
@@ -27,14 +30,37 @@ public String instrumentedType() {
2730

2831
@Override
2932
public void methodAdvice(MethodTransformer transformer) {
30-
transformer.applyAdvice(
33+
transformer.applyAdvices(
3134
isMethod()
3235
.and(named("doHandle"))
3336
.and(takesArgument(0, named("org.glassfish.grizzly.http.server.Request")))
3437
.and(takesArgument(1, named("org.glassfish.grizzly.http.server.Response"))),
38+
GrizzlyHttpHandlerInstrumentation.class.getName() + "$ContextTrackingAdvice",
3539
GrizzlyHttpHandlerInstrumentation.class.getName() + "$HandleAdvice");
3640
}
3741

42+
@AppliesOn(CONTEXT_TRACKING)
43+
public static class ContextTrackingAdvice {
44+
45+
@Advice.OnMethodEnter(suppress = Throwable.class)
46+
public static void onEnter(
47+
@Advice.Local("parentScope") ContextScope parentScope,
48+
@Advice.Argument(0) final Request request) {
49+
if (request.getAttribute(DD_CONTEXT_ATTRIBUTE) != null) {
50+
return; // re-entry: HandleAdvice will return false (no-op)
51+
}
52+
Context parentContext = DECORATE.extract(request);
53+
parentScope = parentContext.attach();
54+
}
55+
56+
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
57+
public static void closeScope(@Advice.Local("parentScope") ContextScope parentScope) {
58+
if (parentScope != null) {
59+
parentScope.close();
60+
}
61+
}
62+
}
63+
3864
public static class HandleAdvice {
3965

4066
@Advice.OnMethodEnter(suppress = Throwable.class, skipOn = Advice.OnNonDefaultValue.class)
@@ -46,7 +72,8 @@ public static class HandleAdvice {
4672
return false;
4773
}
4874

49-
final Context parentContext = DECORATE.extract(request);
75+
final Context parentContext =
76+
getCurrentContext(); // parent context attached by ContextTrackingAdvice
5077
final Context context = DECORATE.startSpan(request, parentContext);
5178
final AgentSpan span = spanFromContext(context);
5279
DECORATE.afterStart(span);

dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientCallImplInstrumentation.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package datadog.trace.instrumentation.grpc.client;
22

3+
import static datadog.trace.agent.tooling.InstrumenterModule.TargetSystem.CONTEXT_TRACKING;
34
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
45
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
6+
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
57
import static datadog.trace.instrumentation.grpc.client.GrpcClientDecorator.DECORATE;
68
import static datadog.trace.instrumentation.grpc.client.GrpcInjectAdapter.SETTER;
79
import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
810
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
911
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
1012

1113
import datadog.trace.agent.tooling.Instrumenter;
14+
import datadog.trace.agent.tooling.annotation.AppliesOn;
1215
import datadog.trace.bootstrap.InstrumentationContext;
1316
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
1417
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
@@ -33,7 +36,10 @@ public String instrumentedType() {
3336
@Override
3437
public void methodAdvice(MethodTransformer transformer) {
3538
transformer.applyAdvice(isConstructor(), getClass().getName() + "$Capture");
36-
transformer.applyAdvice(named("start").and(isMethod()), getClass().getName() + "$Start");
39+
transformer.applyAdvices(
40+
named("start").and(isMethod()),
41+
getClass().getName() + "$Start",
42+
getClass().getName() + "$StartContextPropagationAdvice");
3743
transformer.applyAdvice(named("cancel").and(isMethod()), getClass().getName() + "$Cancel");
3844
transformer.applyAdvice(
3945
named("request")
@@ -67,7 +73,6 @@ public static AgentScope before(
6773
@Advice.Local("$$ddSpan") AgentSpan span) {
6874
span = InstrumentationContext.get(ClientCall.class, AgentSpan.class).get(call);
6975
if (null != span) {
70-
DECORATE.injectContext(span, headers, SETTER);
7176
return activateSpan(span);
7277
}
7378
return null;
@@ -91,6 +96,18 @@ public static void after(
9196
}
9297
}
9398

99+
@AppliesOn(CONTEXT_TRACKING)
100+
public static final class StartContextPropagationAdvice {
101+
@Advice.OnMethodEnter(suppress = Throwable.class)
102+
public static void before(@Advice.Argument(1) Metadata headers) {
103+
AgentSpan span = activeSpan();
104+
if (span == null) {
105+
return;
106+
}
107+
DECORATE.injectContext(span, headers, SETTER);
108+
}
109+
}
110+
94111
public static final class ActivateSpan {
95112
@Advice.OnMethodEnter
96113
public static AgentScope before(@Advice.This ClientCall<?, ?> call) {

dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/GrpcClientDecorator.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import datadog.trace.api.datastreams.DataStreamsContext;
1717
import datadog.trace.api.naming.SpanNaming;
1818
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
19+
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
1920
import datadog.trace.bootstrap.instrumentation.api.InstrumentationTags;
2021
import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes;
2122
import datadog.trace.bootstrap.instrumentation.api.Tags;
@@ -92,7 +93,9 @@ protected String service() {
9293

9394
public <ReqT, RespT> AgentSpan startCall(MethodDescriptor<ReqT, RespT> method) {
9495
if (IGNORED_METHODS.contains(method.getFullMethodName())) {
95-
return null;
96+
// if the method is ignored we want to preserve the old behaviour and not make injection
97+
// happen
98+
return AgentTracer.blackholeSpan();
9699
}
97100
AgentSpan span =
98101
startSpan(OPERATION_NAME)

dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyServerInstrumentation.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,10 @@ public void typeAdvice(TypeTransformer transformer) {
8989

9090
@Override
9191
public void methodAdvice(MethodTransformer transformer) {
92-
transformer.applyAdvice(takesNoArguments().and(named("handle")), packageName + ".HandleAdvice");
92+
transformer.applyAdvices(
93+
takesNoArguments().and(named("handle")),
94+
packageName + ".HandleAdvice$ContextTrackingAdvice",
95+
packageName + ".HandleAdvice");
9396
transformer.applyAdvice(named("recycle").and(takesNoArguments()), packageName + ".ResetAdvice");
9497

9598
if (InstrumenterConfig.get().getAppSecActivation() != ProductActivation.FULLY_DISABLED) {

0 commit comments

Comments
 (0)