Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
85cff2c
feat(api): add off-CPU and wall-clock park hooks to ProfilingContextI…
kaahos Apr 26, 2026
65eab27
feat(profiling): wire TaskBlock, park, ticks, and encode to JavaProfiler
kaahos Apr 27, 2026
3ccd0cd
feat(profiling): delegate park/TaskBlock/ticks in DatadogProfilingInt…
kaahos Apr 27, 2026
88b1f2c
feat(profiling): add LockSupport.park and Object.wait instrumentation
kaahos Apr 27, 2026
9701ba6
fix
kaahos Apr 27, 2026
769b169
test
kaahos May 3, 2026
3614653
Merge branch 'master' into paul.fournillon/wallclock-signals-mitigation
kaahos May 3, 2026
e2f9451
fix test
kaahos May 3, 2026
eba5e29
fix(profiling): fix intrumentation
kaahos May 3, 2026
ec177c9
fix(profiling): add lock-support and object-wait en var to supported …
kaahos May 4, 2026
0084005
chore: rename lock-support-profiling in lock-support and object-wait-…
kaahos May 4, 2026
f56f267
feat(profiling): add shared task block helper
kaahos May 7, 2026
0e5a046
fix(profiling): use task block helper for object wait
kaahos May 7, 2026
fb099b6
test(profiling): harden lock support parked state coverage
kaahos May 7, 2026
9c1deae
Merge branch 'master' into paul.fournillon/wallclock-signals-mitigation
kaahos May 7, 2026
bc251ce
fix(profiling): instrument LockSupport from bootstrap
kaahos May 11, 2026
5b35daf
test(profiling): add LockSupport TaskBlock smoke test
kaahos May 11, 2026
584d2fc
fix: LockSupportTaskBlock _dd.trace.operation
kaahos May 11, 2026
9119ec3
Merge branch 'master' into paul.fournillon/wallclock-signals-mitigation
kaahos May 12, 2026
324b191
fix: migrate from groovy to junit
kaahos May 15, 2026
1e6df89
test: co modifications for tests only
kaahos May 15, 2026
225a962
fix: apply reviews
kaahos May 15, 2026
e0f221a
Merge branch 'master' into paul.fournillon/wallclock-signals-mitigation
kaahos May 15, 2026
d054efb
fix: apply reviews
kaahos May 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 40 additions & 1 deletion .github/workflows/run-system-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ jobs:
build:
runs-on:
group: APM Larger Runners
# Keep in sync with the JAVA_PROFILER_REF default in .gitlab-ci.yml. When non-empty,
# we clone DataDog/java-profiler at this ref, build :ddprof-lib:assembleReleaseJar
# and inject it via -Pddprof.jar=<path> instead of the published Maven artifact.
env:
JAVA_PROFILER_REF: paul.fournillon/wallclock_precheck
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # 6.0.2
Expand All @@ -39,17 +44,51 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-

# Mirrors the `build_java_profiler_ddprof` GitLab job: clone java-profiler at
# JAVA_PROFILER_REF, build :ddprof-lib:assembleReleaseJar with JDK 21 (Gradle 9.x),
# and stage the resulting jar under custom-ddprof/ddprof.jar.
# assembleRelease is the native link/assemble task only; the packaged jar is assembleReleaseJar.
- name: Build custom ddprof.jar from java-profiler
if: ${{ env.JAVA_PROFILER_REF != '' }}
run: |
set -euo pipefail
mkdir -p custom-ddprof
SRCDIR="${RUNNER_TEMP}/java-profiler-src"
rm -rf "$SRCDIR"
git clone --depth 1 --branch "$JAVA_PROFILER_REF" https://github.com/DataDog/java-profiler.git "$SRCDIR"
(
cd "$SRCDIR"
chmod +x ./gradlew
JAVA_HOME="$JAVA_HOME_21_X64" PATH="$JAVA_HOME_21_X64/bin:$PATH" ./gradlew --version
JAVA_HOME="$JAVA_HOME_21_X64" PATH="$JAVA_HOME_21_X64/bin:$PATH" \
./gradlew :ddprof-lib:assembleReleaseJar -Pskip-tests -Pskip-gtest --no-daemon
)
JAR=$(find "$SRCDIR/ddprof-lib/build/libs" -maxdepth 1 -type f -name 'ddprof-*.jar' ! -name '*-sources*' ! -name '*-javadoc*' | head -1)
if [ -z "$JAR" ] || [ ! -f "$JAR" ]; then
echo "No ddprof jar found under $SRCDIR/ddprof-lib/build/libs" >&2
ls -laR "$SRCDIR/ddprof-lib/build" 2>/dev/null || true
exit 1
fi
cp "$JAR" "$GITHUB_WORKSPACE/custom-ddprof/ddprof.jar"
echo "DDPROF_JAR=$GITHUB_WORKSPACE/custom-ddprof/ddprof.jar" >> "$GITHUB_ENV"
ls -la "$GITHUB_WORKSPACE/custom-ddprof/"

