Skip to content

Commit 372dff0

Browse files
authored
Merge branch 'master' into dougqh/list-iteration-benchmark
2 parents d2a2295 + f4fa29a commit 372dff0

File tree

100 files changed

+1824
-540
lines changed

Some content is hidden

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

100 files changed

+1824
-540
lines changed

.github/workflows/analyze-changes.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
${{ runner.os }}-gradle-
3131
3232
- name: Initialize CodeQL
33-
uses: github/codeql-action/init@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
33+
uses: github/codeql-action/init@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0
3434
with:
3535
languages: 'java'
3636
build-mode: 'manual'
@@ -43,7 +43,7 @@ jobs:
4343
./gradlew clean :dd-java-agent:shadowJar --build-cache --parallel --stacktrace --no-daemon --max-workers=4
4444
4545
- name: Perform CodeQL Analysis and upload results to GitHub Security tab
46-
uses: github/codeql-action/analyze@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
46+
uses: github/codeql-action/analyze@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0
4747

4848
trivy:
4949
name: Analyze changes with Trivy
@@ -102,7 +102,7 @@ jobs:
102102
TRIVY_JAVA_DB_REPOSITORY: ghcr.io/aquasecurity/trivy-java-db,public.ecr.aws/aquasecurity/trivy-java-db
103103

104104
- name: Upload Trivy scan results to GitHub Security tab
105-
uses: github/codeql-action/upload-sarif@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
105+
uses: github/codeql-action/upload-sarif@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0
106106
if: always()
107107
with:
108108
sarif_file: 'trivy-results.sarif'

.gitlab/collect_results.sh

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@ WORKSPACE_DIR=workspace
1212
mkdir -p $TEST_RESULTS_DIR
1313
mkdir -p $WORKSPACE_DIR
1414

15-
mapfile -t TEST_RESULT_DIRS < <(find $WORKSPACE_DIR -name test-results -type d)
15+
# Main project modules redirect their build directory to workspace/<project-path>/build/ in CI
16+
# (see build.gradle.kts layout.buildDirectory override). buildSrc is a separate Gradle build
17+
# that runs before the main build is configured, so this redirect never applies to it;
18+
# its test results always land in buildSrc/**/build/test-results/, not under workspace/.
19+
SEARCH_DIRS=($WORKSPACE_DIR buildSrc)
20+
21+
mapfile -t TEST_RESULT_DIRS < <(find "${SEARCH_DIRS[@]}" -name test-results -type d)
1622

