Skip to content

Commit a7ce48f

Browse files
committed
Push autoconfigured component loader to ConfigProperties, DeclarativeConfigProperties
1 parent d6f7a42 commit a7ce48f

File tree

11 files changed

+117
-44
lines changed

11 files changed

+117
-44
lines changed

sdk-extensions/autoconfigure-spi/src/main/java/io/opentelemetry/sdk/autoconfigure/spi/internal/DefaultConfigProperties.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import io.opentelemetry.api.internal.ConfigUtil;
1212
import io.opentelemetry.api.internal.StringUtils;
13+
import io.opentelemetry.context.ComponentLoader;
1314
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1415
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
1516
import java.time.Duration;
@@ -38,6 +39,7 @@
3839
public final class DefaultConfigProperties implements ConfigProperties {
3940

4041
private final Map<String, String> config;
42+
private final ComponentLoader componentLoader;
4143

4244
/**
4345
* Creates a {@link DefaultConfigProperties} by merging system properties, environment variables,
@@ -46,23 +48,29 @@ public final class DefaultConfigProperties implements ConfigProperties {
4648
* <p>Environment variables take priority over {@code defaultProperties}. System properties take
4749
* priority over environment variables.
4850
*/
49-
public static DefaultConfigProperties create(Map<String, String> defaultProperties) {
51+
public static DefaultConfigProperties create(
52+
Map<String, String> defaultProperties, ComponentLoader componentLoader) {
5053
return new DefaultConfigProperties(
51-
ConfigUtil.safeSystemProperties(), System.getenv(), defaultProperties);
54+
ConfigUtil.safeSystemProperties(), System.getenv(), defaultProperties, componentLoader);
5255
}
5356

5457
/**
5558
* Create a {@link DefaultConfigProperties} from the {@code properties}, ignoring system
5659
* properties and environment variables.
5760
*/
5861
public static DefaultConfigProperties createFromMap(Map<String, String> properties) {
59-
return new DefaultConfigProperties(properties, Collections.emptyMap(), Collections.emptyMap());
62+
return new DefaultConfigProperties(
63+
properties,
64+
Collections.emptyMap(),
65+
Collections.emptyMap(),
66+
ComponentLoader.forClassLoader(DefaultConfigProperties.class.getClassLoader()));
6067
}
6168

6269
private DefaultConfigProperties(
6370
Map<?, ?> systemProperties,
6471
Map<String, String> environmentVariables,
65-
Map<String, String> defaultProperties) {
72+
Map<String, String> defaultProperties,
73+
ComponentLoader componentLoader) {
6674
Map<String, String> config = new HashMap<>();
6775
defaultProperties.forEach(
6876
(name, value) -> config.put(ConfigUtil.normalizePropertyKey(name), value));
@@ -73,6 +81,7 @@ private DefaultConfigProperties(
7381
config.put(ConfigUtil.normalizePropertyKey(key.toString()), value.toString()));
7482

7583
this.config = config;
84+
this.componentLoader = componentLoader;
7685
}
7786

7887
private DefaultConfigProperties(
@@ -82,6 +91,7 @@ private DefaultConfigProperties(
8291
overrides.forEach((name, value) -> config.put(ConfigUtil.normalizePropertyKey(name), value));
8392

8493
this.config = config;
94+
this.componentLoader = previousProperties.componentLoader;
8595
}
8696

8797
@Override
@@ -233,6 +243,11 @@ public Map<String, String> getMap(String name) {
233243
Map.Entry::getKey, Map.Entry::getValue, (first, next) -> next, LinkedHashMap::new));
234244
}
235245