- name: Build dd-trace-java
env:
ORG_GRADLE_PROJECT_akkaRepositoryToken: ${{ secrets.AKKA_REPO_TOKEN }}
run: |
DDPROF_ARG=""
if [ -n "${DDPROF_JAR:-}" ] && [ -f "$DDPROF_JAR" ]; then
echo "Injecting custom ddprof.jar: $DDPROF_JAR"
DDPROF_ARG="-Pddprof.jar=$DDPROF_JAR"
fi
GRADLE_OPTS="-Xms2g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC" \
JAVA_HOME=$JAVA_HOME_8_X64 \
JAVA_8_HOME=$JAVA_HOME_8_X64 \
JAVA_11_HOME=$JAVA_HOME_11_X64 \
JAVA_17_HOME=$JAVA_HOME_17_X64 \
JAVA_21_HOME=$JAVA_HOME_21_X64 \
./gradlew clean :dd-java-agent:shadowJar \
./gradlew clean :dd-java-agent:shadowJar $DDPROF_ARG \
--build-cache --parallel --stacktrace --no-daemon --max-workers=4

- name: Upload artifact
Expand Down
174 changes: 163 additions & 11 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ variables:
description: "Enable flaky tests"
value: "false"

JAVA_PROFILER_REF:
description: "When non-empty, clone DataDog/java-profiler at this Git ref (branch or tag), build ddprof, and use it as ddprof.jar for Gradle jobs instead of the Maven dependency."
value: "paul.fournillon/wallclock_precheck"

# One pipeline injection package size ratchet
OCI_PACKAGE_MAX_SIZE_BYTES: 40_000_000
LIB_INJECTION_IMAGE_MAX_SIZE_BYTES: 40_000_000
Expand Down Expand Up @@ -172,9 +176,21 @@ default:
echo "Failed to find base ref for PR" >&2
fi

# When build_java_profiler_ddprof ran, its artifact is available at custom-ddprof/ddprof.jar.
# Append root project property expected by dd-java-agent/ddprof-lib/build.gradle.
.inject_custom_ddprof_jar: &inject_custom_ddprof_jar
- |
if [ -f "${CI_PROJECT_DIR}/custom-ddprof/ddprof.jar" ]; then
echo "ddprof.jar=${CI_PROJECT_DIR}/custom-ddprof/ddprof.jar" >> gradle.properties
echo "Using custom ddprof.jar from java-profiler build"
fi

.gradle_build: &gradle_build
image: ${BUILDER_IMAGE_REPO}:${BUILDER_IMAGE_VERSION_PREFIX}base
stage: build
needs:
- job: build_java_profiler_ddprof
optional: true
variables:
MAVEN_OPTS: "-Xms256M -Xmx1024M"
GRADLE_WORKERS: 6
Expand Down Expand Up @@ -224,6 +240,7 @@ default:
org.gradle.java.installations.auto-download=false
org.gradle.java.installations.fromEnv=$JAVA_HOMES
EOF
- *inject_custom_ddprof_jar
- mkdir -p .gradle
- export GRADLE_USER_HOME=$(pwd)/.gradle
# replace maven central part by MAVEN_REPOSITORY_PROXY in .mvn/wrapper/maven-wrapper.properties
Expand Down Expand Up @@ -293,8 +310,114 @@ dd-octo-sts-pre-release-check:
max: 2
when: always

