Skip to content

Commit 12dac23

Browse files
declarative config: early init and property mapping (#14184)
Co-authored-by: otelbot <[email protected]>
1 parent e9746da commit 12dac23

File tree

25 files changed

+450
-207
lines changed

25 files changed

+450
-207
lines changed

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/CommonConfig.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@
77

88
import static java.util.Collections.emptyMap;
99

10+
import io.opentelemetry.api.incubator.config.ConfigProvider;
11+
import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil;
1012
import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants;
1113
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceResolver;
1214
import io.opentelemetry.instrumentation.api.internal.HttpConstants;
1315
import java.util.ArrayList;
1416
import java.util.HashSet;
1517
import java.util.List;
1618
import java.util.Set;
19+
import java.util.function.Function;
20+
import java.util.function.Supplier;
1721

1822
/**
1923
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
@@ -39,16 +43,32 @@ public final class CommonConfig {
3943
public CommonConfig(InstrumentationConfig config) {
4044
peerServiceResolver =
4145
PeerServiceResolver.create(
42-
config.getMap("otel.instrumentation.common.peer-service-mapping", emptyMap()));
46+
getFromConfigProviderOrFallback(
47+
config,
48+
InstrumentationConfigUtil::peerServiceMapping,
49+
() ->
50+
config.getMap("otel.instrumentation.common.peer-service-mapping", emptyMap())));
4351

4452
clientRequestHeaders =
45-
config.getList("otel.instrumentation.http.client.capture-request-headers");
53+
getFromConfigProviderOrFallback(
54+
config,
55+
InstrumentationConfigUtil::httpClientRequestCapturedHeaders,
56+
() -> config.getList("otel.instrumentation.http.client.capture-request-headers"));
4657
clientResponseHeaders =
47-
config.getList("otel.instrumentation.http.client.capture-response-headers");
58+
getFromConfigProviderOrFallback(
59+
config,
60+
InstrumentationConfigUtil::httpClientResponseCapturedHeaders,
61+
() -> config.getList("otel.instrumentation.http.client.capture-response-headers"));
4862
serverRequestHeaders =
49-
config.getList("otel.instrumentation.http.server.capture-request-headers");
63+
getFromConfigProviderOrFallback(
64+
config,
65+
InstrumentationConfigUtil::httpServerRequestCapturedHeaders,
66+
() -> config.getList("otel.instrumentation.http.server.capture-request-headers"));
5067
serverResponseHeaders =
51-
config.getList("otel.instrumentation.http.server.capture-response-headers");
68+
getFromConfigProviderOrFallback(
69+
config,
70+
InstrumentationConfigUtil::httpServerResponseCapturedHeaders,
71+
() -> config.getList("otel.instrumentation.http.server.capture-response-headers"));
5272
knownHttpRequestMethods =
5373
new HashSet<>(
5474
config.getList(
@@ -130,4 +150,15 @@ public String getSpanIdKey() {
130150
public String getTraceFlagsKey() {
131151
return loggingTraceFlagsKey;
132152
}
153+
154+
private static <T> T getFromConfigProviderOrFallback(
155+
InstrumentationConfig config,
156+
Function<ConfigProvider, T> getFromConfigProvider,
157+
Supplier<T> fallback) {
158+
ConfigProvider configProvider = config.getConfigProvider();
159+
if (configProvider != null) {
160+
return getFromConfigProvider.apply(configProvider);
161+
}
162+
return fallback.get();
163+
}
133164
}

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/config/internal/InstrumentationConfig.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static java.util.Collections.emptyList;
99

10+
import io.opentelemetry.api.incubator.config.ConfigProvider;
1011
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
1112
import java.time.Duration;
1213
import java.util.List;
@@ -109,17 +110,30 @@ default List<String> getList(String name) {
109110
*/
110111
Map<String, String> getMap(String name, Map<String, String> defaultValue);
111112

113+
/** Returns {@code true} if declarative configuration is used in this configuration. */
114+
boolean isDeclarative();
115+
112116
/**
113-
* Returns a {@link DeclarativeConfigProperties} for the given instrumentation name, or {@code
114-
* null} if no declarative configuration is available for that instrumentation.
117+
* Returns a {@link DeclarativeConfigProperties} for the given node name, which is usually an
118+
* instrumentation name
119+
*
120+
* <p>Call {@link #isDeclarative()} first to check if declarative configuration is used.
115121
*
116122
* <p>Declarative configuration is used to configure instrumentation properties in a declarative
117123
* way, such as through YAML or JSON files.
118124
*
119-
* @param instrumentationName the name of the instrumentation
120-
* @return the declarative configuration properties for the given instrumentation name, or {@code
121-
* null} if not available
125+
* @param node the name of the instrumentation (e.g. "log4j"), the vendor name (e.g. "google"), or
126+
* "common" for common Java settings that don't apply to other languages.
127+
* @return the declarative configuration properties for the given node name
128+
* @throws IllegalStateException if {@link #isDeclarative()} returns {@code false}
129+
*/
130+
DeclarativeConfigProperties getDeclarativeConfig(String node);
131+
132+
/**
133+
* Returns the {@link ConfigProvider} if declarative configuration is used.
134+
*
135+
* @return the {@link ConfigProvider} or {@code null} if no provider is available
122136
*/
123137
@Nullable
124-
DeclarativeConfigProperties getDeclarativeConfig(String instrumentationName);
138+
ConfigProvider getConfigProvider();
125139
}

