Skip to content

Commit 5540855

Browse files
authored
Merge branch 'master' into nicholas.hulston/pass-error-tags-to-lambda-extension
2 parents a0219e8 + 10dc2ef commit 5540855

File tree

40 files changed

+1167
-93
lines changed

40 files changed

+1167
-93
lines changed

.circleci/config.continue.yml.j2

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,9 @@ jobs:
858858
APPSEC_RASP
859859
APPSEC_RUNTIME_ACTIVATION
860860
APPSEC_WAF_TELEMETRY
861+
APPSEC_STANDALONE_V2
862+
IAST_STANDALONE_V2
863+
SCA_STANDALONE_V2
861864
REMOTE_CONFIG_MOCKED_BACKEND_ASM_DD
862865
"
863866
fi

.gitlab-ci.yml

Lines changed: 110 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,24 @@ variables:
2323
DEPENDENCY_CACHE_POLICY: pull
2424
BUILD_CACHE_POLICY: pull
2525
GRADLE_VERSION: "8.4" # must match gradle-wrapper.properties
26+
JAVA_BUILD_IMAGE_VERSION: "v25.01"
2627

2728
default:
2829
tags: [ "arch:amd64" ]
2930

31+
.fan_in:
32+
stage: tests
33+
image: registry.ddbuild.io/images/base/gbi-ubuntu_2204-slim:release
34+
script:
35+
- echo "done"
36+
3037
.gradle_build: &gradle_build
31-
image: ghcr.io/datadog/dd-trace-java-docker-build:v25.01-base
38+
image: ghcr.io/datadog/dd-trace-java-docker-build:${JAVA_BUILD_IMAGE_VERSION}-base
39+
stage: build
3240
variables:
33-
GRADLE_OPTS: "-Dorg.gradle.jvmargs='-Xmx2560M -Xms2560M'"
34-
GRADLE_ARGS: " -PskipTests --build-cache --stacktrace --no-daemon --parallel --max-workers=2"
41+
GRADLE_OPTS: "-Dorg.gradle.jvmargs='-Xmx2560M -Xms2560M -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'"
42+
MAVEN_OPTS: "-Xms64M -Xmx512M"
43+
GRADLE_WORKERS: 2
3544
KUBERNETES_CPU_REQUEST: 8
3645
KUBERNETES_MEMORY_REQUEST: 6Gi
3746
cache:
@@ -42,14 +51,15 @@ default:
4251
- .gradle/caches
4352
- .gradle/notifications
4453
policy: $DEPENDENCY_CACHE_POLICY
45-
- key: $CI_PIPELINE_ID # Incremental build cache. Shared by all jobs in the pipeline
54+
- key: $CI_PIPELINE_ID-$BUILD_CACHE_TYPE # Incremental build cache. Shared by all jobs in the pipeline of the same type
4655
paths:
4756
- .gradle/caches/$GRADLE_VERSION
4857
- .gradle/$GRADLE_VERSION/executionHistory
4958
- workspace
5059
policy: $BUILD_CACHE_POLICY
5160
before_script:
5261
- export GRADLE_USER_HOME=`pwd`/.gradle
62+
- export GRADLE_ARGS=" --build-cache --stacktrace --no-daemon --parallel --max-workers=$GRADLE_WORKERS"
5363
# for weird reasons, gradle will always "chmod 700" the .gradle folder
5464
# with Gitlab caching, .gradle is always owned by root and thus gradle's chmod invocation fails
5565
# This dance is a hack to have .gradle owned by the Gitlab runner user
@@ -61,21 +71,24 @@ default:
6171

