Skip to content

Commit f2e8878

Browse files
committed
add config model customizer
1 parent 3e1d953 commit f2e8878

File tree

3 files changed

+88
-4
lines changed

3 files changed

+88
-4
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,13 @@ public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurat
106106
*/
107107
public static OpenTelemetrySdk create(
108108
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
109+
SpiHelper spiHelper = SpiHelper.create(componentLoader);
110+
for (OpenTelemetryConfigurationModelCustomizerProvider provider :
111+
spiHelper.loadOrdered(OpenTelemetryConfigurationModelCustomizerProvider.class)) {
112+
configurationModel = provider.customize(configurationModel);
113+
}
109114
return createAndMaybeCleanup(
110-
OpenTelemetryConfigurationFactory.getInstance(),
111-
SpiHelper.create(componentLoader),
112-
configurationModel);
115+
OpenTelemetryConfigurationFactory.getInstance(), spiHelper, configurationModel);
113116
}
114117

115118
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.opentelemetry.sdk.extension.incubator.fileconfig;
2+
3+
import io.opentelemetry.sdk.autoconfigure.spi.Ordered;
4+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
5+
6+
public interface OpenTelemetryConfigurationModelCustomizerProvider extends Ordered {
7+
OpenTelemetryConfigurationModel customize(OpenTelemetryConfigurationModel model);
8+
}

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

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension;
1414
import io.github.netmikey.logunit.api.LogCapturer;
1515
import io.opentelemetry.internal.testing.CleanupExtension;
16+
import io.opentelemetry.sdk.OpenTelemetrySdk;
17+
import io.opentelemetry.sdk.autoconfigure.internal.ComponentLoader;
18+
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1619
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
1720
import java.io.ByteArrayInputStream;
1821
import java.io.File;
@@ -22,7 +25,15 @@
2225
import java.nio.file.Files;
2326
import java.nio.file.Path;
2427
import java.security.cert.CertificateEncodingException;
28+
import java.util.ArrayList;
29+
import java.util.Collections;
30+
import java.util.List;
2531
import java.util.Objects;
32+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeNameValueModel;
33+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
34+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ResourceModel;
35+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
36+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
2637
import org.junit.jupiter.api.Test;
2738
import org.junit.jupiter.api.extension.RegisterExtension;
2839
import org.junit.jupiter.api.io.TempDir;
@@ -147,6 +158,68 @@ void parseAndCreate_EmptyComponentProviderConfig() {
147158
FileConfiguration.parseAndCreate(
148159
new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8))))
149160
.doesNotThrowAnyException();
150-
;
161+
}
162+
163+
@Test
164+
void create_ModelCustomizer() {
165+
OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel();
166+
model.withFileFormat("0.3");
167+
model.withTracerProvider(
168+
new TracerProviderModel()
169+
.withProcessors(
170+
Collections.singletonList(
171+
new SpanProcessorModel().withAdditionalProperty("test", null))));
172+
ComponentLoader componentLoader =
173+
SpiHelper.serviceComponentLoader(FileConfiguration.class.getClassLoader());
174+
OpenTelemetrySdk sdk =
175+
FileConfiguration.create(
176+
model,
177+
new ComponentLoader() {
178+
@SuppressWarnings("unchecked")
179+
@Override
180+
public <T> Iterable<T> load(Class<T> spiClass) {
181+
if (OpenTelemetryConfigurationModelCustomizerProvider.class.equals(spiClass)) {
182+
return (Iterable<T>) Collections.singletonList(getCustomizerProvider());
183+
}
184+
return componentLoader.load(spiClass);
185+
}
186+
});
187+
assertThat(sdk.toString())
188+
.contains(
189+
"resource=Resource{schemaUrl=null, attributes={"
190+
+ "color=\"blue\", "
191+
+ "foo=\"bar\", "
192+
+ "order=\"second\", "
193+
+ "service.name=\"unknown_service:java\", "
194+
+ "shape=\"square\", "
195+
+ "telemetry.sdk.language=\"java\", "
196+
+ "telemetry.sdk.name=\"opentelemetry\", "
197+
+ "telemetry.sdk.version=\"1.48.0-SNAPSHOT\"}}");
198+
}
199+
200+
private static OpenTelemetryConfigurationModelCustomizerProvider getCustomizerProvider() {
201+
return model -> {
202+
ResourceModel resource = model.getResource();
203+
if (resource == null) {
204+
resource = new ResourceModel();
205+
model.withResource(resource);
206+
}
207+
List<AttributeNameValueModel> attributes = resource.getAttributes();
208+
if (attributes == null) {
209+
attributes = new ArrayList<>();
210+
resource.withAttributes(attributes);
211+
}
212+
attributes.add(
213+
new AttributeNameValueModel()
214+
.withName("foo")
215+
.withType(AttributeNameValueModel.Type.STRING)
216+
.withValue("bar"));
217+
attributes.add(
218+
new AttributeNameValueModel()
219+
.withName("color")
220+
.withType(AttributeNameValueModel.Type.STRING)
221+
.withValue("blue"));
222+
return model;
223+
};
151224
}
152225
}

0 commit comments

Comments
 (0)