From c3f87a8c08249df5cdadee8a9690107868e8ad06 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 10:39:20 +0100 Subject: [PATCH 01/10] Support arbitrary lookup of 'otel.' config from extensions --- .../provider/OtelEnvironmentConfigSource.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java index 6c490d7716b..0c6bc71b222 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/config/provider/OtelEnvironmentConfigSource.java @@ -36,6 +36,8 @@ final class OtelEnvironmentConfigSource extends ConfigProvider.Source { private static final Logger log = LoggerFactory.getLogger(OtelEnvironmentConfigSource.class); + private final boolean enabled; + private final Map otelEnvironment = new HashMap<>(); private final Properties otelConfigFile = loadOtelConfigFile(); @@ -44,7 +46,15 @@ final class OtelEnvironmentConfigSource extends ConfigProvider.Source { @Override protected String get(String key) { - return otelEnvironment.get(key); + if (!enabled) { + return null; + } + + String value = otelEnvironment.get(key); + if (null == value && key.startsWith("otel.")) { + value = getOtelProperty(key); + } + return value; } @Override @@ -57,9 +67,10 @@ public ConfigOrigin origin() { } OtelEnvironmentConfigSource(Properties datadogConfigFile) { + this.enabled = traceOtelEnabled(); this.datadogConfigFile = datadogConfigFile; - if (traceOtelEnabled()) { + if (enabled) { setupOteEnvironment(); } } From c506daaccf1b56b06b9c7e4dd347b47bf88d632b Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 10:41:23 +0100 Subject: [PATCH 02/10] Use property for OTel API version --- dd-java-agent/agent-otel/otel-bootstrap/build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle index c57766ed84f..e0515626973 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle +++ b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle @@ -2,6 +2,8 @@ plugins { id "com.github.johnrengelman.shadow" } +def otelApiVersion = '1.38.0' + apply from: "$rootDir/gradle/java.gradle" apply plugin: 'instrument' @@ -33,7 +35,7 @@ spotbugs { dependencies { // latest OpenTelemetry API for drop-in support; instrumented at build-time with our shim - embeddedClasspath group: 'io.opentelemetry', name: 'opentelemetry-api', version: '1.38.0' + embeddedClasspath group: 'io.opentelemetry', name: 'opentelemetry-api', version: otelApiVersion implementation project(':dd-java-agent:agent-otel:otel-shim') From 5a1c2dd30e9d63c00ac97e675dfa11c43f100a05 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 10:42:16 +0100 Subject: [PATCH 03/10] Don't embed unnecessary classes --- dd-java-agent/agent-otel/otel-bootstrap/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle index e0515626973..7f0763cbf62 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle +++ b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle @@ -46,6 +46,8 @@ dependencies { tasks.register('unpackJars', Copy) { dependsOn configurations.embeddedClasspath exclude 'META-INF/' + exclude '**/module-info.class' + exclude '**/package-info.class' from { configurations.embeddedClasspath.collect { zipTree(it) } } From 8b7b749a7f11e50d21040510d9f9c2a002000a63 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 10:51:35 +0100 Subject: [PATCH 04/10] Use includes to control which areas of the OTel API we embed --- dd-java-agent/agent-otel/otel-bootstrap/build.gradle | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle index 7f0763cbf62..d8261d56c5c 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle +++ b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle @@ -60,9 +60,15 @@ tasks.named('compileJava') { shadowJar { dependencies deps.excludeShared + include '*.jar' + include 'io/opentelemetry/api/**' + include 'io/opentelemetry/context/**' exclude 'io/opentelemetry/context/internal/shaded/**' + include 'datadog/opentelemetry/shim/**' + include 'datadog/trace/bootstrap/otel/**' - relocate 'io.opentelemetry', 'datadog.trace.bootstrap.otel' + relocate 'io.opentelemetry.api', 'datadog.trace.bootstrap.otel.api' + relocate 'io.opentelemetry.context', 'datadog.trace.bootstrap.otel.context' relocate 'datadog.opentelemetry.shim', 'datadog.trace.bootstrap.otel.shim' } From 62e9b8ef8baf2c8b2bcbba767eaf910fa58428cc Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 10:58:09 +0100 Subject: [PATCH 05/10] Rework OTel package remapper to remap both shaded and unshaded references --- .../tooling/OtelInstrumentationMapper.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java index ae4638d0af5..8ff6679cba8 100644 --- a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java +++ b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java @@ -60,11 +60,6 @@ private String[] removeUnsupportedTypes(String[] interfaces) { static final class Renamer extends Remapper { static final Renamer INSTANCE = new Renamer(); - private static final String OTEL_JAVAAGENT_SHADED_PREFIX = - "io/opentelemetry/javaagent/shaded/io/opentelemetry/"; - - private static final String ASM_PREFIX = "org/objectweb/asm/"; - /** Datadog equivalent of OpenTelemetry instrumentation classes. */ private static final Map RENAMED_TYPES = new HashMap<>(); @@ -116,20 +111,29 @@ static final class Renamer extends Remapper { "datadog/trace/bootstrap/otel/Java8BytecodeBridge"); } + /** OpenTelemetry and related packages shaded inside the tracer. */ + private static final Map RENAMED_PACKAGES = new HashMap<>(); + + static { + RENAMED_PACKAGES.put( + "io/opentelemetry/javaagent/shaded/io/opentelemetry/", "datadog/trace/bootstrap/otel/"); + + RENAMED_PACKAGES.put("io/opentelemetry/api/", "datadog/trace/bootstrap/otel/api/"); + RENAMED_PACKAGES.put("io/opentelemetry/context/", "datadog/trace/bootstrap/otel/context/"); + + RENAMED_PACKAGES.put("org/objectweb/asm/", "net/bytebuddy/jar/asm/"); + } + @Override public String map(String internalName) { String rename = RENAMED_TYPES.get(internalName); if (null != rename) { return rename; } - // map OpenTelemetry's shaded API to our embedded copy - if (internalName.startsWith(OTEL_JAVAAGENT_SHADED_PREFIX)) { - return "datadog/trace/bootstrap/otel/" - + internalName.substring(OTEL_JAVAAGENT_SHADED_PREFIX.length()); - } - // map unshaded ASM types to the shaded copy in byte-buddy - if (internalName.startsWith(ASM_PREFIX)) { - return "net/bytebuddy/jar/asm/" + internalName.substring(ASM_PREFIX.length()); + for (Map.Entry mapping : RENAMED_PACKAGES.entrySet()) { + if (internalName.startsWith(mapping.getKey())) { + return mapping.getValue() + internalName.substring(mapping.getKey().length()); + } } return MAP_LOGGING.apply(internalName); } From e79db83aa21ef98b51a26c60843f9eacaad5c1e8 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 11:18:04 +0100 Subject: [PATCH 06/10] Embed OTel instrumentation API, removing classes already covered by existing mappings as well as experimental packages --- dd-java-agent/agent-otel/otel-bootstrap/build.gradle | 11 +++++++++++ .../tooling/OtelInstrumentationMapper.java | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle index d8261d56c5c..ae93ddae9b8 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle +++ b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle @@ -3,6 +3,7 @@ plugins { } def otelApiVersion = '1.38.0' +def otelInstrumentationApiVersion = '2.4.0' apply from: "$rootDir/gradle/java.gradle" apply plugin: 'instrument' @@ -36,6 +37,7 @@ spotbugs { dependencies { // latest OpenTelemetry API for drop-in support; instrumented at build-time with our shim embeddedClasspath group: 'io.opentelemetry', name: 'opentelemetry-api', version: otelApiVersion + embeddedClasspath group: 'io.opentelemetry.instrumentation', name: 'opentelemetry-instrumentation-api', version: otelInstrumentationApiVersion implementation project(':dd-java-agent:agent-otel:otel-shim') @@ -62,13 +64,22 @@ shadowJar { include '*.jar' include 'io/opentelemetry/api/**' + exclude 'io/opentelemetry/api/incubator/**' include 'io/opentelemetry/context/**' exclude 'io/opentelemetry/context/internal/shaded/**' + include 'io/opentelemetry/semconv/**' + include 'io/opentelemetry/instrumentation/api/**' + exclude 'io/opentelemetry/instrumentation/api/incubator/log/**' + exclude 'io/opentelemetry/instrumentation/api/internal/cache/**' + exclude 'io/opentelemetry/instrumentation/api/internal/RuntimeVirtualFieldSupplier*' + exclude 'io/opentelemetry/instrumentation/api/util/VirtualField*' include 'datadog/opentelemetry/shim/**' include 'datadog/trace/bootstrap/otel/**' relocate 'io.opentelemetry.api', 'datadog.trace.bootstrap.otel.api' relocate 'io.opentelemetry.context', 'datadog.trace.bootstrap.otel.context' + relocate 'io.opentelemetry.semconv', 'datadog.trace.bootstrap.otel.semconv' + relocate 'io.opentelemetry.instrumentation.api', 'datadog.trace.bootstrap.otel.instrumentation.api' relocate 'datadog.opentelemetry.shim', 'datadog.trace.bootstrap.otel.shim' } diff --git a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java index 8ff6679cba8..83d808c95cd 100644 --- a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java +++ b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java @@ -120,6 +120,10 @@ static final class Renamer extends Remapper { RENAMED_PACKAGES.put("io/opentelemetry/api/", "datadog/trace/bootstrap/otel/api/"); RENAMED_PACKAGES.put("io/opentelemetry/context/", "datadog/trace/bootstrap/otel/context/"); + RENAMED_PACKAGES.put("io/opentelemetry/semconv/", "datadog/trace/bootstrap/otel/semconv/"); + + RENAMED_PACKAGES.put( + "io/opentelemetry/instrumentation/", "datadog/trace/bootstrap/otel/instrumentation/"); RENAMED_PACKAGES.put("org/objectweb/asm/", "net/bytebuddy/jar/asm/"); } From 6f16d9fcf1b5799e23424271e285570ff7937802 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 11:36:02 +0100 Subject: [PATCH 07/10] Embed OTel javaagent-extension API, removing classes already covered by existing mappings as well as experimental packages As part of this we redirect CallDepth requests to our own CallDepthThreadLocalMap --- .../agent-otel/otel-bootstrap/build.gradle | 12 ++++++- .../bootstrap/otel/Java8BytecodeBridge.java | 33 ------------------- .../otel/instrumentation/CallDepth.java | 24 ++++++++++++++ .../tooling/OtelInstrumentationMapper.java | 5 ++- 4 files changed, 37 insertions(+), 37 deletions(-) delete mode 100644 dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/Java8BytecodeBridge.java create mode 100644 dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/instrumentation/CallDepth.java diff --git a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle index ae93ddae9b8..ecc07a80be8 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle +++ b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle @@ -38,7 +38,9 @@ dependencies { // latest OpenTelemetry API for drop-in support; instrumented at build-time with our shim embeddedClasspath group: 'io.opentelemetry', name: 'opentelemetry-api', version: otelApiVersion embeddedClasspath group: 'io.opentelemetry.instrumentation', name: 'opentelemetry-instrumentation-api', version: otelInstrumentationApiVersion + embeddedClasspath group: 'io.opentelemetry.javaagent', name: 'opentelemetry-javaagent-extension-api', version: "$otelInstrumentationApiVersion-alpha" + compileOnly project(':dd-java-agent:agent-bootstrap') implementation project(':dd-java-agent:agent-otel:otel-shim') instrumentPluginClasspath project(path: ':dd-java-agent:agent-otel:otel-tooling', configuration: 'instrumentPluginClasspath') @@ -69,10 +71,17 @@ shadowJar { exclude 'io/opentelemetry/context/internal/shaded/**' include 'io/opentelemetry/semconv/**' include 'io/opentelemetry/instrumentation/api/**' - exclude 'io/opentelemetry/instrumentation/api/incubator/log/**' + exclude 'io/opentelemetry/instrumentation/api/incubator/**' exclude 'io/opentelemetry/instrumentation/api/internal/cache/**' exclude 'io/opentelemetry/instrumentation/api/internal/RuntimeVirtualFieldSupplier*' exclude 'io/opentelemetry/instrumentation/api/util/VirtualField*' + include 'io/opentelemetry/javaagent/bootstrap/**' + exclude 'io/opentelemetry/javaagent/bootstrap/CallDepth*' + exclude 'io/opentelemetry/javaagent/bootstrap/internal/ClassLoaderMatcherCacheHolder*' + exclude 'io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder*' + exclude 'io/opentelemetry/javaagent/bootstrap/internal/DeprecatedConfigProperties*' + exclude 'io/opentelemetry/javaagent/bootstrap/internal/EmptyInstrumentationConfig*' + exclude 'io/opentelemetry/javaagent/bootstrap/internal/InClassLoaderMatcher*' include 'datadog/opentelemetry/shim/**' include 'datadog/trace/bootstrap/otel/**' @@ -80,6 +89,7 @@ shadowJar { relocate 'io.opentelemetry.context', 'datadog.trace.bootstrap.otel.context' relocate 'io.opentelemetry.semconv', 'datadog.trace.bootstrap.otel.semconv' relocate 'io.opentelemetry.instrumentation.api', 'datadog.trace.bootstrap.otel.instrumentation.api' + relocate 'io.opentelemetry.javaagent.bootstrap', 'datadog.trace.bootstrap.otel.instrumentation' relocate 'datadog.opentelemetry.shim', 'datadog.trace.bootstrap.otel.shim' } diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/Java8BytecodeBridge.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/Java8BytecodeBridge.java deleted file mode 100644 index ffc369acd08..00000000000 --- a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/Java8BytecodeBridge.java +++ /dev/null @@ -1,33 +0,0 @@ -package datadog.trace.bootstrap.otel; - -import io.opentelemetry.api.baggage.Baggage; -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.context.Context; - -/** Support references to OpenTelemetry's Java8BytecodeBridge in external extensions. */ -public final class Java8BytecodeBridge { - - // Static helpers that will redirect to our embedded copy of the OpenTelemetry API - - public static Context currentContext() { - return Context.current(); - } - - public static Context rootContext() { - return Context.root(); - } - - public static Span currentSpan() { - return Span.current(); - } - - public static Span spanFromContext(Context context) { - return Span.fromContext(context); - } - - public static Baggage baggageFromContext(Context context) { - return Baggage.fromContext(context); - } - - private Java8BytecodeBridge() {} -} diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/instrumentation/CallDepth.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/instrumentation/CallDepth.java new file mode 100644 index 00000000000..d0376ff2f4c --- /dev/null +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/instrumentation/CallDepth.java @@ -0,0 +1,24 @@ +package datadog.trace.bootstrap.otel.instrumentation; + +import datadog.trace.bootstrap.CallDepthThreadLocalMap; + +/** Redirects requests to our own {@link CallDepthThreadLocalMap}. */ +public final class CallDepth { + private final Class clazz; + + private CallDepth(final Class clazz) { + this.clazz = clazz; + } + + public static CallDepth forClass(Class clazz) { + return new CallDepth(clazz); + } + + public int getAndIncrement() { + return CallDepthThreadLocalMap.incrementCallDepth(clazz); + } + + public int decrementAndGet() { + return CallDepthThreadLocalMap.decrementCallDepth(clazz); + } +} diff --git a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java index 83d808c95cd..7bdc3d2d754 100644 --- a/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java +++ b/dd-java-agent/agent-otel/otel-tooling/src/main/java/datadog/opentelemetry/tooling/OtelInstrumentationMapper.java @@ -106,9 +106,6 @@ static final class Renamer extends Remapper { RENAMED_TYPES.put( "io/opentelemetry/javaagent/tooling/muzzle/references/Source", Type.getInternalName(OtelMuzzleRefBuilder.Source.class)); - RENAMED_TYPES.put( - "io/opentelemetry/javaagent/bootstrap/Java8BytecodeBridge", - "datadog/trace/bootstrap/otel/Java8BytecodeBridge"); } /** OpenTelemetry and related packages shaded inside the tracer. */ @@ -124,6 +121,8 @@ static final class Renamer extends Remapper { RENAMED_PACKAGES.put( "io/opentelemetry/instrumentation/", "datadog/trace/bootstrap/otel/instrumentation/"); + RENAMED_PACKAGES.put( + "io/opentelemetry/javaagent/bootstrap/", "datadog/trace/bootstrap/otel/instrumentation/"); RENAMED_PACKAGES.put("org/objectweb/asm/", "net/bytebuddy/jar/asm/"); } From 3312aeaab0ea8554726f450363b2032fc24b5065 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 11:40:04 +0100 Subject: [PATCH 08/10] Embed opentelemetry-javaagent-servlet-common-bootstrap --- dd-java-agent/agent-otel/otel-bootstrap/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle index ecc07a80be8..64481cdc62a 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle +++ b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle @@ -40,6 +40,9 @@ dependencies { embeddedClasspath group: 'io.opentelemetry.instrumentation', name: 'opentelemetry-instrumentation-api', version: otelInstrumentationApiVersion embeddedClasspath group: 'io.opentelemetry.javaagent', name: 'opentelemetry-javaagent-extension-api', version: "$otelInstrumentationApiVersion-alpha" + // selected bootstrap types shared across multiple OpenTelemetry instrumentations + embeddedClasspath group: 'io.opentelemetry.javaagent.instrumentation', name: 'opentelemetry-javaagent-servlet-common-bootstrap', version: "$otelInstrumentationApiVersion-alpha" + compileOnly project(':dd-java-agent:agent-bootstrap') implementation project(':dd-java-agent:agent-otel:otel-shim') From 528089e4855302ab621254cf12fe60371b30b60a Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 11:46:41 +0100 Subject: [PATCH 09/10] Redirect InstrumentationConfig requests to our own ConfigProvider --- .../agent-otel/otel-bootstrap/build.gradle | 1 + .../internal/InstrumentationConfig.java | 93 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/instrumentation/internal/InstrumentationConfig.java diff --git a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle index 64481cdc62a..c3deb5c2da9 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle +++ b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle @@ -85,6 +85,7 @@ shadowJar { exclude 'io/opentelemetry/javaagent/bootstrap/internal/DeprecatedConfigProperties*' exclude 'io/opentelemetry/javaagent/bootstrap/internal/EmptyInstrumentationConfig*' exclude 'io/opentelemetry/javaagent/bootstrap/internal/InClassLoaderMatcher*' + exclude 'io/opentelemetry/javaagent/bootstrap/internal/InstrumentationConfig*' include 'datadog/opentelemetry/shim/**' include 'datadog/trace/bootstrap/otel/**' diff --git a/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/instrumentation/internal/InstrumentationConfig.java b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/instrumentation/internal/InstrumentationConfig.java new file mode 100644 index 00000000000..78df63fde73 --- /dev/null +++ b/dd-java-agent/agent-otel/otel-bootstrap/src/main/java/datadog/trace/bootstrap/otel/instrumentation/internal/InstrumentationConfig.java @@ -0,0 +1,93 @@ +package datadog.trace.bootstrap.otel.instrumentation.internal; + +import datadog.trace.bootstrap.config.provider.ConfigProvider; +import java.time.Duration; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** Redirects requests to our own {@link ConfigProvider}. */ +public final class InstrumentationConfig { + private static final InstrumentationConfig INSTANCE = new InstrumentationConfig(); + + private static final Pattern DURATION_PATTERN = Pattern.compile("(\\d+)(ms|[DdHhMmSs]?)"); + + private static final ConfigProvider delegate = ConfigProvider.getInstance(); + + public static InstrumentationConfig get() { + return INSTANCE; + } + + public String getString(String name) { + return delegate.getString(name); + } + + public String getString(String name, String defaultValue) { + return delegate.getString(name, defaultValue); + } + + public boolean getBoolean(String name, boolean defaultValue) { + return delegate.getBoolean(name, defaultValue); + } + + public int getInt(String name, int defaultValue) { + return delegate.getInteger(name, defaultValue); + } + + public long getLong(String name, long defaultValue) { + return delegate.getLong(name, defaultValue); + } + + public double getDouble(String name, double defaultValue) { + return delegate.getDouble(name, defaultValue); + } + + public Duration getDuration(String name, Duration defaultValue) { + String durationString = delegate.getString(name); + if (null == durationString) { + return defaultValue; + } + Matcher matcher = DURATION_PATTERN.matcher(durationString); + if (matcher.matches()) { + long value = Integer.parseInt(matcher.group(1)); + String unit = matcher.group(2); + if ("D".equalsIgnoreCase(unit)) { + return Duration.ofDays(value); + } else if ("H".equalsIgnoreCase(unit)) { + return Duration.ofHours(value); + } else if ("M".equalsIgnoreCase(unit)) { + return Duration.ofMinutes(value); + } else if ("S".equalsIgnoreCase(unit)) { + return Duration.ofSeconds(value); + } else { + return Duration.ofMillis(value); // already in ms + } + } else { + throw new IllegalArgumentException( + "Invalid duration property " + name + "=" + durationString); + } + } + + public List getList(String name) { + return getList(name, Collections.emptyList()); + } + + public List getList(String name, List defaultValue) { + return delegate.getList(name, defaultValue); + } + + public Set getSet(String name, Set defaultValue) { + return delegate.getSet(name, defaultValue); + } + + public Map getMap(String name, Map defaultValue) { + Map map = delegate.getMergedMap(name); + if (map.isEmpty()) { + map = defaultValue; + } + return map; + } +} From 3a6894e6daa027225793b4ce648f9472aa628089 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 12:49:26 +0100 Subject: [PATCH 10/10] Ignore partial build class-path when checking for forbidden APIs in otel-bootstrap --- dd-java-agent/agent-otel/otel-bootstrap/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle index c3deb5c2da9..a781f141754 100644 --- a/dd-java-agent/agent-otel/otel-bootstrap/build.gradle +++ b/dd-java-agent/agent-otel/otel-bootstrap/build.gradle @@ -28,6 +28,7 @@ minimumInstructionCoverage = 0.0 minimumBranchCoverage = 0.0 forbiddenApis { + failOnMissingClasses = false ignoreFailures = true } spotbugs {