# Builds java-profiler from JAVA_PROFILER_REF and publishes custom-ddprof/ddprof.jar for downstream Gradle jobs.
# Uses :ddprof-lib:assembleReleaseJar (not assembleRelease, which is native-only). JDK 21+ for release + JDK 17+ for Gradle 9.
build_java_profiler_ddprof:
image: ${BUILDER_IMAGE_REPO}:${BUILDER_IMAGE_VERSION_PREFIX}base
stage: build
rules:
- if: '$JAVA_PROFILER_REF =~ /.+/'
when: on_success
variables:
FF_USE_FASTZIP: "true"
CACHE_COMPRESSION_LEVEL: "slowest"
KUBERNETES_CPU_REQUEST: 10
KUBERNETES_MEMORY_REQUEST: 20Gi
KUBERNETES_MEMORY_LIMIT: 20Gi
before_script:
- |
# java-profiler uses Gradle 9.x; Gradle requires JVM 17+. Builder image default java is often JDK 8.
if [ -n "${JAVA_21_HOME:-}" ] && [ -x "${JAVA_21_HOME}/bin/java" ]; then
export JAVA_HOME="$JAVA_21_HOME"
elif [ -n "${JAVA_17_HOME:-}" ] && [ -x "${JAVA_17_HOME}/bin/java" ]; then
export JAVA_HOME="$JAVA_17_HOME"
else
shopt -s nullglob
for d in /usr/lib/jvm/java-21-* /usr/lib/jvm/temurin-21-* /usr/lib/jvm/java-17-*; do
if [ -x "${d}/bin/java" ]; then
export JAVA_HOME="$d"
break
fi
done
shopt -u nullglob
fi
if [ -z "${JAVA_HOME:-}" ] || ! [ -x "${JAVA_HOME}/bin/java" ]; then
echo "Could not find JDK 17+ for Gradle 9 (set JAVA_21_HOME or JAVA_17_HOME, or install JDK 21 under /usr/lib/jvm)." >&2
ls -la /usr/lib/jvm 2>/dev/null || true
exit 1
fi
export PATH="${JAVA_HOME}/bin:${PATH}"
java -version
script:
- |
set -euo pipefail
mkdir -p "${CI_PROJECT_DIR}/custom-ddprof"
SRCDIR="${CI_PROJECT_DIR}/java-profiler-src"
rm -rf "$SRCDIR"
git clone --depth 1 --branch "$JAVA_PROFILER_REF" https://github.com/DataDog/java-profiler.git "$SRCDIR"
cd "$SRCDIR"
export ORG_GRADLE_PROJECT_mavenRepositoryProxy="$MAVEN_REPOSITORY_PROXY"
export ORG_GRADLE_PROJECT_gradlePluginProxy="$GRADLE_PLUGIN_PROXY"
PROFILER_GRADLE_INIT="${CI_PROJECT_DIR}/java-profiler-init.gradle"
cat > "$PROFILER_GRADLE_INIT" <<'EOF'
def mavenRepositoryProxy = System.getenv('MAVEN_REPOSITORY_PROXY')
def gradlePluginProxy = System.getenv('GRADLE_PLUGIN_PROXY') ?: mavenRepositoryProxy

def addPluginRepositories = { repositories ->
if (gradlePluginProxy) {
repositories.maven { url = uri(gradlePluginProxy) }
}
if (mavenRepositoryProxy && mavenRepositoryProxy != gradlePluginProxy) {
repositories.maven { url = uri(mavenRepositoryProxy) }
}
}

def addMavenRepositories = { repositories ->
if (mavenRepositoryProxy) {
repositories.maven { url = uri(mavenRepositoryProxy) }
}
}

beforeSettings { settings ->
settings.pluginManagement {
repositories {
addPluginRepositories(delegate)
}
}
}

allprojects {
buildscript {
repositories {
addPluginRepositories(delegate)
}
}
repositories {
addMavenRepositories(delegate)
}
}
EOF
chmod +x ./gradlew
./gradlew --version
# assembleRelease is the native link/assemble task only; the packaged jar is assembleReleaseJar.
./gradlew --init-script "$PROFILER_GRADLE_INIT" :ddprof-lib:assembleReleaseJar -Pskip-tests -Pskip-gtest
JAR=$(find ddprof-lib/build/libs -maxdepth 1 -type f \( -name 'ddprof-*.jar' \) ! -name '*-sources*' ! -name '*-javadoc*' | head -1)
if [ -z "$JAR" ] || [ ! -f "$JAR" ]; then
echo "No ddprof jar found under ddprof-lib/build/libs" >&2
ls -la ddprof-lib/build/libs 2>/dev/null || ls -laR ddprof-lib/build 2>/dev/null || true
exit 1
fi
cp "$JAR" "${CI_PROJECT_DIR}/custom-ddprof/ddprof.jar"
ls -la "${CI_PROJECT_DIR}/custom-ddprof/"
artifacts:
when: on_success
paths:
- custom-ddprof/ddprof.jar

build:
needs:
- job: build_java_profiler_ddprof
optional: true
- job: maven-central-pre-release-check
optional: true
- job: dd-octo-sts-pre-release-check
Expand Down Expand Up @@ -405,7 +528,9 @@ publish-artifacts-to-s3:
spotless:
extends: .gradle_build
stage: tests
needs: []
needs:
- job: build_java_profiler_ddprof
optional: true
variables:
GRADLE_MEMORY_MAX: 6G
script:
Expand All @@ -415,15 +540,19 @@ spotless:
check-instrumentation-naming:
extends: .gradle_build
stage: tests
needs: [ ]
needs:
- job: build_java_profiler_ddprof
optional: true
script:
- ./gradlew --version
- ./gradlew checkInstrumentationNaming