246+
@Override
247+
public ComponentLoader getComponentLoader() {
248+
return componentLoader;
249+
}
250+
236251
/**
237252
* Return a new {@link DefaultConfigProperties} by overriding the {@code previousProperties} with
238253
* the {@code overrides}.

sdk-extensions/autoconfigure-spi/src/test/java/io/opentelemetry/sdk/autoconfigure/spi/internal/ConfigPropertiesTest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1212
import static org.assertj.core.api.Assertions.entry;
1313

14+
import io.opentelemetry.context.ComponentLoader;
1415
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1516
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
1617
import java.time.Duration;
@@ -22,6 +23,9 @@
2223

2324
class ConfigPropertiesTest {
2425

26+
private static final ComponentLoader COMPONENT_LOADER =
27+
ComponentLoader.forClassLoader(ConfigPropertiesTest.class.getClassLoader());
28+
2529
@Test
2630
void allValid() {
2731
Map<String, String> properties = makeTestProps();
@@ -246,7 +250,7 @@ void defaultMethodsDelegate() {
246250
expectedMap.put("bear", "growl");
247251

248252
Map<String, String> map = makeTestProps();
249-
ConfigProperties properties = DefaultConfigProperties.create(map);
253+
ConfigProperties properties = DefaultConfigProperties.create(map, COMPONENT_LOADER);
250254
assertThat(properties.getBoolean("test.boolean", false)).isTrue();
251255
assertThat(properties.getString("test.string", "nah")).isEqualTo("str");
252256
assertThat(properties.getDouble("test.double", 65.535)).isEqualTo(5.4);
@@ -260,7 +264,7 @@ void defaultMethodsDelegate() {
260264

261265
@Test
262266
void defaultMethodsFallBack() {
263-
ConfigProperties properties = DefaultConfigProperties.create(emptyMap());
267+
ConfigProperties properties = DefaultConfigProperties.create(emptyMap(), COMPONENT_LOADER);
264268
assertThat(properties.getBoolean("foo", true)).isTrue();
265269
assertThat(properties.getString("foo", "bar")).isEqualTo("bar");
266270
assertThat(properties.getDouble("foo", 65.535)).isEqualTo(65.535);
@@ -271,7 +275,7 @@ void defaultMethodsFallBack() {
271275

272276
@Test
273277
void defaultCollectionTypes() {
274-
ConfigProperties properties = DefaultConfigProperties.create(emptyMap());
278+
ConfigProperties properties = DefaultConfigProperties.create(emptyMap(), COMPONENT_LOADER);
275279
assertThat(properties.getList("foo", Arrays.asList("1", "2", "3")))
276280
.containsExactly("1", "2", "3");
277281
assertThat(properties.getList("foo")).isEmpty();

sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,8 @@ private ConfigProperties getConfig() {
628628
}
629629

630630
private ConfigProperties computeConfigProperties() {
631-
DefaultConfigProperties properties = DefaultConfigProperties.create(propertiesSupplier.get());
631+
DefaultConfigProperties properties =
632+
DefaultConfigProperties.create(propertiesSupplier.get(), componentLoader);
632633
for (Function<ConfigProperties, Map<String, String>> customizer : propertiesCustomizers) {
633634
Map<String, String> overrides = customizer.apply(properties);
634635
properties = properties.withOverrides(overrides);

sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/IncubatingUtil.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ static AutoConfiguredOpenTelemetrySdk configureFromFile(
5151
Class<?> sdkConfigProvider =
5252
Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider");
5353
Method createFileConfigProvider =
54-
sdkConfigProvider.getMethod("create", openTelemetryConfiguration);
55-
ConfigProvider configProvider = (ConfigProvider) createFileConfigProvider.invoke(null, model);
54+
sdkConfigProvider.getMethod("create", openTelemetryConfiguration, ComponentLoader.class);
55+
ConfigProvider configProvider =
56+
(ConfigProvider) createFileConfigProvider.invoke(null, model, componentLoader);
5657
// Note: can't access file configuration resource without reflection so setting a dummy
5758
// resource
5859
return AutoConfiguredOpenTelemetrySdk.create(

sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/ResourceConfiguration.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.opentelemetry.api.common.AttributeKey;
99
import io.opentelemetry.api.common.Attributes;
1010
import io.opentelemetry.api.common.AttributesBuilder;
11+
import io.opentelemetry.context.ComponentLoader;
1112
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1213
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1314
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
@@ -59,7 +60,10 @@ public final class ResourceConfiguration {
5960
* @return the resource.
6061
*/
6162
public static Resource createEnvironmentResource() {
62-
return createEnvironmentResource(DefaultConfigProperties.create(Collections.emptyMap()));
63+
return createEnvironmentResource(
64+
DefaultConfigProperties.create(
65+
Collections.emptyMap(),
66+
ComponentLoader.forClassLoader(ResourceConfiguration.class.getClassLoader())));
6367
}
6468

