Skip to content

Commit bf7c964

Browse files
declarative config: map common-enabled (#14589)
Co-authored-by: otelbot <[email protected]>
1 parent 1304ae8 commit bf7c964

File tree

2 files changed

+91
-10
lines changed

2 files changed

+91
-10
lines changed

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

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@
55

66
package io.opentelemetry.javaagent.tooling;
77

8+
import static io.opentelemetry.api.incubator.config.DeclarativeConfigProperties.empty;
9+
810
import io.opentelemetry.api.incubator.config.ConfigProvider;
11+
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
912
import io.opentelemetry.instrumentation.config.bridge.DeclarativeConfigPropertiesBridgeBuilder;
1013
import io.opentelemetry.javaagent.bootstrap.OpenTelemetrySdkAccess;
1114
import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig;
1215
import io.opentelemetry.sdk.OpenTelemetrySdk;
1316
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
1417
import io.opentelemetry.sdk.autoconfigure.SdkAutoconfigureAccess;
1518
import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil;
19+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
20+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
1621
import io.opentelemetry.sdk.common.CompletableResultCode;
1722
import java.util.Arrays;
1823

@@ -44,22 +49,49 @@ public static AutoConfiguredOpenTelemetrySdk installOpenTelemetrySdk(
4449
return SdkAutoconfigureAccess.create(
4550
sdk,
4651
SdkAutoconfigureAccess.getResource(autoConfiguredSdk),
47-
new DeclarativeConfigPropertiesBridgeBuilder()
48-
.addMapping("otel.javaagent", "agent")
49-
// these properties are used to initialize the SDK before the configuration file
50-
// is loaded for consistency, we pass them to the bridge, so that they can be read
51-
// later with the same value from the {@link DeclarativeConfigPropertiesBridge}
52-
.addOverride(
53-
"otel.javaagent.debug", earlyConfig.getBoolean("otel.javaagent.debug", false))
54-
.addOverride(
55-
"otel.javaagent.logging", earlyConfig.getString("otel.javaagent.logging"))
56-
.buildFromInstrumentationConfig(configProvider.getInstrumentationConfig()),
52+
getDeclarativeConfigBridgedProperties(earlyConfig, configProvider),
5753
configProvider);
5854
}
5955

6056
return autoConfiguredSdk;
6157
}
6258

59+
// Visible for testing
60+
static ConfigProperties getDeclarativeConfigBridgedProperties(
61+
EarlyInitAgentConfig earlyConfig, ConfigProvider configProvider) {
62+
return new DeclarativeConfigPropertiesBridgeBuilder()
63+
.addMapping("otel.javaagent", "agent")
64+
.addOverride("otel.instrumentation.common.default-enabled", defaultEnabled(configProvider))
65+
// these properties are used to initialize the SDK before the configuration file
66+
// is loaded for consistency, we pass them to the bridge, so that they can be read
67+
// later with the same value from the {@link DeclarativeConfigPropertiesBridge}
68+
.addOverride("otel.javaagent.debug", earlyConfig.getBoolean("otel.javaagent.debug", false))
69+
.addOverride("otel.javaagent.logging", earlyConfig.getString("otel.javaagent.logging"))
70+
.buildFromInstrumentationConfig(configProvider.getInstrumentationConfig());
71+
}
72+
73+
private static boolean defaultEnabled(ConfigProvider configProvider) {
74+
DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig();
75+
if (instrumentationConfig == null) {
76+
return true;
77+
}
78+
79+
String profile =
80+
instrumentationConfig
81+
.getStructured("java", empty())
82+
.getStructured("agent", empty())
83+
.getString("instrumentation_mode", "default");
84+
85+
switch (profile) {
86+
case "none":
87+
return false;
88+
case "default":
89+
return true;
90+
default:
91+
throw new ConfigurationException("Unknown instrumentation profile: " + profile);
92+
}
93+
}
94+
6395
private static void setForceFlush(OpenTelemetrySdk sdk) {
6496
OpenTelemetrySdkAccess.internalSetForceFlush(
6597
(timeout, unit) -> {

javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/OpenTelemetryInstallerTest.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,24 @@
66
package io.opentelemetry.javaagent.tooling;
77

88
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.assertj.core.api.Assertions.assertThatCode;
910

1011
import io.opentelemetry.api.GlobalOpenTelemetry;
1112
import io.opentelemetry.api.OpenTelemetry;
1213
import io.opentelemetry.javaagent.tooling.config.EarlyInitAgentConfig;
1314
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
15+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
16+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
17+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
18+
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
19+
import java.io.ByteArrayInputStream;
20+
import java.nio.charset.StandardCharsets;
21+
import java.util.function.Supplier;
1422
import org.junit.jupiter.api.AfterEach;
1523
import org.junit.jupiter.api.BeforeEach;
1624
import org.junit.jupiter.api.Test;
25+
import org.junit.jupiter.params.ParameterizedTest;
26+
import org.junit.jupiter.params.provider.CsvSource;
1727

1828
class OpenTelemetryInstallerTest {
1929

@@ -31,4 +41,43 @@ void globalOpenTelemetry() {
3141

3242
assertThat(sdk).isNotNull().isNotEqualTo(OpenTelemetry.noop());
3343
}
44+
45+
@ParameterizedTest
46+
@CsvSource({
47+
"default, true, false",
48+
"none, false, false",
49+
", true, false", // empty value means property is not set
50+
"invalid, false, true",
51+
})
52+
void defaultEnabledInDeclarativeConfigPropertiesBridge(
53+
String propertyValue, boolean expected, boolean fail) {
54+
String profile = propertyValue == null ? "" : "instrumentation_mode: \"" + propertyValue + "\"";
55+
String yaml =
56+
"file_format: \"1.0-rc.1\"\n"
57+
+ "instrumentation/development:\n"
58+
+ " java:\n"
59+
+ " agent:\n"
60+
+ " "
61+
+ profile;
62+
63+
Supplier<ConfigProperties> configPropertiesSupplier =
64+
() ->
65+
OpenTelemetryInstaller.getDeclarativeConfigBridgedProperties(
66+
EarlyInitAgentConfig.create(),
67+
SdkConfigProvider.create(
68+
DeclarativeConfiguration.parse(
69+
new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8)))));
70+
71+
if (fail) {
72+
assertThatCode(() -> configPropertiesSupplier.get())
73+
.isInstanceOf(ConfigurationException.class)
74+
.hasMessage("Unknown instrumentation profile: invalid");
75+
} else {
76+
assertThat(
77+
configPropertiesSupplier
78+
.get()
79+
.getBoolean("otel.instrumentation.common.default-enabled"))
80+
.isEqualTo(expected);
81+
}
82+
}
3483
}

0 commit comments

Comments
 (0)