Skip to content

Commit 7d2c4af

Browse files
Merge branch 'master' into alexeyk/fix-v1-span-events-json-encoding
# Conflicts: # dd-trace-core/src/test/java/datadog/trace/core/DDSpanSerializationTest.java
2 parents 6680c2b + 9a23583 commit 7d2c4af

55 files changed

Lines changed: 5062 additions & 416 deletions

File tree

Some content is hidden

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

‎.gitlab-ci.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,7 +1115,7 @@ test_debugger_arm64:
11151115
- !reference [.test_job_arm64, script]
11161116

11171117
test_smoke:
1118-
extends: .test_job
1118+
extends: .test_job_with_test_agent
11191119
# needs:parallel:matrix limits this job to a specific build_tests combination.
11201120
# Keep matrix vars exact and in build_tests declaration order:
11211121
# https://docs.gitlab.com/ci/yaml/#needsparallelmatrix
@@ -1135,7 +1135,7 @@ test_smoke:
11351135
matrix: *test_matrix_8
11361136

11371137
test_smoke_arm64:
1138-
extends: .test_job_arm64
1138+
extends: .test_job_arm64_with_test_agent
11391139
variables:
11401140
<<: *tier_l_variables
11411141
GRADLE_TARGET: "stageMainDist :smokeTest"

‎communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
public class SharedCommunicationObjects {
2727
private static final Logger log = LoggerFactory.getLogger(SharedCommunicationObjects.class);
2828

29+
private static final String X_DATADOG_TEST_SESSION_TOKEN = "X-Datadog-Test-Session-Token";
30+
2931
private final List<Runnable> pausedComponents = new ArrayList<>();
3032
private volatile boolean paused;
3133

@@ -90,9 +92,27 @@ public void createRemaining(Config config) {
9092
agentHttpClient =
9193
OkHttpUtils.buildHttpClient(
9294
OkHttpUtils.isPlainHttp(agentUrl), unixDomainSocket, namedPipe, httpClientTimeout);
95+
String testSessionToken = config.getTestAgentSessionToken();
96+
if (testSessionToken != null) {
97+
agentHttpClient = injectTestAgentSessionHeaderInterceptor(testSessionToken);
98+
}
9399
}
94100
}
95101