config-inversion-linter:
extends: .gradle_build
stage: tests
needs: []
needs:
- job: build_java_profiler_ddprof
optional: true
script:
- ./gradlew --version
- ./gradlew checkConfigurations
Expand All @@ -432,7 +561,10 @@ test_published_artifacts:
extends: .gradle_build
image: ${BUILDER_IMAGE_REPO}:${BUILDER_IMAGE_VERSION_PREFIX}7 # Needs Java7 for some tests
stage: tests
needs: [ build ]
needs:
- job: build_java_profiler_ddprof
optional: true
- build
variables:
CACHE_TYPE: "lib"
script:
Expand All @@ -459,7 +591,10 @@ test_published_artifacts:

.check_job:
extends: .gradle_build
needs: [ build ]
needs:
- job: build_java_profiler_ddprof
optional: true
- build
stage: tests
variables:
CACHE_TYPE: "lib"
Expand Down Expand Up @@ -495,7 +630,9 @@ test_published_artifacts:

check_build_src:
extends: .check_job
needs: []
needs:
- job: build_java_profiler_ddprof
optional: true
variables:
GRADLE_TARGET: ":buildSrc:build"

Expand Down Expand Up @@ -530,7 +667,10 @@ check_debugger:

muzzle:
extends: .gradle_build
needs: [ build_tests ]
needs:
- job: build_java_profiler_ddprof
optional: true
- build_tests
stage: tests
rules:
- if: '$CI_COMMIT_BRANCH =~ /^mq-working-branch-/'
Expand Down Expand Up @@ -568,7 +708,10 @@ muzzle:

muzzle-dep-report:
extends: .gradle_build
needs: [ build_tests ]
needs:
- job: build_java_profiler_ddprof
optional: true
- build_tests
stage: tests
rules:
- if: '$CI_COMMIT_BRANCH =~ /^mq-working-branch-/'
Expand Down Expand Up @@ -611,7 +754,10 @@ muzzle-dep-report:
extends: .gradle_build
image: ${BUILDER_IMAGE_REPO}:${BUILDER_IMAGE_VERSION_PREFIX}$testJvm
tags: [ "docker-in-docker:amd64" ] # use docker-in-docker runner for testcontainers
needs: [ build_tests ]
needs:
- job: build_java_profiler_ddprof
optional: true
- build_tests
stage: tests
variables:
GRADLE_PARAMS: "-PskipFlakyTests"
Expand Down Expand Up @@ -919,7 +1065,10 @@ deploy_to_di_backend:manual:
deploy_to_maven_central:
extends: .gradle_build
stage: publish
needs: [ build ]
needs:
- job: build_java_profiler_ddprof
optional: true
- build
variables:
CACHE_TYPE: "lib"
rules:
Expand Down Expand Up @@ -947,7 +1096,10 @@ deploy_to_maven_central:
deploy_snapshot_with_ddprof_snapshot:
extends: .gradle_build
stage: publish
needs: [ build ]
needs:
- job: build_java_profiler_ddprof
optional: true
- build
variables:
CACHE_TYPE: "lib"
rules:
Expand Down
1 change: 1 addition & 0 deletions dd-java-agent/agent-bootstrap/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ dependencies {

testImplementation project(':dd-java-agent:testing')
testImplementation group: 'com.google.guava', name: 'guava-testlib', version: '20.0'
testImplementation libs.bundles.mockito
}

// Must use Java 11 to build JFR enabled code - there is no JFR in OpenJDK 8 (revisit once JFR in Java 8 is available)
Expand Down
3 changes: 2 additions & 1 deletion dd-java-agent/agent-bootstrap/gradle.lockfile
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ org.junit.platform:junit-platform-suite-api:1.14.1=jmhRuntimeClasspath,testRunti
org.junit.platform:junit-platform-suite-commons:1.14.1=jmhRuntimeClasspath,testRuntimeClasspath
org.junit:junit-bom:5.14.0=spotbugs
org.junit:junit-bom:5.14.1=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
org.mockito:mockito-core:4.4.0=jmhRuntimeClasspath,testRuntimeClasspath
org.mockito:mockito-core:4.4.0=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
org.mockito:mockito-junit-jupiter:4.4.0=testCompileClasspath,testRuntimeClasspath
org.objenesis:objenesis:3.3=jmhRuntimeClasspath,testCompileClasspath,testRuntimeClasspath
org.openjdk.jmh:jmh-core:1.37=jmh,jmhCompileClasspath,jmhRuntimeClasspath
org.openjdk.jmh:jmh-generator-asm:1.37=jmh,jmhCompileClasspath,jmhRuntimeClasspath
Expand Down
Loading