Skip to content

Commit c4c3fc7

Browse files
committed
don't create resource twice
1 parent 1249421 commit c4c3fc7

File tree

5 files changed

+80
-50
lines changed

5 files changed

+80
-50
lines changed

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

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
1212
import io.opentelemetry.api.incubator.config.GlobalConfigProvider;
1313
import io.opentelemetry.common.ComponentLoader;
14-
import io.opentelemetry.sdk.OpenTelemetrySdk;
1514
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
16-
import io.opentelemetry.sdk.resources.Resource;
1715
import java.io.FileInputStream;
1816
import java.io.FileNotFoundException;
1917
import java.io.IOException;
@@ -102,21 +100,9 @@ private static AutoConfiguredOpenTelemetrySdk getOpenTelemetrySdk(
102100
"io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration");
103101
Method create =
104102
declarativeConfiguration.getMethod(
105-
"create", openTelemetryConfiguration, ComponentLoader.class);
103+
"createAutoConfiguredSdk", openTelemetryConfiguration, ComponentLoader.class);
106104

107-
OpenTelemetrySdk sdk = (OpenTelemetrySdk) create.invoke(null, model, componentLoader);
108-
Class<?> sdkConfigProvider =
109-
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-
Method createResource =
115-
declarativeConfiguration.getMethod(
116-
"createResource", openTelemetryConfiguration, ComponentLoader.class);
117-
Resource resource = (Resource) createResource.invoke(null, model, componentLoader);
118-
119-
return AutoConfiguredOpenTelemetrySdk.create(sdk, resource, null, configProvider);
105+
return (AutoConfiguredOpenTelemetrySdk) create.invoke(null, model, componentLoader);
120106
}
121107

122108
// Visible for testing

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

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

88
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
99
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
10-
import io.opentelemetry.api.metrics.MeterProvider;
10+
import io.opentelemetry.common.ComponentLoader;
1111
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1212
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
1313
import java.io.Closeable;
@@ -16,19 +16,24 @@
1616
import java.util.List;
1717
import java.util.function.Function;
1818
import java.util.stream.Collectors;
19-
import javax.annotation.Nullable;
2019

2120
/** Declarative configuration context and state carrier. */
2221
class DeclarativeConfigContext {
2322

2423
private final SpiHelper spiHelper;
2524
private final List<Closeable> closeables = new ArrayList<>();
25+
private Resource resource = Resource.empty();
2626
@Nullable private volatile MeterProvider meterProvider;
2727

28+
// Visible for testing
2829
DeclarativeConfigContext(SpiHelper spiHelper) {
2930
this.spiHelper = spiHelper;
3031
}
3132

33+
static DeclarativeConfigContext create(ComponentLoader componentLoader) {
34+
return new DeclarativeConfigContext(SpiHelper.create(componentLoader));
35+
}
36+
3237
/**
3338
* Add the {@code closeable} to the list of closeables to clean up if configuration fails
3439
* exceptionally, and return it.
@@ -51,6 +56,18 @@ public void setMeterProvider(MeterProvider meterProvider) {
5156
this.meterProvider = meterProvider;
5257
}
5358

59+
Resource getResource() {
60+
return resource;
61+
}
62+
63+
void setResource(Resource resource) {
64+
this.resource = resource;
65+
}
66+
67+
SpiHelper getSpiHelper() {
68+
return spiHelper;
69+
}
70+
5471
/**
5572
* Find a registered {@link ComponentProvider} with {@link ComponentProvider#getType()} matching
5673
* {@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: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
1414
import io.opentelemetry.common.ComponentLoader;
1515
import io.opentelemetry.sdk.OpenTelemetrySdk;
16-
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
16+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
17+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
18+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
1719
import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener;
1820
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
1921
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
@@ -24,6 +26,8 @@
2426
import java.io.Closeable;
2527
import java.io.IOException;
2628
import java.io.InputStream;
29+
import java.lang.reflect.InvocationTargetException;
30+
import java.lang.reflect.Method;
2731
import java.util.Collections;
2832
import java.util.Map;
2933
import java.util.Objects;
@@ -116,40 +120,62 @@ public static ExtendedOpenTelemetrySdk create(
116120
*/
117121
public static ExtendedOpenTelemetrySdk create(
118122
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
119-
SpiHelper spiHelper = SpiHelper.create(componentLoader);
123+
return create(configurationModel, DeclarativeConfigContext.create(componentLoader));
124+
}
125+
126+
private static OpenTelemetrySdk create(
127+
OpenTelemetryConfigurationModel configurationModel, DeclarativeConfigContext context) {
128+
DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder();
129+
130+
for (DeclarativeConfigurationCustomizerProvider provider :
131+
context.getSpiHelper().loadOrdered(DeclarativeConfigurationCustomizerProvider.class)) {
132+
provider.customize(builder);
133+
}
120134

121135
ExtendedOpenTelemetrySdk sdk = createAndMaybeCleanup(
122136
OpenTelemetryConfigurationFactory.getInstance(),
123-
spiHelper,
124-
customizeModel(configurationModel, spiHelper));
137+
context,
138+
builder.customizeModel(configurationModel));
125139
callAutoConfigureListeners(spiHelper, sdk);
126140
return sdk;
127141
}
128142

