From 4b5be0ef2ba54f434c16bc84277e3a2e697cbc78 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 14 Jun 2024 11:46:41 +0100 Subject: [PATCH] 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; + } +}