6569
/**

sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import java.util.HashMap;
6666
import java.util.List;
6767
import java.util.Map;
68+
import java.util.Objects;
6869
import java.util.Properties;
6970
import java.util.concurrent.CompletableFuture;
7071
import java.util.concurrent.CountDownLatch;
@@ -255,22 +256,28 @@ void builder_addAutoConfigurationCustomizerProviderUsingComponentLoader() {
255256
SpiHelper spiHelper =
256257
SpiHelper.create(AutoConfiguredOpenTelemetrySdkBuilder.class.getClassLoader());
257258

258-
builder
259-
.setComponentLoader(
260-
new ComponentLoader() {
261-
@SuppressWarnings("unchecked")
262-
@Override
263-
public <T> Iterable<T> load(Class<T> spiClass) {
264-
if (spiClass.equals(AutoConfigurationCustomizerProvider.class)) {
265-
return Collections.singletonList((T) customizerProvider);
266-
}
267-
return spiHelper.load(spiClass);
268-
}
269-
})
270-
.build();
259+
ComponentLoader componentLoader =
260+
new ComponentLoader() {
261+
@SuppressWarnings("unchecked")
262+
@Override
263+
public <T> Iterable<T> load(Class<T> spiClass) {
264+
if (spiClass.equals(AutoConfigurationCustomizerProvider.class)) {
265+
return Collections.singletonList((T) customizerProvider);
266+
}
267+
return spiHelper.load(spiClass);
268+
}
269+
};
271270

271+
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk =
272+
builder.setComponentLoader(componentLoader).build();
273+
274+
assertThat(
275+
Objects.requireNonNull(autoConfiguredOpenTelemetrySdk.getConfig()).getComponentLoader())
276+
.isSameAs(componentLoader);
272277
verify(customizerProvider).customize(any());
273278
verifyNoMoreInteractions(customizerProvider);
279+
280+
autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().shutdown().join(10, TimeUnit.SECONDS);
274281
}
275282

276283
@Test

sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/ResourceConfigurationTest.java

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

1313
import com.google.common.collect.ImmutableMap;
1414
import io.opentelemetry.api.common.Attributes;
15+
import io.opentelemetry.context.ComponentLoader;
1516
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1617
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1718
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
@@ -25,6 +26,9 @@
2526
@ExtendWith(MockitoExtension.class)
2627
class ResourceConfigurationTest {
2728

29+
private static final ComponentLoader componentLoader =
30+
ComponentLoader.forClassLoader(ResourceConfigurationTest.class.getClassLoader());
31+
2832
@Test
2933
void customConfigResourceWithDisabledKeys() {
3034
Map<String, String> props = new HashMap<>();
@@ -35,7 +39,7 @@ void customConfigResourceWithDisabledKeys() {
3539

3640
assertThat(
3741
ResourceConfiguration.configureResource(
38-
DefaultConfigProperties.create(props),
42+
DefaultConfigProperties.create(props, componentLoader),
3943
SpiHelper.create(ResourceConfigurationTest.class.getClassLoader()),
4044
(r, c) -> r))
4145
.isEqualTo(

sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/ResourceConfigurationTest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import io.opentelemetry.api.common.AttributeKey;
1111
import io.opentelemetry.api.common.Attributes;
12+
import io.opentelemetry.context.ComponentLoader;
1213
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
1314
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1415
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
@@ -29,14 +30,15 @@
2930
@SuppressLogger(ResourceConfiguration.class)
3031
class ResourceConfigurationTest {
3132

32-
private final SpiHelper spiHelper =
33-
SpiHelper.create(ResourceConfigurationTest.class.getClassLoader());
33+
private final ComponentLoader componentLoader =
34+
ComponentLoader.forClassLoader(ResourceConfigurationTest.class.getClassLoader());
35+
private final SpiHelper spiHelper = SpiHelper.create(componentLoader);
3436

3537
@Test
3638
void configureResource_EmptyClassLoader() {
3739
Attributes attributes =
3840
ResourceConfiguration.configureResource(
39-
DefaultConfigProperties.create(Collections.emptyMap()),
41+
DefaultConfigProperties.create(Collections.emptyMap(), componentLoader),
4042
SpiHelper.create(new URLClassLoader(new URL[0], null)),
4143
(r, c) -> r)
4244
.getAttributes();
@@ -66,7 +68,7 @@ void configureResource(
6668
}
6769
Attributes attributes =
6870
ResourceConfiguration.configureResource(
69-
DefaultConfigProperties.create(config), spiHelper, (r, c) -> r)
71+
DefaultConfigProperties.create(config, componentLoader), spiHelper, (r, c) -> r)
7072
.getAttributes();
7173

7274
attributeAssertion.accept(assertThat(attributes));

sdk-extensions/autoconfigure/src/testIncubating/java/io/opentelemetry/sdk/autoconfigure/DeclarativeConfigurationTest.java

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

88
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
99
import static java.util.Collections.singletonMap;
10+
import static org.assertj.core.api.Assertions.assertThat;
1011
import static org.assertj.core.api.Assertions.assertThatCode;
1112
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1213
import static org.mockito.ArgumentMatchers.any;
@@ -23,6 +24,7 @@
2324
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
2425
import io.opentelemetry.api.incubator.config.GlobalConfigProvider;
2526
import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil;
27+
import io.opentelemetry.context.ComponentLoader;
2628
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
2729
import io.opentelemetry.internal.testing.CleanupExtension;
2830
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
@@ -40,7 +42,7 @@
4042
import java.nio.file.Path;
4143
import java.util.Arrays;
4244
import java.util.Collections;
43-
import org.assertj.core.api.Assertions;
45+
import java.util.Optional;
4446
import org.junit.jupiter.api.BeforeEach;
4547
import org.junit.jupiter.api.Test;
4648
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -134,17 +136,39 @@ void configFile_Valid() {
134136
builder.setConfig(config).build();
135137
cleanup.addCloseable(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk());
136138

137-
Assertions.assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString())
139+
assertThat(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().toString())
138140
.isEqualTo(expectedSdk.toString());
139141
// AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from
140142
// file
141-
Assertions.assertThat(autoConfiguredOpenTelemetrySdk.getResource())
142-
.isEqualTo(Resource.getDefault());
143+
assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(Resource.getDefault());
143144
verify(builder, times(1)).shutdownHook(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk());
144-
Assertions.assertThat(Runtime.getRuntime().removeShutdownHook(thread)).isTrue();
145+
assertThat(Runtime.getRuntime().removeShutdownHook(thread)).isTrue();
145146
logCapturer.assertContains("Autoconfiguring from configuration file: " + configFilePath);
146147
}
147148

149+
@Test
150+
void configFile_setComponentLoader() {
151+
ComponentLoader componentLoader =
152+
ComponentLoader.forClassLoader(DeclarativeConfigurationTest.class.getClassLoader());
153+
ConfigProperties config =
154+
DefaultConfigProperties.createFromMap(
155+
Collections.singletonMap("otel.experimental.config.file", configFilePath.toString()));
156+
157+
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk =
158+
AutoConfiguredOpenTelemetrySdk.builder()
159+
.setConfig(config)
160+
.setComponentLoader(componentLoader)
161+
.build();
162+
cleanup.addCloseable(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk());
163+
164+
assertThat(
165+
Optional.ofNullable(AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk))
166+
.map(ConfigProvider::getInstrumentationConfig)
167+
.map(DeclarativeConfigProperties::getComponentLoader)
168+
.orElse(null))
169+
.isSameAs(componentLoader);
170+
}
171+
148172
@Test
149173
void configFile_NoShutdownHook() {
150174
ConfigProperties config =
@@ -171,9 +195,7 @@ void configFile_setResultAsGlobalFalse() {
171195
OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
172196
cleanup.addCloseable(openTelemetrySdk);
173197

174-
Assertions.assertThat(GlobalOpenTelemetry.get())
175-
.extracting("delegate")
176-
.isNotSameAs(openTelemetrySdk);
198+
assertThat(GlobalOpenTelemetry.get()).extracting("delegate").isNotSameAs(openTelemetrySdk);
177199
assertThat(GlobalConfigProvider.get())
178200
.isNotSameAs(autoConfiguredOpenTelemetrySdk.getConfigProvider());
179201
}
@@ -189,9 +211,7 @@ void configFile_setResultAsGlobalTrue() {
189211
OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
190212
cleanup.addCloseable(openTelemetrySdk);
191213

192-
Assertions.assertThat(GlobalOpenTelemetry.get())
193-
.extracting("delegate")
194-
.isSameAs(openTelemetrySdk);
214+
assertThat(GlobalOpenTelemetry.get()).extracting("delegate").isSameAs(openTelemetrySdk);
195215
assertThat(GlobalConfigProvider.get())
196216
.isSameAs(autoConfiguredOpenTelemetrySdk.getConfigProvider());
197217
}

0 commit comments

Comments
 (0)