Skip to content

Commit 16da1b0

Browse files
committed
Vendor specific instrumentation config options handling
1 parent f7154db commit 16da1b0

File tree

8 files changed

+72
-38
lines changed

8 files changed

+72
-38
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
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.ConfigPropertiesUtil;
1718
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
1819
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1920
import java.io.InputStream;
@@ -28,7 +29,7 @@ public class JmxMetricInsightInstaller implements AgentListener {
2829

2930
@Override
3031
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) {
31-
ConfigProperties config = AgentListener.resolveConfigProperties(autoConfiguredSdk);
32+
ConfigProperties config = ConfigPropertiesUtil.resolveConfigProperties(autoConfiguredSdk);
3233

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

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.google.auto.service.AutoService;
99
import io.opentelemetry.javaagent.extension.AgentListener;
10+
import io.opentelemetry.javaagent.extension.ConfigPropertiesUtil;
1011
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
1112
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1213
import java.lang.reflect.Method;
@@ -20,7 +21,7 @@ public class OshiMetricsInstaller implements AgentListener {
2021

2122
@Override
2223
public void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredSdk) {
23-
ConfigProperties config = AgentListener.resolveConfigProperties(autoConfiguredSdk);
24+
ConfigProperties config = ConfigPropertiesUtil.resolveConfigProperties(autoConfiguredSdk);
2425

2526
boolean defaultEnabled = config.getBoolean("otel.instrumentation.common.default-enabled", true);
2627
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 & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import com.google.auto.service.AutoService;
99
import io.opentelemetry.javaagent.bootstrap.InstrumentationHolder;
10-
import io.opentelemetry.javaagent.extension.AgentListener;
10+
import io.opentelemetry.javaagent.extension.ConfigPropertiesUtil;
1111
import io.opentelemetry.javaagent.tooling.BeforeAgentListener;
1212
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
1313
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
@@ -19,7 +19,7 @@ public class JarAnalyzerInstaller implements BeforeAgentListener {
1919

2020
@Override
2121
public void beforeAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
22-
ConfigProperties config = AgentListener.resolveConfigProperties(autoConfiguredOpenTelemetrySdk);
22+
ConfigProperties config = ConfigPropertiesUtil.resolveConfigProperties(autoConfiguredOpenTelemetrySdk);
2323

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

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/AgentListener.java

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55

66
package io.opentelemetry.javaagent.extension;
77

8-
import io.opentelemetry.api.incubator.config.ConfigProvider;
9-
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
108
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
11-
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
12-
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
139
import io.opentelemetry.sdk.autoconfigure.spi.Ordered;
1410
import java.lang.instrument.Instrumentation;
1511
import net.bytebuddy.agent.builder.AgentBuilder;
@@ -30,25 +26,4 @@ public interface AgentListener extends Ordered {
3026
*/
3127
void afterAgent(AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk);
3228

33-
/** Resolve {@link ConfigProperties} from the {@code autoConfiguredOpenTelemetrySdk}. */
34-
static ConfigProperties resolveConfigProperties(
35-
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
36-
ConfigProperties sdkConfigProperties =
37-
AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk);
38-
if (sdkConfigProperties != null) {
39-
return sdkConfigProperties;
40-
}
41-
ConfigProvider configProvider =
42-
AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk);
43-
if (configProvider != null) {
44-
DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig();
45-
46-
if (instrumentationConfig != null) {
47-
return new DeclarativeConfigPropertiesBridge(instrumentationConfig);
48-
}
49-
}
50-
// Should never happen
51-
throw new IllegalStateException(
52-
"AutoConfiguredOpenTelemetrySdk does not have ConfigProperties or DeclarativeConfigProperties. This is likely a programming error in opentelemetry-java");
53-
}
5429
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.extension;
7+
8+
import io.opentelemetry.api.incubator.config.ConfigProvider;
9+
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
10+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
11+
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
12+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
13+
14+
// TODO: Add unit test
15+
public class ConfigPropertiesUtil {
16+
private ConfigPropertiesUtil() {}
17+
18+
/** Resolve {@link ConfigProperties} from the {@code autoConfiguredOpenTelemetrySdk}. */
19+
public static ConfigProperties resolveConfigProperties(
20+
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
21+
ConfigProperties sdkConfigProperties =
22+
AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk);
23+
if (sdkConfigProperties != null) {
24+
return sdkConfigProperties;
25+
}
26+
ConfigProvider configProvider =
27+
AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk);
28+
if (configProvider != null) {
29+
DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig();
30+
31+
if (instrumentationConfig != null) {
32+
return new DeclarativeConfigPropertiesBridge(instrumentationConfig);
33+
}
34+
}
35+
// Should never happen
36+
throw new IllegalStateException(
37+
"AutoConfiguredOpenTelemetrySdk does not have ConfigProperties or DeclarativeConfigProperties. This is likely a programming error in opentelemetry-java");
38+
}
39+
}

javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/DeclarativeConfigPropertiesBridge.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,12 @@ final class DeclarativeConfigPropertiesBridge implements ConfigProperties {
5252

5353
// The node at .instrumentation.java
5454
private final DeclarativeConfigProperties instrumentationJavaNode;
55+
// The node at .instrumentation.java.vendor
56+
private final DeclarativeConfigProperties vendorNode;
5557

5658
DeclarativeConfigPropertiesBridge(DeclarativeConfigProperties instrumentationNode) {
5759
instrumentationJavaNode = instrumentationNode.getStructured("java", empty());
60+
vendorNode = instrumentationJavaNode.getStructured("vendor", empty()); // vendor could go to instrumentation.general instead
5861
}
5962

6063
@Nullable
@@ -129,17 +132,19 @@ public Map<String, String> getMap(String propertyName) {
129132

130133
@Nullable
131134
private <T> T getPropertyValue(
132-
String property, BiFunction<DeclarativeConfigProperties, String, T> extractor) {
133-
if (!property.startsWith(OTEL_INSTRUMENTATION_PREFIX)) {
134-
return null;
135+
String propertyName, BiFunction<DeclarativeConfigProperties, String, T> extractor) {
136+
if (!propertyName.startsWith(OTEL_INSTRUMENTATION_PREFIX)) {
137+
return getVendorPropertyValue(propertyName, extractor);
135138
}
136-
String suffix = property.substring(OTEL_INSTRUMENTATION_PREFIX.length());
137-
// Split the remainder of the property on ".", and walk to the N-1 entry
138-
String[] segments = suffix.split("\\.");
139+
String suffix = propertyName.substring(OTEL_INSTRUMENTATION_PREFIX.length());
140+
return getPropertyValue(instrumentationJavaNode, suffix, extractor);
141+
}
142+
143+
private static <T> T getPropertyValue(DeclarativeConfigProperties target, String propertyName, BiFunction<DeclarativeConfigProperties, String,T> extractor) {
144+
String[] segments = propertyName.split("\\.");
139145
if (segments.length == 0) {
140146
return null;
141147
}
142-
DeclarativeConfigProperties target = instrumentationJavaNode;
143148
if (segments.length > 1) {
144149
for (int i = 0; i < segments.length - 1; i++) {
145150
target = target.getStructured(segments[i], empty());
@@ -148,4 +153,9 @@ private <T> T getPropertyValue(
148153
String lastPart = segments[segments.length - 1];
149154
return extractor.apply(target, lastPart);
150155
}
156+
157+
private <T> T getVendorPropertyValue(String propertyName, BiFunction<DeclarativeConfigProperties, String,T> extractor) {
158+
return getPropertyValue(vendorNode, propertyName, extractor);
159+
}
160+
151161
}

javaagent-extension-api/src/test/java/io/opentelemetry/javaagent/extension/DeclarativeConfigPropertiesBridgeTest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ class DeclarativeConfigPropertiesBridgeTest {
4444
+ " map_key:\n"
4545
+ " string_key1: value1\n"
4646
+ " string_key2: value2\n"
47-
+ " bool_key: true\n";
47+
+ " bool_key: true\n"
48+
+ " vendor:\n"
49+
+ " acme:\n"
50+
+ " full_name:\n"
51+
+ " preserved: true";
4852

4953
private ConfigProperties bridge;
5054
private ConfigProperties emptyBridge;
@@ -132,5 +136,8 @@ void getProperties() {
132136
.isEqualTo(Arrays.asList("value1", "value2"));
133137
assertThat(bridge.getMap("otel.instrumentation.other-instrumentation.map_key", expectedMap))
134138
.isEqualTo(expectedMap);
139+
140+
// verify vendor specific property names are preserved in unchanged form (prefix is not stripped as for otel.instrumentation.*)
141+
assertThat(bridge.getBoolean("acme.full_name.preserved")).isTrue();
135142
}
136143
}

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
3232
import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder;
3333
import io.opentelemetry.javaagent.extension.AgentListener;
34+
import io.opentelemetry.javaagent.extension.ConfigPropertiesUtil;
3435
import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer;
3536
import io.opentelemetry.javaagent.extension.instrumentation.internal.EarlyInstrumentationModule;
3637
import io.opentelemetry.javaagent.tooling.asyncannotationsupport.WeakRefAsyncOperationEndStrategies;
@@ -159,7 +160,7 @@ private static void installBytebuddyAgent(
159160
AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =
160161
installOpenTelemetrySdk(extensionClassLoader);
161162

162-
ConfigProperties sdkConfig = AgentListener.resolveConfigProperties(autoConfiguredSdk);
163+
ConfigProperties sdkConfig = ConfigPropertiesUtil.resolveConfigProperties(autoConfiguredSdk);
163164
AgentInstrumentationConfig.internalInitializeConfig(new ConfigPropertiesBridge(sdkConfig));
164165
copyNecessaryConfigToSystemProperties(sdkConfig);
165166

0 commit comments

Comments
 (0)