1723
if [[ ${#TEST_RESULT_DIRS[@]} -eq 0 ]]; then
1824
echo "No test results found"

buildSrc/src/test/kotlin/datadog/gradle/plugin/GradleFixture.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ internal open class GradleFixture(protected val projectDir: File) {
2323
*/
2424
fun run(vararg args: String, expectFailure: Boolean = false, env: Map<String, String> = emptyMap()): BuildResult {
2525
val runner = GradleRunner.create()
26-
.withTestKitDir(File(projectDir, ".gradle-test-kit"))
26+
// Use a testkit dir scoped to this fixture's projectDir. The Tooling API always uses a
27+
// daemon and ignores org.gradle.daemon=false. By giving each test its own testkit dir,
28+
// we force a fresh daemon per test — ensuring withEnvironment() vars (e.g.
29+
// MAVEN_REPOSITORY_PROXY) are correctly set on the daemon JVM and not inherited from
30+
// a previously-started daemon with a different test's environment.
31+
.withTestKitDir(file(".testkit"))
2732
.withPluginClasspath()
2833
.withProjectDir(projectDir)
2934
.withEnvironment(System.getenv() + env)

dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracer.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static datadog.opentelemetry.shim.trace.OtelConventions.SPAN_KIND_INTERNAL;
44

55
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
6+
import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope;
67
import io.opentelemetry.api.trace.SpanBuilder;
78
import io.opentelemetry.api.trace.Tracer;
89
import javax.annotation.ParametersAreNonnullByDefault;
@@ -11,9 +12,12 @@
1112
final class OtelTracer implements Tracer {
1213
private static final String INSTRUMENTATION_NAME = otelInstrumentationName();
1314

15+
private final OtelInstrumentationScope instrumentationScope;
16+
1417
private final AgentTracer.TracerAPI tracer;
1518

16-
OtelTracer(@SuppressWarnings("unused") String instrumentationScopeName) {
19+
OtelTracer(OtelInstrumentationScope instrumentationScope) {
20+
this.instrumentationScope = instrumentationScope;
1721
this.tracer = AgentTracer.get();
1822
}
1923

@@ -24,6 +28,11 @@ public SpanBuilder spanBuilder(String spanName) {
2428
return new OtelSpanBuilder(delegate);
2529
}
2630

31+
@Override
32+
public String toString() {
33+
return "OtelTracer{instrumentationScope=" + instrumentationScope + "}";
34+
}
35+
2736
@SuppressWarnings("ConstantConditions")
2837
private static String otelInstrumentationName() {
2938
// is this the bootstrap shim for drop-in support, or the shim for manual instrumentation?

dd-java-agent/agent-otel/otel-shim/src/main/java/datadog/opentelemetry/shim/trace/OtelTracerBuilder.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
import io.opentelemetry.api.trace.Tracer;
44
import io.opentelemetry.api.trace.TracerBuilder;
5+
import javax.annotation.Nullable;
56
import javax.annotation.ParametersAreNonnullByDefault;
67

78
@ParametersAreNonnullByDefault
89
final class OtelTracerBuilder implements TracerBuilder {
910
private final OtelTracerProvider tracerProvider;
11+
1012
private final String instrumentationScopeName;
13+
@Nullable private String instrumentationScopeVersion;
14+
@Nullable private String schemaUrl;
1115

1216
OtelTracerBuilder(OtelTracerProvider tracerProvider, String instrumentationScopeName) {
1317
this.tracerProvider = tracerProvider;
@@ -16,18 +20,19 @@ final class OtelTracerBuilder implements TracerBuilder {
1620

1721
@Override
1822
public TracerBuilder setInstrumentationVersion(String instrumentationScopeVersion) {
19-
// Not supported
23+
this.instrumentationScopeVersion = instrumentationScopeVersion;
2024
return this;
2125
}
2226

2327
@Override
2428
public TracerBuilder setSchemaUrl(String schemaUrl) {
25-
// Not supported
29+
this.schemaUrl = schemaUrl;
2630
return this;
2731
}
2832

2933
@Override
3034
public Tracer build() {
31-
return tracerProvider.getTracerShim(instrumentationScopeName);
35+
return tracerProvider.getTracerShim(
36+
instrumentationScopeName, instrumentationScopeVersion, schemaUrl);
3237
}
3338
}
Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package datadog.opentelemetry.shim.trace;
22

3+
import datadog.trace.bootstrap.otel.common.OtelInstrumentationScope;
34
import datadog.trace.util.Strings;
45
import io.opentelemetry.api.trace.Tracer;
56
import io.opentelemetry.api.trace.TracerBuilder;
67
import io.opentelemetry.api.trace.TracerProvider;
78
import java.util.Map;
89
import java.util.concurrent.ConcurrentHashMap;
10+
import javax.annotation.Nullable;
911
import javax.annotation.ParametersAreNonnullByDefault;
1012
import org.slf4j.Logger;
1113
import org.slf4j.LoggerFactory;
@@ -17,31 +19,35 @@ public final class OtelTracerProvider implements TracerProvider {
1719

1820
public static final TracerProvider INSTANCE = new OtelTracerProvider();
1921

20-
/** Tracer shims, indexed by instrumentation scope name. */
21-
private final Map<String, OtelTracer> tracers = new ConcurrentHashMap<>();
22+
/** Tracer shims, indexed by instrumentation scope. */
23+
private final Map<OtelInstrumentationScope, OtelTracer> tracers = new ConcurrentHashMap<>();
2224

2325
@Override
2426
public Tracer get(String instrumentationScopeName) {
25-
return getTracerShim(instrumentationScopeName);
27+
return getTracerShim(instrumentationScopeName, null, null);
2628
}
2729

2830
@Override
29-
public Tracer get(
30-
String instrumentationScopeName,
31-
@SuppressWarnings("unused") String instrumentationScopeVersion) {
32-
return getTracerShim(instrumentationScopeName);
31+
public Tracer get(String instrumentationScopeName, String instrumentationScopeVersion) {
32+
return getTracerShim(instrumentationScopeName, instrumentationScopeVersion, null);
3333
}
3434

3535
@Override
3636
public TracerBuilder tracerBuilder(String instrumentationScopeName) {
3737
return new OtelTracerBuilder(this, instrumentationScopeName);
3838
}
3939

40-
OtelTracer getTracerShim(String instrumentationScopeName) {
40+
OtelTracer getTracerShim(
41+
String instrumentationScopeName,
42+
@Nullable String instrumentationScopeVersion,
43+
@Nullable String schemaUrl) {
4144
if (Strings.isBlank(instrumentationScopeName)) {
4245
LOGGER.debug("Tracer requested without instrumentation scope name.");
4346
instrumentationScopeName = DEFAULT_TRACER_NAME;
4447
}
45-
return tracers.computeIfAbsent(instrumentationScopeName, OtelTracer::new);
48+
return tracers.computeIfAbsent(
49+
new OtelInstrumentationScope(
50+
instrumentationScopeName, instrumentationScopeVersion, schemaUrl),
51+
OtelTracer::new);
4652
}
4753
}

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -345,14 +345,6 @@ private String getProfilerConfig() {
345345
ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_CONTEXT_FILTER,
346346
ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_CONTEXT_FILTER_DEFAULT),
347347
ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_CONTEXT_FILTER_DEFAULT);
348-
appendConfig(
349-
sb,
350-
"DDProf Wall JVMTI",
351-
configProvider.getBoolean(
352-
ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_JVMTI,
353-
ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_JVMTI_DEFAULT),
354-
ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_JVMTI_DEFAULT);
355-
356348
sb.append("\n=== DDProf Allocation Profiling ===\n");
357349
appendConfig(
358350
sb,

dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfiler.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import static com.datadog.profiling.ddprof.DatadogProfilerConfig.isTrackingGenerations;
2323
import static com.datadog.profiling.ddprof.DatadogProfilerConfig.isWallClockProfilerEnabled;
2424
import static com.datadog.profiling.ddprof.DatadogProfilerConfig.omitLineNumbers;
25-
import static com.datadog.profiling.ddprof.DatadogProfilerConfig.useJvmtiWallclockSampler;
2625
import static com.datadog.profiling.utils.ProfilingMode.ALLOCATION;
2726
import static com.datadog.profiling.utils.ProfilingMode.CPU;
2827
import static com.datadog.profiling.utils.ProfilingMode.MEMLEAK;
@@ -313,9 +312,6 @@ String cmdStartProfiling(Path file) throws IllegalStateException {
313312
} else {
314313
cmd.append(",filter=");
315314
}
316-
if (useJvmtiWallclockSampler(configProvider)) {
317-
cmd.append(",wallsampler=jvmti");
318-
}
319315
}
320316
cmd.append(",loglevel=").append(getLogLevel(configProvider));
321317
if (profilingModes.contains(ALLOCATION) || profilingModes.contains(MEMLEAK)) {

dd-java-agent/agent-profiling/profiling-ddprof/src/main/java/com/datadog/profiling/ddprof/DatadogProfilerConfig.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@
4343
import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_ENABLED;
4444
import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_INTERVAL;
4545
import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_INTERVAL_DEFAULT;
46-
import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_JVMTI;
47-
import static datadog.trace.api.config.ProfilingConfig.PROFILING_DATADOG_PROFILER_WALL_JVMTI_DEFAULT;
4846
import static datadog.trace.api.config.ProfilingConfig.PROFILING_HEAP_TRACK_GENERATIONS;
4947
import static datadog.trace.api.config.ProfilingConfig.PROFILING_HEAP_TRACK_GENERATIONS_DEFAULT;
5048
import static datadog.trace.api.config.ProfilingConfig.PROFILING_QUEUEING_TIME_ENABLED;
@@ -440,13 +438,6 @@ public static long getLong(ConfigProvider configProvider, String key) {
440438
return configProvider.getLong(key, configProvider.getLong(normalizeKey(key), -1));
441439
}
442440

443-
public static boolean useJvmtiWallclockSampler(ConfigProvider configProvider) {
444-
return getBoolean(
445-
configProvider,
446-
PROFILING_DATADOG_PROFILER_WALL_JVMTI,
447-
PROFILING_DATADOG_PROFILER_WALL_JVMTI_DEFAULT);
448-
}
449-
450441
private static String normalizeKey(String key) {
451442
return key.replace(".ddprof.", ".async.");
452443
}

dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpSingleRequestInstrumentation.java

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.instrumentation.akkahttp;
22

3+
import static datadog.trace.agent.tooling.InstrumenterModule.TargetSystem.CONTEXT_TRACKING;
34
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
45
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
56
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@@ -16,6 +17,7 @@
1617
import com.google.auto.service.AutoService;
1718
import datadog.trace.agent.tooling.Instrumenter;
1819
import datadog.trace.agent.tooling.InstrumenterModule;
20+
import datadog.trace.agent.tooling.annotation.AppliesOn;
1921
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
2022
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
2123
import net.bytebuddy.asm.Advice;
@@ -47,20 +49,23 @@ public String[] helperClassNames() {
4749
@Override
4850
public void methodAdvice(MethodTransformer transformer) {
4951
// This is mainly for compatibility with 10.0
50-
transformer.applyAdvice(
52+
transformer.applyAdvices(
5153
named("singleRequest").and(takesArgument(0, named("akka.http.scaladsl.model.HttpRequest"))),
52-
AkkaHttpSingleRequestInstrumentation.class.getName() + "$SingleRequestAdvice");
54+
AkkaHttpSingleRequestInstrumentation.class.getName() + "$SingleRequestAdvice",
55+
AkkaHttpSingleRequestInstrumentation.class.getName()
56+
+ "$SingleRequestContextPropagationAdvice");
5357
// This is for 10.1+
54-
transformer.applyAdvice(
58+
transformer.applyAdvices(
5559
named("singleRequestImpl")
5660
.and(takesArgument(0, named("akka.http.scaladsl.model.HttpRequest"))),
57-
AkkaHttpSingleRequestInstrumentation.class.getName() + "$SingleRequestAdvice");
61+
AkkaHttpSingleRequestInstrumentation.class.getName() + "$SingleRequestAdvice",
62+
AkkaHttpSingleRequestInstrumentation.class.getName()
63+
+ "$SingleRequestContextPropagationAdvice");
5864
}
5965

6066
public static class SingleRequestAdvice {
6167
@Advice.OnMethodEnter(suppress = Throwable.class)
62-
public static AgentScope methodEnter(
63-
@Advice.Argument(value = 0, readOnly = false) HttpRequest request) {
68+
public static AgentScope methodEnter(@Advice.Argument(value = 0) final HttpRequest request) {
6469
/*
6570
Versions 10.0 and 10.1 have slightly different structure that is hard to distinguish so here
6671
we cast 'wider net' and avoid instrumenting twice.
@@ -75,12 +80,6 @@ public static AgentScope methodEnter(
7580
final AgentSpan span = startSpan("akka-http", AKKA_CLIENT_REQUEST);
7681
DECORATE.afterStart(span);
7782
DECORATE.onRequest(span, request);
78-
79-
if (request != null) {
80-
DECORATE.injectContext(getCurrentContext().with(span), request, headers);
81-
// Request is immutable, so we have to assign new value once we update headers
82-
request = headers.getRequest();
83-
}
8483
return activateSpan(span);
8584
}
8685

@@ -106,4 +105,18 @@ public static void methodExit(
106105
scope.close();
107106
}
108107
}
108+
109+
@AppliesOn(CONTEXT_TRACKING)
110+
public static class SingleRequestContextPropagationAdvice {
111+
@Advice.OnMethodEnter(suppress = Throwable.class)
112+
public static void methodEnter(
113+
@Advice.Argument(value = 0, readOnly = false) HttpRequest request) {
114+
if (request == null) {
115+
return;
116+
}
117+
final AkkaHttpHeaders headers = new AkkaHttpHeaders(request);
118+
DECORATE.injectContext(getCurrentContext(), request, headers);
119+
request = headers.getRequest();
120+
}
121+
}
109122
}

0 commit comments

Comments
 (0)