Skip to content

Commit e658462

Browse files
authored
return resource in auto configured sdk (#7639)
1 parent e6b9462 commit e658462

File tree

6 files changed

+89
-20
lines changed

6 files changed

+89
-20
lines changed

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

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -100,20 +100,32 @@ private static AutoConfiguredOpenTelemetrySdk getOpenTelemetrySdk(
100100
Class<?> declarativeConfiguration =
101101
Class.forName(
102102
"io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration");
103+
104+
Class<?> contextClass =
105+
Class.forName(
106+
"io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigContext");
107+
Method createContext = contextClass.getDeclaredMethod("create", ComponentLoader.class);
108+
createContext.setAccessible(true);
109+
Object context = createContext.invoke(null, componentLoader);
110+
103111
Method create =
104-
declarativeConfiguration.getMethod(
105-
"create", openTelemetryConfiguration, ComponentLoader.class);
112+
declarativeConfiguration.getDeclaredMethod(
113+
"create", openTelemetryConfiguration, contextClass);
114+
create.setAccessible(true);
115+
OpenTelemetrySdk sdk = (OpenTelemetrySdk) create.invoke(null, model, context);
106116

107-
OpenTelemetrySdk sdk = (OpenTelemetrySdk) create.invoke(null, model, componentLoader);
108-
Class<?> sdkConfigProvider =
117+
Class<?> providerClass =
109118
Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider");
110-
Method createFileConfigProvider =
111-
sdkConfigProvider.getMethod("create", openTelemetryConfiguration, ComponentLoader.class);
112-
ConfigProvider configProvider =
113-
(ConfigProvider) createFileConfigProvider.invoke(null, model, componentLoader);
114-
// Note: can't access file configuration resource without reflection so setting a dummy
115-
// resource
116-
return AutoConfiguredOpenTelemetrySdk.create(sdk, Resource.getDefault(), null, configProvider);
119+
Object provider =
120+
providerClass
121+
.getDeclaredMethod("create", openTelemetryConfiguration, ComponentLoader.class)
122+
.invoke(null, model, componentLoader);
123+
124+
Method getResource = contextClass.getDeclaredMethod("getResource");
125+
getResource.setAccessible(true);
126+
Resource resource = (Resource) getResource.invoke(context);
127+
128+
return AutoConfiguredOpenTelemetrySdk.create(sdk, resource, null, provider);
117129
}
118130

119131
// Visible for testing

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
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;
1110
import static org.assertj.core.api.Assertions.assertThatCode;
1211
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1312
import static org.mockito.ArgumentMatchers.any;
@@ -127,13 +126,13 @@ void configFile_Valid() {
127126
cleanup.addCloseable(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk());
128127

129128
OpenTelemetrySdk openTelemetrySdk = autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
129+
Resource resource = Resource.getDefault().toBuilder().put("service.name", "test").build();
130130
ExtendedOpenTelemetrySdk expectedSdk =
131131
ExtendedOpenTelemetrySdk.create(
132132
OpenTelemetrySdk.builder()
133133
.setTracerProvider(
134134
SdkTracerProvider.builder()
135-
.setResource(
136-
Resource.getDefault().toBuilder().put("service.name", "test").build())
135+
.setResource(resource)
137136
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
138137
.build())
139138
.build(),
@@ -142,7 +141,7 @@ void configFile_Valid() {
142141
assertThat(openTelemetrySdk.toString()).hasToString(expectedSdk.toString());
143142
// AutoConfiguredOpenTelemetrySdk#getResource() is set to a dummy value when configuring from
144143
// file
145-
assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(Resource.getDefault());
144+
assertThat(autoConfiguredOpenTelemetrySdk.getResource()).isEqualTo(resource);
146145
verify(builder, times(1)).shutdownHook(autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk());
147146
assertThat(Runtime.getRuntime().removeShutdownHook(thread)).isTrue();
148147
logCapturer.assertContains("Autoconfiguring from configuration file: " + configFilePath);

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigContext.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
99
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
1010
import io.opentelemetry.api.metrics.MeterProvider;
11+
import io.opentelemetry.common.ComponentLoader;
1112
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1213
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
14+
import io.opentelemetry.sdk.resources.Resource;
1315
import java.io.Closeable;
1416
import java.util.ArrayList;
1517
import java.util.Collections;
@@ -24,11 +26,17 @@ class DeclarativeConfigContext {
2426
private final SpiHelper spiHelper;
2527
private final List<Closeable> closeables = new ArrayList<>();
2628
@Nullable private volatile MeterProvider meterProvider;
29+
@Nullable private Resource resource = null;
2730

31+
// Visible for testing
2832
DeclarativeConfigContext(SpiHelper spiHelper) {
2933
this.spiHelper = spiHelper;
3034
}
3135

36+
static DeclarativeConfigContext create(ComponentLoader componentLoader) {
37+
return new DeclarativeConfigContext(SpiHelper.create(componentLoader));
38+
}
39+
3240
/**
3341
* Add the {@code closeable} to the list of closeables to clean up if configuration fails
3442
* exceptionally, and return it.
@@ -51,6 +59,22 @@ public void setMeterProvider(MeterProvider meterProvider) {
5159
this.meterProvider = meterProvider;
5260
}
5361

62+
Resource getResource() {
63+
// called via reflection from io.opentelemetry.sdk.autoconfigure.IncubatingUtil
64+
if (resource == null) {
65+
throw new DeclarativeConfigException("Resource has not been configured yet.");
66+
}
67+
return resource;
68+
}
69+
70+
void setResource(Resource resource) {
71+
this.resource = resource;
72+
}
73+
74+
SpiHelper getSpiHelper() {
75+
return spiHelper;
76+
}
77+
5478
/**
5579
* Find a registered {@link ComponentProvider} with {@link ComponentProvider#getType()} matching
5680
* {@code type}, {@link ComponentProvider#getName()} matching {@code name}, and call {@link

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfiguration.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,14 @@ public static ExtendedOpenTelemetrySdk create(
115115
*/
116116
public static ExtendedOpenTelemetrySdk create(
117117
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
118-
SpiHelper spiHelper = SpiHelper.create(componentLoader);
118+
return create(configurationModel, DeclarativeConfigContext.create(componentLoader));
119+
}
119120

121+
private static ExtendedOpenTelemetrySdk create(
122+
OpenTelemetryConfigurationModel configurationModel, DeclarativeConfigContext context) {
120123
DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder();
121124

125+
SpiHelper spiHelper = context.getSpiHelper();
122126
for (DeclarativeConfigurationCustomizerProvider provider :
123127
spiHelper.loadOrdered(DeclarativeConfigurationCustomizerProvider.class)) {
124128
provider.customize(builder);
@@ -127,7 +131,7 @@ public static ExtendedOpenTelemetrySdk create(
127131
ExtendedOpenTelemetrySdk sdk =
128132
createAndMaybeCleanup(
129133
OpenTelemetryConfigurationFactory.getInstance(),
130-
spiHelper,
134+
context,
131135
builder.customizeModel(configurationModel));
132136
callAutoConfigureListeners(spiHelper, sdk);
133137
return sdk;
@@ -213,7 +217,7 @@ public static Sampler createSampler(DeclarativeConfigProperties genericSamplerMo
213217
DeclarativeConfigProperties.toMap(yamlDeclarativeConfigProperties), SamplerModel.class);
214218
return createAndMaybeCleanup(
215219
SamplerFactory.getInstance(),
216-
SpiHelper.create(yamlDeclarativeConfigProperties.getComponentLoader()),
220+
DeclarativeConfigContext.create(yamlDeclarativeConfigProperties.getComponentLoader()),
217221
samplerModel);
218222
}
219223

@@ -226,8 +230,8 @@ private static YamlDeclarativeConfigProperties requireYamlDeclarativeConfigPrope
226230
return (YamlDeclarativeConfigProperties) declarativeConfigProperties;
227231
}
228232

229-
static <M, R> R createAndMaybeCleanup(Factory<M, R> factory, SpiHelper spiHelper, M model) {
230-
DeclarativeConfigContext context = new DeclarativeConfigContext(spiHelper);
233+
static <M, R> R createAndMaybeCleanup(
234+
Factory<M, R> factory, DeclarativeConfigContext context, M model) {
231235
try {
232236
return factory.create(model, context);
233237
} catch (RuntimeException e) {

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public ExtendedOpenTelemetrySdk create(
5555
if (model.getResource() != null) {
5656
resource = ResourceFactory.getInstance().create(model.getResource(), context);
5757
}
58+
context.setResource(resource);
5859

5960
if (model.getMeterProvider() != null) {
6061
SdkMeterProvider meterProvider =
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.extension.incubator.fileconfig;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.assertj.core.api.Assertions.assertThatCode;
10+
11+
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
12+
import io.opentelemetry.common.ComponentLoader;
13+
import io.opentelemetry.sdk.resources.Resource;
14+
import org.junit.jupiter.api.Test;
15+
16+
class DeclarativeConfigContextTest {
17+
18+
private final DeclarativeConfigContext context =
19+
DeclarativeConfigContext.create(
20+
ComponentLoader.forClassLoader(DeclarativeConfigContextTest.class.getClassLoader()));
21+
22+
@Test
23+
void resourceMustBeSetBeforeUse() {
24+
assertThatCode(context::getResource).isInstanceOf(DeclarativeConfigException.class);
25+
Resource resource = Resource.empty();
26+
context.setResource(resource);
27+
assertThat(context.getResource()).isSameAs(resource);
28+
}
29+
}

0 commit comments

Comments
 (0)