102+
private OkHttpClient injectTestAgentSessionHeaderInterceptor(String testSessionToken) {
103+
return agentHttpClient
104+
.newBuilder()
105+
.addInterceptor(
106+
chain ->
107+
chain.proceed(
108+
chain
109+
.request()
110+
.newBuilder()
111+
.header(X_DATADOG_TEST_SESSION_TOKEN, testSessionToken)
112+
.build()))
113+
.build();
114+
}
115+
96116
/** Registers a callback to be called when remote communications resume. */
97117
public void whenReady(Runnable callback) {
98118
if (paused) {

‎dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/TPEHelper.java‎

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import datadog.context.ContextScope;
77
import datadog.trace.api.GenericClassValue;
88
import datadog.trace.api.InstrumenterConfig;
9+
import datadog.trace.api.Platform;
910
import datadog.trace.bootstrap.ContextStore;
1011
import java.util.Set;
1112
import java.util.concurrent.ThreadPoolExecutor;
@@ -51,25 +52,15 @@ public static boolean useWrapping(Runnable task) {
5152
return useWrapping || task instanceof Wrapper || (task != null && WRAP.get(task.getClass()));
5253
}
5354

54-
public static void setPropagate(
55-
ContextStore<ThreadPoolExecutor, Boolean> contextStore, ThreadPoolExecutor executor) {
56-
if (executor == null || contextStore == null || contextStore.get(executor) != null) {
57-
return;
58-
}
59-
String executorType = executor.getClass().getName();
60-
if (excludedClasses.contains(executorType)) {
61-
contextStore.put(executor, Boolean.FALSE);
62-
} else {
63-
contextStore.put(executor, Boolean.TRUE);
64-
}
65-
}
55+
private static final ClassValue<Boolean> PROPAGATE =
56+
GenericClassValue.of(input -> !excludedClasses.contains(input.getName()));
6657

67-
public static boolean shouldPropagate(
68-
ContextStore<ThreadPoolExecutor, Boolean> contextStore, ThreadPoolExecutor executor) {
69-
if (executor == null || contextStore == null) {
70-
return false;
71-
}
72-
return Boolean.TRUE.equals(contextStore.get(executor));
58+
public static boolean shouldPropagate(ThreadPoolExecutor executor) {
59+
// avoid tracking threads when building native images as it confuses the scanner
60+
// (we still want instrumentation applied, so tracking works in the built image)
61+
return !Platform.isNativeImageBuilder()
62+
&& executor != null
63+
&& PROPAGATE.get(executor.getClass());
7364
}
7465

7566
public static void capture(ContextStore<Runnable, State> contextStore, Runnable task) {

‎dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/ConfigurationFileLoader.java‎

Lines changed: 12 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,24 @@
11
package com.datadog.debugger.agent;
22

3-
import com.datadog.debugger.probe.LogProbe;
4-
import com.datadog.debugger.probe.MetricProbe;
3+
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeLogProbe;
4+
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeMetricProbe;
5+
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeSpanDecorationProbe;
6+
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeSpanProbe;
7+
import static com.datadog.debugger.probe.ProbeDefinitionDeserializer.deserializeTriggerProbe;
8+
59
import com.datadog.debugger.probe.ProbeDefinition;
6-
import com.datadog.debugger.probe.SpanDecorationProbe;
7-
import com.datadog.debugger.probe.SpanProbe;
8-
import com.datadog.debugger.probe.TriggerProbe;
9-
import com.datadog.debugger.util.MoshiHelper;
1010
import com.squareup.moshi.JsonAdapter;
1111
import com.squareup.moshi.JsonReader;
1212
import com.squareup.moshi.JsonWriter;
13-
import com.squareup.moshi.Moshi;
14-
import com.squareup.moshi.Types;
1513
import datadog.trace.util.SizeCheckedInputStream;
1614
import java.io.ByteArrayInputStream;
1715
import java.io.ByteArrayOutputStream;
1816
import java.io.FileInputStream;
1917
import java.io.IOException;
2018
import java.io.InputStream;
21-
import java.lang.annotation.Annotation;
22-
import java.lang.reflect.ParameterizedType;
23-
import java.lang.reflect.Type;
2419
import java.nio.file.Path;
2520
import java.util.ArrayList;
2621
import java.util.List;
27-
import java.util.Set;
2822
import okio.Okio;
2923
import org.slf4j.Logger;
3024
import org.slf4j.LoggerFactory;
@@ -46,9 +40,7 @@ public static Configuration from(Path probeFilePath, long maxPayloadSize) {
4640
}
4741
} while (bytesRead > -1);
4842
byte[] configContent = outputStream.toByteArray();
49-
Moshi moshi = MoshiHelper.createMoshiConfigBuilder().add(new ProbeFileFactory()).build();
50-
ParameterizedType type = Types.newParameterizedType(List.class, ProbeDefinition.class);
51-
JsonAdapter<List<ProbeDefinition>> adapter = moshi.adapter(type);
43+
JsonAdapter<List<ProbeDefinition>> adapter = new ProbeFileAdapter();
5244
List<ProbeDefinition> probeDefinitions =
5345
adapter.fromJson(
5446
JsonReader.of(Okio.buffer(Okio.source(new ByteArrayInputStream(configContent)))));
@@ -59,40 +51,7 @@ public static Configuration from(Path probeFilePath, long maxPayloadSize) {
5951
}
6052
}
6153

62-
private static class ProbeFileFactory implements JsonAdapter.Factory {
63-
@Override
64-
public JsonAdapter<?> create(Type type, Set<? extends Annotation> annotations, Moshi moshi) {
65-
if (Types.equals(type, Types.newParameterizedType(List.class, ProbeDefinition.class))) {
66-
return new ProbeFileAdapter(
67-
moshi.adapter(LogProbe.class),
68-
moshi.adapter(MetricProbe.class),
69-
moshi.adapter(SpanProbe.class),
70-
moshi.adapter(SpanDecorationProbe.class),
71-
moshi.adapter(TriggerProbe.class));
72-
}
73-
return null;
74-
}
75-
}
76-
7754
private static class ProbeFileAdapter extends JsonAdapter<List<ProbeDefinition>> {
78-
private final JsonAdapter<LogProbe> logProbeAdapter;
79-
private final JsonAdapter<MetricProbe> metricProbeAdapter;
80-
private final JsonAdapter<SpanProbe> spanProbeAdapter;
81-
private final JsonAdapter<SpanDecorationProbe> spanDecorationProbeAdapter;
82-
private final JsonAdapter<TriggerProbe> triggerProbeAdapter;
83-
84-
public ProbeFileAdapter(
85-
JsonAdapter<LogProbe> logProbeAdapter,
86-
JsonAdapter<MetricProbe> metricProbeAdapter,
87-
JsonAdapter<SpanProbe> spanProbeAdapter,
88-
JsonAdapter<SpanDecorationProbe> spanDecorationProbeAdapter,
89-
JsonAdapter<TriggerProbe> triggerProbeAdapter) {
90-
this.logProbeAdapter = logProbeAdapter;
91-
this.metricProbeAdapter = metricProbeAdapter;
92-
this.spanProbeAdapter = spanProbeAdapter;
93-
this.spanDecorationProbeAdapter = spanDecorationProbeAdapter;
94-
this.triggerProbeAdapter = triggerProbeAdapter;
95-
}
9655

9756
@Override
9857
public List<ProbeDefinition> fromJson(JsonReader reader) throws IOException {
@@ -110,19 +69,19 @@ public List<ProbeDefinition> fromJson(JsonReader reader) throws IOException {
11069
String type = jsonPeekReader.nextString();
11170
switch (type) {
11271
case "LOG_PROBE":
113-
probeDefinitions.add(logProbeAdapter.fromJson(reader));
72+
probeDefinitions.add(deserializeLogProbe(reader));
11473
break;
11574
case "METRIC_PROBE":
116-
probeDefinitions.add(metricProbeAdapter.fromJson(reader));
75+
probeDefinitions.add(deserializeMetricProbe(reader));
11776
break;
11877
case "SPAN_PROBE":
119-
probeDefinitions.add(spanProbeAdapter.fromJson(reader));
78+
probeDefinitions.add(deserializeSpanProbe(reader));
12079
break;
12180
case "SPAN_DECORATION_PROBE":
122-
probeDefinitions.add(spanDecorationProbeAdapter.fromJson(reader));
81+
probeDefinitions.add(deserializeSpanDecorationProbe(reader));
12382
break;
12483
case "TRIGGER_PROBE":
125-
probeDefinitions.add(triggerProbeAdapter.fromJson(reader));
84+
probeDefinitions.add(deserializeTriggerProbe(reader));
12685
break;
12786
default:
12887
throw new RuntimeException("Unknown type: " + type);

‎dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/ProbeDefinitionDeserializer.java‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.datadog.debugger.agent.Configuration;
44
import com.datadog.debugger.util.MoshiHelper;
55
import com.squareup.moshi.JsonAdapter;
6+
import com.squareup.moshi.JsonReader;
67
import java.io.ByteArrayInputStream;
78
import java.io.IOException;
89
import okio.Okio;
@@ -29,22 +30,42 @@ public static MetricProbe deserializeMetricProbe(byte[] content) throws IOExcept
2930
return deserialize(METRIC_PROBE_JSON_ADAPTER, content);
3031
}
3132

33+
public static MetricProbe deserializeMetricProbe(JsonReader reader) throws IOException {
34+
return METRIC_PROBE_JSON_ADAPTER.fromJson(reader);
35+
}
36+
3237
public static LogProbe deserializeLogProbe(byte[] content) throws IOException {
3338
LogProbe logProbe = deserialize(LOG_PROBE_JSON_ADAPTER, content);
3439
logProbe.initSamplers();
3540
return logProbe;
3641
}
3742

43+
public static LogProbe deserializeLogProbe(JsonReader reader) throws IOException {
44+
LogProbe logProbe = LOG_PROBE_JSON_ADAPTER.fromJson(reader);
45+
logProbe.initSamplers();
46+
return logProbe;
47+
}
48+
3849
public static SpanProbe deserializeSpanProbe(byte[] content) throws IOException {
3950
return deserialize(SPAN_PROBE_JSON_ADAPTER, content);
4051
}
4152

53+
public static SpanProbe deserializeSpanProbe(JsonReader reader) throws IOException {
54+
return SPAN_PROBE_JSON_ADAPTER.fromJson(reader);
55+
}
56+
4257
public static TriggerProbe deserializeTriggerProbe(byte[] content) throws IOException {
4358
TriggerProbe triggerProbe = deserialize(TRIGGER_PROBE_JSON_ADAPTER, content);
4459
triggerProbe.initSamplers();
4560
return triggerProbe;
4661
}
4762

63+
public static TriggerProbe deserializeTriggerProbe(JsonReader jsonReader) throws IOException {
64+
TriggerProbe triggerProbe = TRIGGER_PROBE_JSON_ADAPTER.fromJson(jsonReader);
65+
triggerProbe.initSamplers();
66+
return triggerProbe;
67+
}
68+
4869
public static SpanDecorationProbe deserializeSpanDecorationProbe(byte[] content)
4970
throws IOException {
5071
SpanDecorationProbe spanDecorationProbe =
@@ -53,6 +74,14 @@ public static SpanDecorationProbe deserializeSpanDecorationProbe(byte[] content)
5374
return spanDecorationProbe;
5475
}
5576

77+
public static SpanDecorationProbe deserializeSpanDecorationProbe(JsonReader jsonReader)
78+
throws IOException {
79+
SpanDecorationProbe spanDecorationProbe =
80+
SPAN_DECORATION_PROBE_JSON_ADAPTER.fromJson(jsonReader);
81+
spanDecorationProbe.initSamplers();
82+
return spanDecorationProbe;
83+
}
84+
5685
private static <T> T deserialize(JsonAdapter<T> adapter, byte[] content) throws IOException {
5786
return adapter.fromJson(Okio.buffer(Okio.source(new ByteArrayInputStream(content))));
5887
}

‎dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/ConfigurationFileLoaderTest.java‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.datadog.debugger.probe.ProbeDefinition;
88
import com.datadog.debugger.probe.SpanDecorationProbe;
99
import com.datadog.debugger.probe.SpanProbe;
10+
import com.datadog.debugger.probe.TriggerProbe;
1011
import java.nio.file.Path;
1112
import java.nio.file.Paths;
1213
import java.util.List;
@@ -21,11 +22,12 @@ public void load() throws Exception {
2122
Configuration configuration = ConfigurationFileLoader.from(probeFilePath, 1024 * 1024);
2223
assertNotNull(configuration);
2324
List<ProbeDefinition> definitions = configuration.getDefinitions();
24-
assertEquals(5, definitions.size());
25-
assertInstanceOf(MetricProbe.class, definitions.get(0));
26-
assertInstanceOf(LogProbe.class, definitions.get(1));
25+
assertEquals(6, definitions.size());
26+
assertInstanceOf(TriggerProbe.class, definitions.get(0));
27+
assertInstanceOf(MetricProbe.class, definitions.get(1));
2728
assertInstanceOf(LogProbe.class, definitions.get(2));
28-
assertInstanceOf(SpanProbe.class, definitions.get(3));
29-
assertInstanceOf(SpanDecorationProbe.class, definitions.get(4));
29+
assertInstanceOf(LogProbe.class, definitions.get(3));
30+
assertInstanceOf(SpanProbe.class, definitions.get(4));
31+
assertInstanceOf(SpanDecorationProbe.class, definitions.get(5));
3032
}
3133
}

‎dd-java-agent/agent-debugger/src/test/resources/test_probe_file.json‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,19 @@
8787
},
8888
"tags": [],
8989
"evaluateAt": "EXIT"
90+
},
91+
{
92+
"id": "70b55d06-f9fa-403b-a329-4f2f960aed02",
93+
"version": 0,
94+
"type": "TRIGGER_PROBE",
95+
"language": "java",
96+
"where": {
97+
"typeName": "MetadataClientUtils",
98+
"methodName": "listTableWithContinuation"
99+
},
100+
"tags": [],
101+
"evaluateAt": "EXIT",
102+
"sessionId": "session",
103+
"sampling": { "snapshotsPerSecond": 100 }
90104
}
91105
]

‎dd-java-agent/appsec/src/main/java/com/datadog/appsec/ddwaf/WAFModule.java‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.datadog.appsec.ddwaf;
22

3-
import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY;
43
import static datadog.trace.util.stacktrace.StackTraceEvent.DEFAULT_LANGUAGE;
54
import static java.util.Collections.emptyList;
65
import static java.util.Collections.singletonList;
@@ -622,7 +621,10 @@ private Waf.ResultWithData runWafTransient(
622621
private Collection<AppSecEvent> buildEvents(
623622
Waf.ResultWithData actionWithData, String securityResponseId) {
624623
if (actionWithData.data == null) {
625-
log.debug(SEND_TELEMETRY, "WAF result data is null");
624+
// Since ruleset 1.14.1, fingerprint processors evaluate unconditionally, so the WAF
625+
// returns MATCH with no data (no real rule/event) on every ordinary request, not just on
626+
// attacks. This is expected and no longer worth logging (dd-trace-py/dd-trace-go don't log
627+
// here either: both gate their equivalent log on non-empty events, not on the return code).
626628
return Collections.emptyList();
627629
}
628630
Collection<WAFResultData> listResults;

0 commit comments

Comments
 (0)