6272
build:
6373
extends: .gradle_build
64-
stage: build
6574
variables:
6675
BUILD_CACHE_POLICY: push
76+
BUILD_CACHE_TYPE: lib
6777
DEPENDENCY_CACHE_POLICY: pull
6878
script:
69-
- ./gradlew clean :dd-java-agent:shadowJar :dd-trace-api:jar :dd-trace-ot:shadowJar $GRADLE_ARGS
79+
- if [ $CI_PIPELINE_SOURCE == "schedule" ] ; then ./gradlew resolveAndLockAll --write-locks; fi
80+
- ./gradlew clean :dd-java-agent:shadowJar :dd-trace-api:jar :dd-trace-ot:shadowJar -PskipTests $GRADLE_ARGS
7081
- echo UPSTREAM_TRACER_VERSION=$(java -jar workspace/dd-java-agent/build/libs/*.jar) >> upstream.env
7182
- echo "BUILD_JOB_NAME=$CI_JOB_NAME" >> build.env
7283
- echo "BUILD_JOB_ID=$CI_JOB_ID" >> build.env
7384
artifacts:
85+
when: always
7486
paths:
7587
- 'workspace/dd-java-agent/build/libs/*.jar'
7688
- 'workspace/dd-trace-api/build/libs/*.jar'
7789
- 'workspace/dd-trace-ot/build/libs/*.jar'
7890
- 'upstream.env'
91+
- '.gradle/daemon/*/*.out.log'
7992
reports:
8093
dotenv: build.env
8194

@@ -90,6 +103,94 @@ build_and_populate_dep_cache:
90103
- when: manual
91104
allow_failure: true
92105

106+
spotless:
107+
extends: .gradle_build
108+
stage: tests
109+
needs: []
110+
script:
111+
- export JAVA_HOME=$JAVA_11_HOME
112+
- ./gradlew spotlessCheck $GRADLE_ARGS
113+
114+
test_published_artifacts:
115+
extends: .gradle_build
116+
image: ghcr.io/datadog/dd-trace-java-docker-build:${JAVA_BUILD_IMAGE_VERSION}-7 # Needs Java7 for some tests
117+
stage: tests
118+
needs: [ build ]
119+
rules:
120+
- if: '$POPULATE_CACHE'
121+
when: never
122+
- when: on_success
123+
variables:
124+
BUILD_CACHE_TYPE: lib
125+
script:
126+
- mvn_local_repo=$(./mvnw help:evaluate -Dexpression=settings.localRepository -q -DforceStdout)
127+
- rm -rf "${mvn_local_repo}/com/datadoghq"
128+
- export GPG_PRIVATE_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text)
129+
- export GPG_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text)
130+
- export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xmx2G -Xms2G -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'"
131+
- ./gradlew publishToMavenLocal $GRADLE_ARGS
132+
- cd test-published-dependencies
133+
- export GRADLE_OPTS="-Dorg.gradle.jvmargs='-Xmx512M -Xms512M -XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp'"
134+
- ./gradlew check --info $GRADLE_ARGS
135+
after_script:
136+
- .circleci/collect_reports.sh
137+
artifacts:
138+
when: always
139+
paths:
140+
- ./check_reports
141+
142+
muzzle:
143+
extends: .gradle_build
144+
needs: [ build ]
145+
stage: tests
146+
parallel: 8
147+
rules:
148+
- if: '$POPULATE_CACHE'
149+
when: never
150+
- when: on_success
151+
variables:
152+
BUILD_CACHE_TYPE: test
153+
script:
154+
- export SKIP_BUILDSCAN="true"
155+
- echo CI_NODE_INDEX=$CI_NODE_INDEX
156+
- echo CI_NODE_TOTAL=CI_NODE_TOTAL
157+
- ./gradlew writeMuzzleTasksToFile $GRADLE_ARGS
158+
- sort workspace/build/muzzleTasks > sortedMuzzleTasks
159+
- split --number=l/$CI_NODE_TOTAL --suffix-length=1 --numeric-suffixes sortedMuzzleTasks muzzleSplit
160+
- export NODE_ZERO_INDEX=$((CI_NODE_INDEX - 1))
161+
- ./gradlew `cat muzzleSplit${NODE_ZERO_INDEX} | xargs` $GRADLE_ARGS
162+
after_script:
163+
- .circleci/collect_reports.sh
164+
artifacts:
165+
when: always
166+
paths:
167+
- ./reports
168+
- '.gradle/daemon/*/*.out.log'
169+
170+
muzzle-dep-report:
171+
extends: .gradle_build
172+
needs: [ build ]
173+
stage: tests
174+
variables:
175+
BUILD_CACHE_TYPE: test
176+
script:
177+
- export SKIP_BUILDSCAN="true"
178+
- ./gradlew generateMuzzleReport muzzleInstrumentationReport $GRADLE_ARGS
179+
after_script:
180+
- .circleci/collect_muzzle_deps.sh
181+
artifacts:
182+
when: always
183+
paths:
184+
- ./reports
185+
- '.gradle/daemon/*/*.out.log'
186+
187+
required:
188+
extends: .fan_in
189+
needs:
190+
- spotless
191+
- muzzle
192+
- test_published_artifacts
193+
93194
deploy_to_profiling_backend:
94195
stage: publish
95196
needs: [ build ]
@@ -165,6 +266,8 @@ deploy_to_sonatype:
165266
extends: .gradle_build
166267
stage: publish
167268
needs: [ build ]
269+
variables:
270+
BUILD_CACHE_TYPE: lib
168271
rules:
169272
- if: '$POPULATE_CACHE'
170273
when: never
@@ -180,7 +283,7 @@ deploy_to_sonatype:
180283
- export SONATYPE_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.sonatype_password --with-decryption --query "Parameter.Value" --out text)
181284
- export GPG_PRIVATE_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text)
182285
- export GPG_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.dd-trace-java.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text)
183-
- ./gradlew -PbuildInfo.build.number=$CI_JOB_ID publishToSonatype closeSonatypeStagingRepository $GRADLE_ARGS
286+
- ./gradlew -PbuildInfo.build.number=$CI_JOB_ID publishToSonatype closeSonatypeStagingRepository -PskipTests $GRADLE_ARGS
184287
artifacts:
185288
paths:
186289
- 'workspace/dd-java-agent/build/libs/*.jar'

