Skip to content

Commit f8393ad

Browse files
authored
Merge branch 'master' into smola/enable-api-security-by-default
2 parents e8db7c1 + d2d38c9 commit f8393ad

13 files changed

Lines changed: 123 additions & 23 deletions

File tree

benchmark/Dockerfile

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
# Petclinic download and compilation stage
22
FROM eclipse-temurin:17-jammy as petclinic
33

4+
ARG SPRING_PETCLINIC_COMMIT=cefaf55dd124d0635abfe857c3c99a3d3ea62017
5+
46
RUN apt-get update \
57
&& apt-get -y install git \
68
&& apt-get -y clean \
79
&& rm -rf /var/lib/apt/lists/*
810

9-
RUN git clone --depth 1 --branch main --single-branch https://github.com/spring-projects/spring-petclinic.git \
10-
&& cd spring-petclinic \
11-
&& ./mvnw dependency:go-offline
11+
RUN set -eux;\
12+
git init spring-petclinic;\
13+
cd spring-petclinic;\
14+
git remote add origin https://github.com/spring-projects/spring-petclinic.git;\
15+
git fetch --depth 1 origin ${SPRING_PETCLINIC_COMMIT};\
16+
git checkout ${SPRING_PETCLINIC_COMMIT};\
17+
./mvnw dependency:go-offline
1218

1319
RUN cd spring-petclinic \
1420
&& ./mvnw package -Dmaven.test.skip=true \

benchmark/load/petclinic/benchmark.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,6 @@
3030
"JAVA_OPTS": "-javaagent:${TRACER} -Ddd.appsec.enabled=true"
3131
}
3232
},
33-
"appsec_no_iast": {
34-
"env": {
35-
"VARIANT": "appsec_no_iast",
36-
"JAVA_OPTS": "-javaagent:${TRACER} -Ddd.appsec.enabled=true -Ddd.iast.enabled=false"
37-
}
38-
},
3933
"iast": {
4034
"env": {
4135
"VARIANT": "iast",

benchmark/startup/petclinic/benchmark.json

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,6 @@
2424
"JAVA_OPTS": "-Ddd.appsec.enabled=true"
2525
}
2626
},
27-
"appsec_no_iast": {
28-
"env": {
29-
"VARIANT": "appsec",
30-
"JAVA_OPTS": "-Ddd.appsec.enabled=true -Ddd.iast.enabled=false"
31-
}
32-
},
3327
"iast": {
3428
"env": {
3529
"VARIANT": "iast",

dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentBootstrap.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
public final class AgentBootstrap {
4747
static final String LIB_INJECTION_ENABLED_ENV_VAR = "DD_INJECTION_ENABLED";
4848
static final String LIB_INJECTION_FORCE_SYS_PROP = "dd.inject.force";
49+
static final String LIB_INSTRUMENTATION_SOURCE_SYS_PROP = "dd.instrumentation.source";
4950

5051
private static final Class<?> thisClass = AgentBootstrap.class;
5152
private static final int MAX_EXCEPTION_CHAIN_LENGTH = 99;
@@ -134,6 +135,12 @@ private static void agentmainImpl(
134135
return;
135136
}
136137

138+
if (getConfig(LIB_INJECTION_ENABLED_ENV_VAR)) {
139+
recordInstrumentationSource("ssi");
140+
} else {
141+
recordInstrumentationSource("cmd_line");
142+
}
143+
137144
final URL agentJarURL = installAgentJar(inst);
138145
final Class<?> agentClass;
139146
try {
@@ -164,6 +171,10 @@ static boolean getConfig(String configName) {
164171
}
165172
}
166173

174+
private static void recordInstrumentationSource(String source) {
175+
SystemUtils.trySetProperty(LIB_INSTRUMENTATION_SOURCE_SYS_PROP, source);
176+
}
177+
167178
static boolean exceptionCauseChainContains(Throwable ex, String exClassName) {
168179
Set<Throwable> stack = Collections.newSetFromMap(new IdentityHashMap<>());
169180
Throwable t = ex;

dd-java-agent/src/main/java/datadog/trace/bootstrap/SystemUtils.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ public static String tryGetProperty(String property) {
2323
}
2424
}
2525

26+
public static String trySetProperty(String property, String value) {
27+
try {
28+
return System.setProperty(property, value);
29+
} catch (SecurityException e) {
30+
return null;
31+
}
32+
}
33+
2634
public static String getPropertyOrDefault(String property, String defaultValue) {
2735
try {
2836
return System.getProperty(property, defaultValue);

dd-java-agent/src/test/groovy/datadog/trace/agent/InstrumenterUnloadTest.groovy

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,26 @@ class InstrumenterUnloadTest extends Specification {
2626
, ["DD_API_KEY": API_KEY]
2727
, new PrintStream(testOutput))
2828

29-
int unloadCount = 0
29+
boolean canaryUnloaded = false
30+
int unloadedInstrumentationCount = 0
3031
new ByteArrayInputStream((testOutput.toByteArray())).eachLine {
3132
System.out.println(it)
33+
if (it =~ /(?i)unload.*Canary/) {
34+
canaryUnloaded = true
35+
}
3236
if (it =~ /(?i)unload.* datadog.trace.instrumentation./) {
33-
unloadCount++
37+
unloadedInstrumentationCount++
3438
}
3539
}
3640

41+
if (!canaryUnloaded) {
42+
System.out.println("WARNING: Canary class was not unloaded!")
43+
}
44+
3745
then:
3846
returnCode == 0
39-
unloadCount > 0
47+
// skip check if we couldn't even unload our Canary class, as that
48+
// indicates full GC didn't happen enough to trigger any unloading
49+
!canaryUnloaded || unloadedInstrumentationCount > 0
4050
}
4151
}
Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,32 @@
11
package jvmbootstraptest;
22

3+
import static java.util.concurrent.TimeUnit.MINUTES;
4+
35
import datadog.trace.test.util.GCUtils;
6+
import java.lang.management.ClassLoadingMXBean;
7+
import java.lang.management.ManagementFactory;
48

59
public class UnloadingChecker {
6-
public static void main(final String[] args) {
7-
try {
8-
GCUtils.awaitGC();
9-
} catch (InterruptedException e) {
10-
e.printStackTrace();
10+
static class Canary {}
11+
12+
public static void main(final String[] args) throws Exception {
13+
ClassLoadingMXBean classLoadingMXBean = ManagementFactory.getClassLoadingMXBean();
14+
long initialUnloadCount = classLoadingMXBean.getUnloadedClassCount();
15+
16+
// load an isolated class which we know can be unloaded after a full GC
17+
new IsolatingClassLoader().loadClass("jvmbootstraptest.UnloadingChecker$Canary");
18+
19+
long waitNanos = MINUTES.toNanos(2);
20+
long startNanos = System.nanoTime();
21+
22+
while (System.nanoTime() - startNanos < waitNanos) {
23+
try {
24+
GCUtils.awaitGC();
25+
} catch (Throwable ignore) {
26+
}
27+
if (initialUnloadCount < classLoadingMXBean.getUnloadedClassCount()) {
28+
break; // some class unloading has taken place, stop and check results
29+
}
1130
}
1231
}
1332
}

dd-smoke-tests/jboss-modules/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11

2+
ext {
3+
// see https://datadoghq.atlassian.net/wiki/x/H4S2NQE
4+
excludeJdk = ['IBM8']
5+
}
6+
27
apply from: "$rootDir/gradle/java.gradle"
38
description = 'JBoss Modules Smoke Tests.'
49

dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ public final class ConfigDefaults {
240240
static final boolean DEFAULT_TELEMETRY_LOG_COLLECTION_ENABLED = true;
241241
static final int DEFAULT_TELEMETRY_DEPENDENCY_RESOLUTION_QUEUE_SIZE = 100000;
242242

243+
static final boolean DEFAULT_SSI_INJECTION_FORCE = false;
244+
static final String DEFAULT_INSTRUMENTATION_SOURCE = "manual";
245+
243246
static final Set<String> DEFAULT_TRACE_EXPERIMENTAL_FEATURES_ENABLED =
244247
new HashSet<>(
245248
asList("DD_TAGS", "DD_LOGS_INJECTION", "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED"));

dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,9 @@ public final class GeneralConfig {
103103

104104
public static final String STACK_TRACE_LENGTH_LIMIT = "stack.trace.length.limit";
105105

106+
public static final String SSI_INJECTION_ENABLED = "injection.enabled";
107+
public static final String SSI_INJECTION_FORCE = "inject.force";
108+
public static final String INSTRUMENTATION_SOURCE = "instrumentation.source";
109+
106110
private GeneralConfig() {}
107111
}

0 commit comments

Comments
 (0)