Skip to content

Commit 52a8adf

Browse files
committed
don't create resource twice
1 parent 902fdef commit 52a8adf

File tree

5 files changed

+81
-48
lines changed

5 files changed

+81
-48
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
@@ -9,9 +9,7 @@
99
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
1010
import io.opentelemetry.api.incubator.config.GlobalConfigProvider;
1111
import io.opentelemetry.common.ComponentLoader;
12-
import io.opentelemetry.sdk.OpenTelemetrySdk;
1312
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
14-
import io.opentelemetry.sdk.resources.Resource;
1513
import java.io.FileInputStream;
1614
import java.io.FileNotFoundException;
1715
import java.io.IOException;
@@ -46,20 +44,8 @@ static AutoConfiguredOpenTelemetrySdk configureFromFile(
4644
"io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel");
4745
Method create =
4846
declarativeConfiguration.getMethod(
49-
"create", openTelemetryConfiguration, ComponentLoader.class);
50-
OpenTelemetrySdk sdk = (OpenTelemetrySdk) create.invoke(null, model, componentLoader);
51-
Class<?> sdkConfigProvider =
52-
Class.forName("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider");
53-
Method createFileConfigProvider =
54-
sdkConfigProvider.getMethod("create", openTelemetryConfiguration, ComponentLoader.class);
55-
ConfigProvider configProvider =
56-
(ConfigProvider) createFileConfigProvider.invoke(null, model, componentLoader);
57-
Method createResource =
58-
declarativeConfiguration.getMethod(
59-
"createResource", openTelemetryConfiguration, ComponentLoader.class);
60-
Resource resource = (Resource) createResource.invoke(null, model, componentLoader);
61-
62-
return AutoConfiguredOpenTelemetrySdk.create(sdk, resource, null, configProvider);
47+
"createAutoConfiguredSdk", openTelemetryConfiguration, ComponentLoader.class);
48+
return (AutoConfiguredOpenTelemetrySdk) create.invoke(null, model, componentLoader);
6349
} catch (FileNotFoundException e) {
6450
throw new ConfigurationException("Configuration file not found", e);
6551
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) {

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77

88
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
99
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
10+
import io.opentelemetry.common.ComponentLoader;
1011
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1112
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
13+
import io.opentelemetry.sdk.resources.Resource;
1214
import java.io.Closeable;
1315
import java.util.ArrayList;
1416
import java.util.Collections;
@@ -21,11 +23,17 @@ class DeclarativeConfigContext {
2123

2224
private final SpiHelper spiHelper;
2325
private final List<Closeable> closeables = new ArrayList<>();
26+
private Resource resource = Resource.empty();
2427

28+
// Visible for testing
2529
DeclarativeConfigContext(SpiHelper spiHelper) {
2630
this.spiHelper = spiHelper;
2731
}
2832

33+
static DeclarativeConfigContext create(ComponentLoader componentLoader) {
34+
return new DeclarativeConfigContext(SpiHelper.create(componentLoader));
35+
}
36+
2937
/**
3038
* Add the {@code closeable} to the list of closeables to clean up if configuration fails
3139
* exceptionally, and return it.
@@ -39,6 +47,18 @@ List<Closeable> getCloseables() {
3947
return Collections.unmodifiableList(closeables);
4048
}
4149

50+
Resource getResource() {
51+
return resource;
52+
}
53+
54+
void setResource(Resource resource) {
55+
this.resource = resource;
56+
}
57+
58+
SpiHelper getSpiHelper() {
59+
return spiHelper;
60+
}
61+
4262
/**
4363
* Find a registered {@link ComponentProvider} with {@link ComponentProvider#getType()} matching
4464
* {@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.ComponentProvider;
1820
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
1921
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel;
@@ -22,6 +24,8 @@
2224
import java.io.Closeable;
2325
import java.io.IOException;
2426
import java.io.InputStream;
27+
import java.lang.reflect.InvocationTargetException;
28+
import java.lang.reflect.Method;
2529
import java.util.Collections;
2630
import java.util.Map;
2731
import java.util.Objects;
@@ -112,38 +116,60 @@ public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurat
112116
*/
113117
public static OpenTelemetrySdk create(
114118
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
115-
SpiHelper spiHelper = SpiHelper.create(componentLoader);
119+
return create(configurationModel, DeclarativeConfigContext.create(componentLoader));
120+
}
121+
122+
private static OpenTelemetrySdk create(
123+
OpenTelemetryConfigurationModel configurationModel, DeclarativeConfigContext context) {
124+
DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder();
125+
126+
for (DeclarativeConfigurationCustomizerProvider provider :
127+
context.getSpiHelper().loadOrdered(DeclarativeConfigurationCustomizerProvider.class)) {
128+
provider.customize(builder);
129+
}
116130

117131
return createAndMaybeCleanup(
118132
OpenTelemetryConfigurationFactory.getInstance(),
119-
spiHelper,
120-
customizeModel(configurationModel, spiHelper));
133+
context,
134+
builder.customizeModel(configurationModel));
121135
}
122136

123-
public static Resource createResource(
137+
public static AutoConfiguredOpenTelemetrySdk createAutoConfiguredSdk(
124138
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
125-
SpiHelper spiHelper = SpiHelper.create(componentLoader);
126-
OpenTelemetryConfigurationModel model = customizeModel(configurationModel, spiHelper);
127-
128-
Resource resource = Resource.getDefault();
129-
if (model.getResource() != null) {
130-
resource =
131-
ResourceFactory.getInstance()
132-
.create(model.getResource(), new DeclarativeConfigContext(spiHelper));
133-
}
134-
return resource;
135-
}
139+
DeclarativeConfigContext context = DeclarativeConfigContext.create(componentLoader);
136140

137-
private static OpenTelemetryConfigurationModel customizeModel(
138-
OpenTelemetryConfigurationModel configurationModel, SpiHelper spiHelper) {
139-
DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder();
141+
OpenTelemetrySdk sdk = create(configurationModel, context);
142+
SdkConfigProvider provider = SdkConfigProvider.create(configurationModel, componentLoader);
140143

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

146-
return builder.customizeModel(configurationModel);
169+
private static ConfigurationException toConfigurationException(
170+
DeclarativeConfigException exception) {
171+
String message = Objects.requireNonNull(exception.getMessage());
172+
return new ConfigurationException(message, exception);
147173
}
148174

149175
/**
@@ -226,7 +252,7 @@ public static Sampler createSampler(DeclarativeConfigProperties genericSamplerMo
226252
DeclarativeConfigProperties.toMap(yamlDeclarativeConfigProperties), SamplerModel.class);
227253
return createAndMaybeCleanup(
228254
SamplerFactory.getInstance(),
229-
SpiHelper.create(yamlDeclarativeConfigProperties.getComponentLoader()),
255+
DeclarativeConfigContext.create(yamlDeclarativeConfigProperties.getComponentLoader()),
230256
samplerModel);
231257
}
232258

@@ -239,8 +265,8 @@ private static YamlDeclarativeConfigProperties requireYamlDeclarativeConfigPrope
239265
return (YamlDeclarativeConfigProperties) declarativeConfigProperties;
240266
}
241267

242-
static <M, R> R createAndMaybeCleanup(Factory<M, R> factory, SpiHelper spiHelper, M model) {
243-
DeclarativeConfigContext context = new DeclarativeConfigContext(spiHelper);
268+
static <M, R> R createAndMaybeCleanup(
269+
Factory<M, R> factory, DeclarativeConfigContext context, M model) {
244270
try {
245271
return factory.create(model, context);
246272
} 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
@@ -52,6 +52,7 @@ public OpenTelemetrySdk create(
5252
if (model.getResource() != null) {
5353
resource = ResourceFactory.getInstance().create(model.getResource(), context);
5454
}
55+
context.setResource(resource);
5556

5657
if (model.getLoggerProvider() != null) {
5758
builder.setLoggerProvider(

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
@@ -16,10 +16,10 @@
1616
import io.opentelemetry.common.ComponentLoader;
1717
import io.opentelemetry.internal.testing.CleanupExtension;
1818
import io.opentelemetry.sdk.OpenTelemetrySdk;
19+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
1920
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
2021
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
2122
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
22-
import io.opentelemetry.sdk.resources.Resource;
2323
import java.io.ByteArrayInputStream;
2424
import java.io.File;
2525
import java.io.IOException;
@@ -176,18 +176,18 @@ void create_ModelCustomizer() {
176176
}
177177

178178
@Test
179-
void createResource() {
179+
void createAutoConfiguredSdk() {
180180
OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel();
181181
model.withFileFormat("1.0-rc.1");
182-
Resource resource =
183-
DeclarativeConfiguration.createResource(
182+
AutoConfiguredOpenTelemetrySdk sdk =
183+
DeclarativeConfiguration.createAutoConfiguredSdk(
184184
model,
185185
// customizer is TestDeclarativeConfigurationCustomizerProvider
186186
ComponentLoader.forClassLoader(
187187
DeclarativeConfigurationCreateTest.class.getClassLoader()));
188-
assertThat(resource.toString())
188+
assertThat(sdk.toString())
189189
.contains(
190-
"Resource{schemaUrl=null, attributes={"
190+
"resource=Resource{schemaUrl=null, attributes={"
191191
+ "color=\"blue\", "
192192
+ "foo=\"bar\", "
193193
+ "service.name=\"unknown_service:java\", "

0 commit comments

Comments
 (0)