dd-java-agent/agent-crashtracking/src/main/java/com/datadog/crashtracking/OOMENotifierScriptInitializer.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ private static boolean copyOOMEscript(Path scriptPath) {
116116
private static class ScriptCleanupVisitor implements FileVisitor<Path> {
117117
private static final Pattern PID_PATTERN = Pattern.compile(".*?" + PID_PREFIX + "(\\d+)");
118118

119-
private final Set<String> pidSet = PidHelper.getJavaPids();
119+
private Set<String> pidSet;
120120

121121
static void run(Path dir) {
122122
try {
@@ -145,9 +145,14 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO
145145
Matcher matcher = PID_PATTERN.matcher(fileName);
146146
if (matcher.find()) {
147147
String pid = matcher.group(1);
148-
if (pid != null && !pid.equals(PidHelper.getPid()) && !this.pidSet.contains(pid)) {
149-
LOG.debug("Cleaning process specific file {}", file);
150-
Files.delete(file);
148+
if (pid != null && !pid.equals(PidHelper.getPid())) {
149+
if (this.pidSet == null) {
150+
this.pidSet = PidHelper.getJavaPids(); // only fork jps when required
151+
}
152+
if (!this.pidSet.contains(pid)) {
153+
LOG.debug("Cleaning process specific file {}", file);
154+
Files.delete(file);
155+
}
151156
}
152157
}
153158
return CONTINUE;

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -701,15 +701,19 @@ public void commit(CapturedContext lineContext, int line) {
701701
shouldCommit = true;
702702
}
703703
if (shouldCommit) {
704-
if (isCaptureSnapshot()) {
705-
// freeze context just before commit because line probes have only one context
706-
Duration timeout =
707-
Duration.of(Config.get().getDynamicInstrumentationCaptureTimeout(), ChronoUnit.MILLIS);
708-
lineContext.freeze(new TimeoutChecker(timeout));
709-
snapshot.addLine(lineContext, line);
704+
incrementBudget();
705+
if (inBudget()) {
706+
if (isCaptureSnapshot()) {
707+
// freeze context just before commit because line probes have only one context
708+
Duration timeout =
709+
Duration.of(
710+
Config.get().getDynamicInstrumentationCaptureTimeout(), ChronoUnit.MILLIS);
711+
lineContext.freeze(new TimeoutChecker(timeout));
712+
snapshot.addLine(lineContext, line);
713+
}
714+
commitSnapshot(snapshot, sink);
715+
return;
710716
}
711-
commitSnapshot(snapshot, sink);
712-
return;
713717
}
714718
sink.skipSnapshot(id, DebuggerContext.SkipCause.CONDITION);
715719
}

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/LogProbeTest.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,34 @@ public void budgets() {
102102
assertEquals(runs * LogProbe.NON_CAPTURING_PROBE_BUDGET, sink.highRate);
103103
}
104104

105+
@Test
106+
public void budgetsOnLineProbes() {
107+
BudgetSink sink = new BudgetSink(getConfig(), mock(ProbeStatusSink.class));
108+
DebuggerAgentHelper.injectSink(sink);
109+
110+
TracerAPI tracer =
111+
CoreTracer.builder().idGenerationStrategy(IdGenerationStrategy.fromName("random")).build();
112+
AgentTracer.registerIfAbsent(tracer);
113+
int runs = 100;
114+
for (int i = 0; i < runs; i++) {
115+
runTrace(tracer, true, 100);
116+
}
117+
assertEquals(runs * LogProbe.CAPTURING_PROBE_BUDGET, sink.captures);
118+
119+
sink = new BudgetSink(getConfig(), mock(ProbeStatusSink.class));
120+
DebuggerAgentHelper.injectSink(sink);
121+
runs = 1010;
122+
for (int i = 0; i < runs; i++) {
123+
runTrace(tracer, false, 100);
124+
}
125+
assertEquals(runs * LogProbe.NON_CAPTURING_PROBE_BUDGET, sink.highRate);
126+
}
127+
105128
private void runTrace(TracerAPI tracer, boolean captureSnapshot) {
129+
runTrace(tracer, captureSnapshot, null);
130+
}
131+
132+
private void runTrace(TracerAPI tracer, boolean captureSnapshot, Integer line) {
106133
AgentSpan span = tracer.startSpan("budget testing", "test span");
107134
span.setTag(Tags.PROPAGATED_DEBUG, "12345:1");
108135
try (AgentScope scope = tracer.activateSpan(span, ScopeSource.MANUAL)) {
@@ -125,7 +152,11 @@ private void runTrace(TracerAPI tracer, boolean captureSnapshot) {
125152
int runs = budget + 20;
126153

127154
for (int i = 0; i < runs; i++) {
128-
logProbe.commit(entryContext, exitContext, emptyList());
155+
if (line == null) {
156+
logProbe.commit(entryContext, exitContext, emptyList());
157+
} else {
158+
logProbe.commit(entryContext, line);
159+
}
129160
}
130161
assertEquals(runs, span.getLocalRootSpan().getTag(format("_dd.ld.probe_id.%s", logProbe.id)));
131162
}

dd-java-agent/agent-profiling/profiling-controller/src/main/java/com/datadog/profiling/controller/TempLocationManager.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ default void onCleanupStart(boolean selfCleanup, long timeout, TimeUnit unit) {}
7373
private final class CleanupVisitor implements FileVisitor<Path> {
7474
private boolean shouldClean;
7575

76-
private final Set<String> pidSet = PidHelper.getJavaPids();
76+
private Set<String> pidSet;
7777

7878
private final boolean cleanSelf;
7979
private final Instant cutoff;
@@ -120,7 +120,14 @@ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
120120
// the JFR repository directories are under <basedir>/pid_<pid>
121121
String pid = fileName.startsWith(TEMPDIR_PREFIX) ? fileName.substring(4) : null;
122122
boolean isSelfPid = pid != null && pid.equals(PidHelper.getPid());
123-
shouldClean |= cleanSelf ? isSelfPid : !isSelfPid && !pidSet.contains(pid);
123+
if (cleanSelf) {
124+
shouldClean |= isSelfPid;
125+
} else if (!isSelfPid) {
126+
if (pidSet == null) {
127+
pidSet = PidHelper.getJavaPids(); // only fork jps when required
128+
}
129+
shouldClean |= !pidSet.contains(pid);
130+
}
124131
if (shouldClean) {
125132
log.debug("Cleaning temporary location {}", dir);
126133
}
@@ -294,7 +301,7 @@ private TempLocationManager() {
294301
tempDir = baseTempDir.resolve(TEMPDIR_PREFIX + pid);
295302
if (runStartupCleanup) {
296303
// do not execute the background cleanup task when running in tests
297-
AgentTaskScheduler.INSTANCE.execute(() -> cleanup(false));
304+
AgentTaskScheduler.INSTANCE.execute(cleanupTask);
298305
}
299306

300307
Thread selfCleanup =

dd-java-agent/agent-profiling/profiling-controller/src/test/java/com/datadog/profiling/controller/TempLocationManagerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
239239
Files.createFile(otherTempdir.resolve("dummy"));
240240
boolean rslt =
241241
instance.cleanup(
242-
selfCleanup, (long) (timeoutMs * (shouldSucceed ? 10 : 0.5d)), TimeUnit.MILLISECONDS);
242+
selfCleanup, (long) (timeoutMs * (shouldSucceed ? 20 : 0.5d)), TimeUnit.MILLISECONDS);
243243
assertEquals(shouldSucceed, rslt);
244244
}
245245

dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/util/JfrCliHelper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static datadog.trace.util.AgentThreadFactory.AgentThread.PROFILER_HTTP_DISPATCHER;
44

5+
import datadog.trace.api.Platform;
56
import datadog.trace.api.profiling.RecordingData;
67
import datadog.trace.relocate.api.IOLogger;
78
import datadog.trace.util.AgentThreadFactory;
@@ -44,7 +45,7 @@ public static void invokeOn(final RecordingData data, final IOLogger ioLogger) {
4445
File tmp = null;
4546
try {
4647
Path jfr = Paths.get(System.getProperty("java.home"), "bin", "jfr");
47-
if (!Files.exists(jfr)) {
48+
if (Platform.isJ9() || !Files.exists(jfr)) {
4849
ioLogger.error("Failed to gather information on recording, can't find `jfr`");
4950
return;
5051
}

dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/ProfileUploaderTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import datadog.common.version.VersionInfo;
4343
import datadog.trace.api.Config;
4444
import datadog.trace.api.DDTags;
45+
import datadog.trace.api.Platform;
4546
import datadog.trace.api.profiling.ProfilingSnapshot;
4647
import datadog.trace.api.profiling.RecordingData;
4748
import datadog.trace.api.profiling.RecordingInputStream;
@@ -561,7 +562,10 @@ public void test413Response() throws Exception {
561562

562563
verify(recording).release();
563564

564-
if (Files.exists(Paths.get(System.getProperty("java.home"), "bin", "jfr"))) {
565+
// J9 has 'almost' implemented JFR, but not really
566+
// we need to skip this part for J9
567+
if (!Platform.isJ9()
568+
&& Files.exists(Paths.get(System.getProperty("java.home"), "bin", "jfr"))) {
565569
verify(ioLogger)
566570
.error(
567571
eq("Failed to upload profile, it's too big. Dumping information about the profile"));

0 commit comments

Comments
 (0)