instrumentation/jmx-metrics/javaagent/src/main/java/io/opentelemetry/instrumentation/javaagent/jmx/JmxMetricInsightInstaller.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import io.opentelemetry.instrumentation.jmx.engine.MetricConfiguration;
1515
import io.opentelemetry.instrumentation.jmx.yaml.RuleParser;
1616
import io.opentelemetry.javaagent.extension.AgentListener;
17-
import io.opentelemetry.javaagent.extension.internal.ConfigPropertiesUtil;
1817
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
18+
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
1919
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
2020
import java.io.InputStream;
2121
import java.nio.file.Files;
@@ -29,7 +29,7 @@ public class JmxMetricInsightInstaller implements AgentListener {
2929

3030
@Override
3131
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) {
32-
ConfigProperties config = ConfigPropertiesUtil.resolveConfigProperties(autoConfiguredSdk);
32+
ConfigProperties config = AutoConfigureUtil.getConfig(autoConfiguredSdk);
3333

3434
if (config.getBoolean("otel.jmx.enabled", true)) {
3535
JmxMetricInsight service =

instrumentation/methods/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/methods/MethodInstrumentationModule.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
import static java.util.Collections.singletonMap;
1111

1212
import com.google.auto.service.AutoService;
13-
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
1413
import io.opentelemetry.api.trace.SpanKind;
14+
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
1515
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
1616
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1717
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
@@ -34,10 +34,11 @@ public MethodInstrumentationModule() {
3434
}
3535

3636
private static List<TypeInstrumentation> createInstrumentations() {
37-
DeclarativeConfigProperties methods =
38-
AgentInstrumentationConfig.get().getDeclarativeConfig("methods");
37+
InstrumentationConfig config = AgentInstrumentationConfig.get();
3938
List<TypeInstrumentation> list =
40-
methods != null ? MethodsConfig.parseDeclarativeConfig(methods) : parseConfigProperties();
39+
config.isDeclarative()
40+
? MethodsConfig.parseDeclarativeConfig(config.getDeclarativeConfig("methods"))
41+
: parseConfigProperties();
4142
// ensure that there is at least one instrumentation so that muzzle reference collection could
4243
// work
4344
if (list.isEmpty()) {

instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiMetricsInstaller.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
import com.google.auto.service.AutoService;
99
import io.opentelemetry.javaagent.extension.AgentListener;
10-
import io.opentelemetry.javaagent.extension.internal.ConfigPropertiesUtil;
1110
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
11+
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
1212
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1313
import java.lang.reflect.Method;
1414

@@ -21,7 +21,7 @@ public class OshiMetricsInstaller implements AgentListener {
2121

2222
@Override
2323
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) {
24-
ConfigProperties config = ConfigPropertiesUtil.resolveConfigProperties(autoConfiguredSdk);
24+
ConfigProperties config = AutoConfigureUtil.getConfig(autoConfiguredSdk);
2525

2626
boolean defaultEnabled = config.getBoolean("otel.instrumentation.common.default-enabled", true);
2727
if (!config.getBoolean("otel.instrumentation.oshi.enabled", defaultEnabled)) {

instrumentation/runtime-telemetry/runtime-telemetry-java8/javaagent/src/main/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java8/JarAnalyzerInstaller.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77

88
import com.google.auto.service.AutoService;
99
import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder;
10-
import io.opentelemetry.javaagent.extension.internal.ConfigPropertiesUtil;
1110
import io.opentelemetry.javaagent.tooling.BeforeAgentListener;
1211
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
12+
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
1313
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1414
import java.lang.instrument.Instrumentation;
1515

@@ -19,8 +19,7 @@ public class JarAnalyzerInstaller implements BeforeAgentListener {
1919

2020
@Override
2121
public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
22-
ConfigProperties config =
23-
ConfigPropertiesUtil.resolveConfigProperties(autoConfiguredOpenTelemetrySdk);
22+
ConfigProperties config = AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk);
2423

2524
boolean enabled =
2625
config.getBoolean("otel.instrumentation.runtime-telemetry.package-emitter.enabled", false);

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/properties/ConfigPropertiesBridge.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties;
77

8+
import io.opentelemetry.api.incubator.config.ConfigProvider;
89
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
910
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
1011
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
@@ -110,10 +111,21 @@ public Map<String, String> getMap(String name, Map<String, String> defaultValue)
110111
}
111112
}
112113

114+
@Override
115+
public boolean isDeclarative() {
116+
return false;
117+
}
118+
119+
@Override
120+
public DeclarativeConfigProperties getDeclarativeConfig(String node) {
121+
throw new IllegalStateException(
122+
"Declarative configuration is not supported in spring boot autoconfigure yet");
123+
}
124+
113125
@Nullable
114126
@Override
115-
public DeclarativeConfigProperties getDeclarativeConfig(String instrumentationName) {
116-
// create a spring boot bridge for DeclarativeConfigProperties
127+
public ConfigProvider getConfigProvider() {
128+
// declarative config support will be added in the future
117129
return null;
118130
}
119131
}

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/EmptyInstrumentationConfig.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.javaagent.bootstrap.internal;
77

8+
import io.opentelemetry.api.incubator.config.ConfigProvider;
89
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
910
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
1011
import java.time.Duration;
@@ -60,9 +61,20 @@ public Map<String, String> getMap(String name, Map<String, String> defaultValue)
6061
return defaultValue;
6162
}
6263

64+
@Override
65+
public boolean isDeclarative() {
66+
return false;
67+
}
68+
69+
@Override
70+
public DeclarativeConfigProperties getDeclarativeConfig(String node) {
71+
throw new IllegalStateException(
72+
"Declarative configuration is not supported in the empty instrumentation config");
73+
}
74+
6375
@Nullable
6476
@Override
65-
public DeclarativeConfigProperties getDeclarativeConfig(String instrumentationName) {
77+
public ConfigProvider getConfigProvider() {
6678
return null;
6779
}
6880
}

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/internal/ConfigPropertiesUtil.java

Lines changed: 0 additions & 44 deletions
This file was deleted.

0 commit comments

Comments
 (0)