Skip to content

Commit c414845

Browse files
committed
feat(core): Implement standalone ASM propagator
1 parent 9dacb83 commit c414845

File tree

5 files changed

+82
-4
lines changed

5 files changed

+82
-4
lines changed

dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static datadog.trace.api.DDTags.DJM_ENABLED;
66
import static datadog.trace.api.DDTags.DSM_ENABLED;
77
import static datadog.trace.api.DDTags.PROFILING_CONTEXT_ENGINE;
8+
import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.STANDALONE_ASM_CONCERN;
89
import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.TRACING_CONCERN;
910
import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.XRAY_TRACING_CONCERN;
1011
import static datadog.trace.common.metrics.MetricsAggregatorFactory.createMetricsAggregator;
@@ -90,6 +91,7 @@
9091
import datadog.trace.core.propagation.ExtractedContext;
9192
import datadog.trace.core.propagation.HttpCodec;
9293
import datadog.trace.core.propagation.PropagationTags;
94+
import datadog.trace.core.propagation.StandaloneAsmPropagator;
9395
import datadog.trace.core.propagation.TracingPropagator;
9496
import datadog.trace.core.propagation.XRayPropagator;
9597
import datadog.trace.core.scopemanager.ContinuableScopeManager;
@@ -725,7 +727,14 @@ private CoreTracer(
725727
this.propagation =
726728
new CorePropagation(builtExtractor, injector, injectors, dataStreamContextInjector);
727729

728-
Propagators.register(TRACING_CONCERN, new TracingPropagator(injector, extractor));
730+
// Check if standalone AppSec is enabled:
731+
// If enabled, use the standalone AppSec propagator by default that will limit tracing concern
732+
// injection and delegate to the tracing propagator if needed,
733+
// If disabled, the most common case, use the usual tracing propagator by default.
734+
boolean standaloneAppSec = config.isAppSecStandaloneEnabled();
735+
Propagators.register(STANDALONE_ASM_CONCERN, new StandaloneAsmPropagator(), standaloneAppSec);
736+
Propagators.register(
737+
TRACING_CONCERN, new TracingPropagator(injector, extractor), !standaloneAppSec);
729738
Propagators.register(XRAY_TRACING_CONCERN, new XRayPropagator(config), false);
730739

731740
this.tagInterceptor =
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package datadog.trace.core.propagation;
2+
3+
import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.TRACING_CONCERN;
4+
import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext;
5+
6+
import datadog.context.Context;
7+
import datadog.context.propagation.CarrierSetter;
8+
import datadog.context.propagation.CarrierVisitor;
9+
import datadog.context.propagation.Propagator;
10+
import datadog.context.propagation.Propagators;
11+
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
12+
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext;
13+
import datadog.trace.core.DDSpanContext;
14+
import javax.annotation.ParametersAreNonnullByDefault;
15+
16+
@ParametersAreNonnullByDefault
17+
public class StandaloneAsmPropagator implements Propagator {
18+
@Override
19+
public <C> void inject(Context context, C carrier, CarrierSetter<C> setter) {
20+
// Stop propagation if appsec propagation is disabled (no ASM events), stop propagation
21+
AgentSpan span;
22+
if ((span = fromContext(context)) != null) {
23+
AgentSpanContext spanContext = span.context();
24+
if (spanContext instanceof DDSpanContext) {
25+
DDSpanContext ddSpanContext = (DDSpanContext) spanContext;
26+
if (!ddSpanContext.getPropagationTags().isAppsecPropagationEnabled()) {
27+
return;
28+
}
29+
}
30+
// Only propagate tracing for appsec standalone product
31+
Propagators.forConcern(TRACING_CONCERN).inject(span, carrier, setter);
32+
}
33+
}
34+
35+
@Override
36+
public <C> Context extract(Context context, C carrier, CarrierVisitor<C> visitor) {
37+
// Only propagate tracing for appsec standalone product
38+
return Propagators.forConcern(TRACING_CONCERN).extract(context, carrier, visitor);
39+
}
40+
}

dd-trace-core/src/test/groovy/datadog/trace/core/propagation/TracingPropagatorTest.groovy

+26
Original file line numberDiff line numberDiff line change
@@ -156,4 +156,30 @@ class TracingPropagatorTest extends DDCoreSpecification {
156156
span.finish()
157157
tracer.close()
158158
}
159+
160+
def 'test ASM standalone billing propagator stop propagation'() {
161+
setup:
162+
injectSysConfig('experimental.appsec.standalone.enabled', standaloneAsmEnabled.toString())
163+
def tracer = tracerBuilder().build()
164+
def span = tracer.buildSpan('test', 'operation').start()
165+
def setter = Mock(CarrierSetter)
166+
def carrier = new Object()
167+
168+
when:
169+
Propagators.defaultPropagator().inject(span, carrier, setter)
170+
171+
then:
172+
if (standaloneAsmEnabled) {
173+
0 * setter.set(_, _, _)
174+
} else {
175+
(1.._) * setter.set(_, _, _)
176+
}
177+
178+
cleanup:
179+
span.finish()
180+
tracer.close()
181+
182+
where:
183+
standaloneAsmEnabled << [true, false]
184+
}
159185
}

internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentPropagation.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package datadog.trace.bootstrap.instrumentation.api;
22

3+
import static datadog.context.propagation.Concern.named;
4+
35
import datadog.context.propagation.CarrierSetter;
46
import datadog.context.propagation.CarrierVisitor;
57
import datadog.context.propagation.Concern;
@@ -9,8 +11,9 @@
911
import javax.annotation.ParametersAreNonnullByDefault;
1012

1113
public interface AgentPropagation {
12-
Concern TRACING_CONCERN = Concern.named("tracing");
13-
Concern XRAY_TRACING_CONCERN = Concern.named("tracing-xray");
14+
Concern TRACING_CONCERN = named("tracing");
15+
Concern XRAY_TRACING_CONCERN = named("tracing-xray");
16+
Concern STANDALONE_ASM_CONCERN = named("asm-standalone");
1417

1518
<C> void inject(AgentSpan span, C carrier, Setter<C> setter);
1619

internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public interface AgentSpan
2525
* @return the span if existing, {@code null} otherwise.
2626
*/
2727
static AgentSpan fromContext(Context context) {
28-
return context.get(SPAN_KEY);
28+
return context == null ? null : context.get(SPAN_KEY);
2929
}
3030

3131
/**

0 commit comments

Comments
 (0)