Skip to content

Commit 59a0f56

Browse files
Merge branch 'master' into bdu/change-preferences-dir-for-tests
2 parents 40e7b82 + 94e770c commit 59a0f56

File tree

35 files changed

+902
-76
lines changed

35 files changed

+902
-76
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package datadog.trace.bootstrap.instrumentation.java.lang;
2+
3+
public final class VirtualThreadHelper {
4+
public static final String VIRTUAL_THREAD_CLASS_NAME = "java.lang.VirtualThread";
5+
6+
/**
7+
* {@link datadog.trace.bootstrap.instrumentation.api.AgentScope} class name as string literal.
8+
* This is mandatory for {@link datadog.trace.bootstrap.ContextStore} API call.
9+
*/
10+
public static final String AGENT_SCOPE_CLASS_NAME =
11+
"datadog.trace.bootstrap.instrumentation.api.AgentScope";
12+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package datadog.opentelemetry.shim;
2+
3+
import java.util.Objects;
4+
import javax.annotation.Nullable;
5+
6+
/** Instrumentation scopes have a mandatory name, optional version, and optional schema URL. */
7+
public final class OtelInstrumentationScope {
8+
9+
private final String scopeName;
10+
@Nullable private final String scopeVersion;
11+
@Nullable private final String schemaUrl;
12+
13+
public OtelInstrumentationScope(
14+
String scopeName, @Nullable String scopeVersion, @Nullable String schemaUrl) {
15+
this.scopeName = scopeName;
16+
this.scopeVersion = scopeVersion;
17+
this.schemaUrl = schemaUrl;
18+
}
19+
20+
@Override
21+
public boolean equals(Object o) {
22+
if (!(o instanceof OtelInstrumentationScope)) {
23+
return false;
24+
}
25+
26+
OtelInstrumentationScope that = (OtelInstrumentationScope) o;
27+
return scopeName.equals(that.scopeName)
28+
&& Objects.equals(scopeVersion, that.scopeVersion)
29+
&& Objects.equals(schemaUrl, that.schemaUrl);
30+
}
31+
32+
@Override
33+
public int hashCode() {
34+
int result = scopeName.hashCode();
35+
result = 31 * result + Objects.hashCode(scopeVersion);
36+
result = 31 * result + Objects.hashCode(schemaUrl);
37+
return result;
38+
}
39+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
import datadog.opentelemetry.shim.OtelInstrumentationScope;
4+
import io.opentelemetry.api.metrics.BatchCallback;
5+
import io.opentelemetry.api.metrics.DoubleGaugeBuilder;
6+
import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
7+
import io.opentelemetry.api.metrics.LongCounterBuilder;
8+
import io.opentelemetry.api.metrics.LongUpDownCounterBuilder;
9+
import io.opentelemetry.api.metrics.Meter;
10+
import io.opentelemetry.api.metrics.ObservableMeasurement;
11+
import javax.annotation.ParametersAreNonnullByDefault;
12+
13+
@ParametersAreNonnullByDefault
14+
final class OtelMeter implements Meter {
15+
16+
OtelMeter(@SuppressWarnings("unused") OtelInstrumentationScope instrumentationScope) {}
17+
18+
@Override
19+
public LongCounterBuilder counterBuilder(String instrumentName) {
20+
throw new UnsupportedOperationException("counterBuilder is not yet supported");
21+
}
22+
23+
@Override
24+
public LongUpDownCounterBuilder upDownCounterBuilder(String instrumentName) {
25+
throw new UnsupportedOperationException("upDownCounterBuilder is not yet supported");
26+
}
27+
28+
@Override
29+
public DoubleHistogramBuilder histogramBuilder(String instrumentName) {
30+
throw new UnsupportedOperationException("histogramBuilder is not yet supported");
31+
}
32+
33+
@Override
34+
public DoubleGaugeBuilder gaugeBuilder(String instrumentName) {
35+
throw new UnsupportedOperationException("gaugeBuilder is not yet supported");
36+
}
37+
38+
@Override
39+
public BatchCallback batchCallback(
40+
Runnable callback,
41+
ObservableMeasurement observableMeasurement,
42+
ObservableMeasurement... additionalMeasurements) {
43+
throw new UnsupportedOperationException("batchCallback is not yet supported");
44+
}
45+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
import io.opentelemetry.api.metrics.Meter;
4+
import io.opentelemetry.api.metrics.MeterBuilder;
5+
import javax.annotation.Nullable;
6+
import javax.annotation.ParametersAreNonnullByDefault;
7+
8+
@ParametersAreNonnullByDefault
9+
final class OtelMeterBuilder implements MeterBuilder {
10+
private final OtelMeterProvider meterProvider;
11+
12+
private final String instrumentationScopeName;
13+
@Nullable private String instrumentationScopeVersion;
14+
@Nullable private String schemaUrl;
15+
16+
OtelMeterBuilder(OtelMeterProvider meterProvider, String instrumentationScopeName) {
17+
this.meterProvider = meterProvider;
18+
this.instrumentationScopeName = instrumentationScopeName;
19+
}
20+
21+
@Override
22+
public MeterBuilder setInstrumentationVersion(String instrumentationScopeVersion) {
23+
this.instrumentationScopeVersion = instrumentationScopeVersion;
24+
return this;
25+
}
26+
27+
@Override
28+
public MeterBuilder setSchemaUrl(String schemaUrl) {
29+
this.schemaUrl = schemaUrl;
30+
return this;
31+
}
32+
33+
@Override
34+
public Meter build() {
35+
return meterProvider.getMeterShim(
36+
instrumentationScopeName, instrumentationScopeVersion, schemaUrl);
37+
}
38+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
import datadog.opentelemetry.shim.OtelInstrumentationScope;
4+
import datadog.trace.util.Strings;
5+
import io.opentelemetry.api.metrics.Meter;
6+
import io.opentelemetry.api.metrics.MeterBuilder;
7+
import io.opentelemetry.api.metrics.MeterProvider;
8+
import java.util.Map;
9+
import java.util.concurrent.ConcurrentHashMap;
10+
import javax.annotation.Nullable;
11+
import javax.annotation.ParametersAreNonnullByDefault;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
14+
15+
@ParametersAreNonnullByDefault
16+
public final class OtelMeterProvider implements MeterProvider {
17+
private static final Logger LOGGER = LoggerFactory.getLogger(OtelMeterProvider.class);
18+
private static final String DEFAULT_METER_NAME = "unknown";
19+
20+
public static final MeterProvider INSTANCE = new OtelMeterProvider();
21+
22+
/** Meter shims, indexed by instrumentation scope. */
23+
private final Map<OtelInstrumentationScope, OtelMeter> meters = new ConcurrentHashMap<>();
24+
25+
@Override
26+
public Meter get(String instrumentationScopeName) {
27+
return getMeterShim(instrumentationScopeName, null, null);
28+
}
29+
30+
@Override
31+
public MeterBuilder meterBuilder(String instrumentationScopeName) {
32+
return new OtelMeterBuilder(this, instrumentationScopeName);
33+
}
34+
35+
OtelMeter getMeterShim(
36+
String instrumentationScopeName,
37+
@Nullable String instrumentationScopeVersion,
38+
@Nullable String schemaUrl) {
39+
if (Strings.isBlank(instrumentationScopeName)) {
40+
LOGGER.debug("Meter requested without instrumentation scope name.");
41+
instrumentationScopeName = DEFAULT_METER_NAME;
42+
}
43+
return meters.computeIfAbsent(
44+
new OtelInstrumentationScope(
45+
instrumentationScopeName, instrumentationScopeVersion, schemaUrl),
46+
OtelMeter::new);
47+
}
48+
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@
88
import javax.annotation.ParametersAreNonnullByDefault;
99

1010
@ParametersAreNonnullByDefault
11-
class OtelTracer implements Tracer {
11+
final class OtelTracer implements Tracer {
1212
private static final String INSTRUMENTATION_NAME = otelInstrumentationName();
13+
1314
private final AgentTracer.TracerAPI tracer;
14-
private final String instrumentationScopeName;
1515

16-
public OtelTracer(String instrumentationScopeName) {
17-
this.instrumentationScopeName = instrumentationScopeName;
16+
OtelTracer(@SuppressWarnings("unused") String instrumentationScopeName) {
1817
this.tracer = AgentTracer.get();
1918
}
2019

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,29 @@
55
import javax.annotation.ParametersAreNonnullByDefault;
66

77
@ParametersAreNonnullByDefault
8-
class OtelTracerBuilder implements TracerBuilder {
8+
final class OtelTracerBuilder implements TracerBuilder {
9+
private final OtelTracerProvider tracerProvider;
910
private final String instrumentationScopeName;
1011

11-
public OtelTracerBuilder(String instrumentationScopeName) {
12+
OtelTracerBuilder(OtelTracerProvider tracerProvider, String instrumentationScopeName) {
13+
this.tracerProvider = tracerProvider;
1214
this.instrumentationScopeName = instrumentationScopeName;
1315
}
1416

1517
@Override
16-
public TracerBuilder setSchemaUrl(String schemaUrl) {
18+
public TracerBuilder setInstrumentationVersion(String instrumentationScopeVersion) {
1719
// Not supported
1820
return this;
1921
}
2022

2123
@Override
22-
public TracerBuilder setInstrumentationVersion(String instrumentationScopeVersion) {
24+
public TracerBuilder setSchemaUrl(String schemaUrl) {
2325
// Not supported
2426
return this;
2527
}
2628

2729
@Override
2830
public Tracer build() {
29-
return new OtelTracer(this.instrumentationScopeName);
31+
return tracerProvider.getTracerShim(instrumentationScopeName);
3032
}
3133
}
Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,47 @@
11
package datadog.opentelemetry.shim.trace;
22

3+
import datadog.trace.util.Strings;
34
import io.opentelemetry.api.trace.Tracer;
45
import io.opentelemetry.api.trace.TracerBuilder;
56
import io.opentelemetry.api.trace.TracerProvider;
6-
import java.util.HashMap;
77
import java.util.Map;
8+
import java.util.concurrent.ConcurrentHashMap;
89
import javax.annotation.ParametersAreNonnullByDefault;
910
import org.slf4j.Logger;
1011
import org.slf4j.LoggerFactory;
1112

1213
@ParametersAreNonnullByDefault
13-
public class OtelTracerProvider implements TracerProvider {
14+
public final class OtelTracerProvider implements TracerProvider {
1415
private static final Logger LOGGER = LoggerFactory.getLogger(OtelTracerProvider.class);
1516
private static final String DEFAULT_TRACER_NAME = "";
16-
public static final TracerProvider INSTANCE = new OtelTracerProvider();
1717

18-
/** Tracer instances, indexed by instrumentation scope name. */
19-
private final Map<String, Tracer> tracers;
18+
public static final TracerProvider INSTANCE = new OtelTracerProvider();
2019

21-
public OtelTracerProvider() {
22-
this.tracers = new HashMap<>();
23-
}
20+
/** Tracer shims, indexed by instrumentation scope name. */
21+
private final Map<String, OtelTracer> tracers = new ConcurrentHashMap<>();
2422

2523
@Override
2624
public Tracer get(String instrumentationScopeName) {
27-
Tracer tracer = this.tracers.get(instrumentationScopeName);
28-
if (tracer == null) {
29-
tracer = tracerBuilder(instrumentationScopeName).build();
30-
this.tracers.put(instrumentationScopeName, tracer);
31-
}
32-
return tracer;
25+
return getTracerShim(instrumentationScopeName);
3326
}
3427

3528
@Override
36-
public Tracer get(String instrumentationScopeName, String instrumentationScopeVersion) {
37-
Tracer tracer = this.tracers.get(instrumentationScopeName);
38-
if (tracer == null) {
39-
tracer =
40-
tracerBuilder(instrumentationScopeName)
41-
.setInstrumentationVersion(instrumentationScopeVersion)
42-
.build();
43-
this.tracers.put(instrumentationScopeName, tracer);
44-
}
45-
return tracer;
29+
public Tracer get(
30+
String instrumentationScopeName,
31+
@SuppressWarnings("unused") String instrumentationScopeVersion) {
32+
return getTracerShim(instrumentationScopeName);
4633
}
4734

4835
@Override
4936
public TracerBuilder tracerBuilder(String instrumentationScopeName) {
50-
if (instrumentationScopeName.trim().isEmpty()) {
37+
return new OtelTracerBuilder(this, instrumentationScopeName);
38+
}
39+
40+
OtelTracer getTracerShim(String instrumentationScopeName) {
41+
if (Strings.isBlank(instrumentationScopeName)) {
5142
LOGGER.debug("Tracer requested without instrumentation scope name.");
5243
instrumentationScopeName = DEFAULT_TRACER_NAME;
5344
}
54-
return new OtelTracerBuilder(instrumentationScopeName);
45+
return tracers.computeIfAbsent(instrumentationScopeName, OtelTracer::new);
5546
}
5647
}

dd-java-agent/agent-tooling/src/main/resources/datadog/trace/agent/tooling/bytebuddy/matcher/ignored_class_name.trie

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
0 java.lang.ProcessImpl
5151
# allow Runtime instrumentation for RASP
5252
0 java.lang.Runtime
53+
# allow context tracking for VirtualThread
54+
0 java.lang.VirtualThread
5355
0 java.net.http.*
5456
0 java.net.HttpURLConnection
5557
0 java.net.Socket

dd-java-agent/build.gradle

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,31 @@ def generalShadowJarConfig(ShadowJar shadowJarTask) {
104104
exclude '**/io/airlift/compress/snappy/**'
105105
relocate 'io.airlift', 'datadog.io.airlift'
106106

107+
// Minimize JNA, removing native libraries for unsupported environments
108+
exclude '**/com/sun/jna/aix-*/**'
109+
exclude '**/com/sun/jna/freebsd-*/**'
110+
exclude '**/com/sun/jna/linux-armel/**'
111+
exclude '**/com/sun/jna/linux-mips64el/**'
112+
exclude '**/com/sun/jna/linux-ppc/**'
113+
exclude '**/com/sun/jna/linux-ppc64le/**'
114+
exclude '**/com/sun/jna/linux-riscv64/**'
115+
exclude '**/com/sun/jna/linux-s390x/**'
116+
exclude '**/com/sun/jna/openbsd-*/**'
117+
exclude '**/com/sun/jna/sunos-*/**'
118+
119+
// Minimize JFFI, removing native libraries for unsupported environments
120+
exclude '**/jni/*-AIX/**'
121+
exclude '**/jni/*-DragonFlyBSD/**'
122+
exclude '**/jni/*-FreeBSD/**'
123+
exclude '**/jni/loongarch64-Linux/**'
124+
exclude '**/jni/mips64el-Linux/**'
125+
exclude '**/jni/ppc64-Linux/**'
126+
exclude '**/jni/ppc64le-Linux/**'
127+
exclude '**/jni/s390x-Linux/**'
128+
exclude '**/jni/sparcv9-Linux/**'
129+
exclude '**/jni/*-OpenBSD/**'
130+
exclude '**/jni/*-SunOS/**'
131+
107132
final String projectName = "${project.name}"
108133

109134
// Prevents conflict with other instances, but doesn't relocate instrumentation

0 commit comments

Comments
 (0)