129-
public static Resource createResource(
143+
public static AutoConfiguredOpenTelemetrySdk createAutoConfiguredSdk(
130144
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
131-
SpiHelper spiHelper = SpiHelper.create(componentLoader);
132-
OpenTelemetryConfigurationModel model = customizeModel(configurationModel, spiHelper);
133-
134-
Resource resource = Resource.getDefault();
135-
if (model.getResource() != null) {
136-
resource =
137-
ResourceFactory.getInstance()
138-
.create(model.getResource(), new DeclarativeConfigContext(spiHelper));
139-
}
140-
return resource;
141-
}
145+
DeclarativeConfigContext context = DeclarativeConfigContext.create(componentLoader);
142146

143-
private static OpenTelemetryConfigurationModel customizeModel(
144-
OpenTelemetryConfigurationModel configurationModel, SpiHelper spiHelper) {
145-
DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder();
147+
OpenTelemetrySdk sdk = create(configurationModel, context);
148+
SdkConfigProvider provider = SdkConfigProvider.create(configurationModel, componentLoader);
146149

147-
for (DeclarativeConfigurationCustomizerProvider provider :
148-
spiHelper.loadOrdered(DeclarativeConfigurationCustomizerProvider.class)) {
149-
provider.customize(builder);
150+
try {
151+
Method method =
152+
Class.forName(AutoConfiguredOpenTelemetrySdk.class.getName())
153+
.getDeclaredMethod(
154+
"create",
155+
OpenTelemetrySdk.class,
156+
Resource.class,
157+
ConfigProperties.class,
158+
Object.class);
159+
method.setAccessible(true);
160+
return (AutoConfiguredOpenTelemetrySdk)
161+
method.invoke(null, sdk, context.getResource(), null, provider);
162+
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) {
163+
throw new ConfigurationException(
164+
"Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?",
165+
e);
166+
} catch (InvocationTargetException e) {
167+
Throwable cause = e.getCause();
168+
if (cause instanceof DeclarativeConfigException) {
169+
throw toConfigurationException((DeclarativeConfigException) cause);
170+
}
171+
throw new ConfigurationException("Unexpected error configuring from file", e);
150172
}
173+
}
151174

152-
return builder.customizeModel(configurationModel);
175+
private static ConfigurationException toConfigurationException(
176+
DeclarativeConfigException exception) {
177+
String message = Objects.requireNonNull(exception.getMessage());
178+
return new ConfigurationException(message, exception);
153179
}
154180

155181
/**
@@ -232,7 +258,7 @@ public static Sampler createSampler(DeclarativeConfigProperties genericSamplerMo
232258
DeclarativeConfigProperties.toMap(yamlDeclarativeConfigProperties), SamplerModel.class);
233259
return createAndMaybeCleanup(
234260
SamplerFactory.getInstance(),
235-
SpiHelper.create(yamlDeclarativeConfigProperties.getComponentLoader()),
261+
DeclarativeConfigContext.create(yamlDeclarativeConfigProperties.getComponentLoader()),
236262
samplerModel);
237263
}
238264

@@ -245,8 +271,8 @@ private static YamlDeclarativeConfigProperties requireYamlDeclarativeConfigPrope
245271
return (YamlDeclarativeConfigProperties) declarativeConfigProperties;
246272
}
247273

248-
static <M, R> R createAndMaybeCleanup(Factory<M, R> factory, SpiHelper spiHelper, M model) {
249-
DeclarativeConfigContext context = new DeclarativeConfigContext(spiHelper);
274+
static <M, R> R createAndMaybeCleanup(
275+
Factory<M, R> factory, DeclarativeConfigContext context, M model) {
250276
try {
251277
return factory.create(model, context);
252278
} 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 =

sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationCreateTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
import io.opentelemetry.sdk.OpenTelemetrySdk;
2121
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
2222
import io.opentelemetry.sdk.extension.incubator.ExtendedOpenTelemetrySdk;
23+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
2324
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
2425
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
2526
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
26-
import io.opentelemetry.sdk.resources.Resource;
2727
import java.io.ByteArrayInputStream;
2828
import java.io.File;
2929
import java.io.IOException;
@@ -197,18 +197,18 @@ void callAutoConfigureListeners_exceptionIsCaught() {
197197
}
198198

199199
@Test
200-
void createResource() {
200+
void createAutoConfiguredSdk() {
201201
OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel();
202202
model.withFileFormat("1.0-rc.1");
203-
Resource resource =
204-
DeclarativeConfiguration.createResource(
203+
AutoConfiguredOpenTelemetrySdk sdk =
204+
DeclarativeConfiguration.createAutoConfiguredSdk(
205205
model,
206206
// customizer is TestDeclarativeConfigurationCustomizerProvider
207207
ComponentLoader.forClassLoader(
208208
DeclarativeConfigurationCreateTest.class.getClassLoader()));
209-
assertThat(resource.toString())
209+
assertThat(sdk.toString())
210210
.contains(
211-
"Resource{schemaUrl=null, attributes={"
211+
"resource=Resource{schemaUrl=null, attributes={"
212212
+ "color=\"blue\", "
213213
+ "foo=\"bar\", "
214214
+ "service.name=\"unknown_service:java\", "

0 commit comments

Comments
 (0)