Skip to content

Commit 000fd0f

Browse files
add config model customizer (#7118)
Co-authored-by: jack-berg <[email protected]>
1 parent 9172089 commit 000fd0f

File tree

7 files changed

+164
-3
lines changed

7 files changed

+164
-3
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,19 @@ public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurat
108108
*/
109109
public static OpenTelemetrySdk create(
110110
OpenTelemetryConfigurationModel configurationModel, ComponentLoader componentLoader) {
111+
SpiHelper spiHelper = SpiHelper.create(componentLoader);
112+
113+
DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder();
114+
115+
for (DeclarativeConfigurationCustomizerProvider provider :
116+
spiHelper.loadOrdered(DeclarativeConfigurationCustomizerProvider.class)) {
117+
provider.customize(builder);
118+
}
119+
111120
return createAndMaybeCleanup(
112121
OpenTelemetryConfigurationFactory.getInstance(),
113-
SpiHelper.create(componentLoader),
114-
configurationModel);
122+
spiHelper,
123+
builder.customizeModel(configurationModel));
115124
}
116125

117126
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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 io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
9+
import java.util.function.Function;
10+
11+
/** Builder for the declarative configuration. */
12+
public class DeclarativeConfigurationBuilder implements DeclarativeConfigurationCustomizer {
13+
private Function<OpenTelemetryConfigurationModel, OpenTelemetryConfigurationModel>
14+
modelCustomizer = Function.identity();
15+
16+
@Override
17+
public void addModelCustomizer(
18+
Function<OpenTelemetryConfigurationModel, OpenTelemetryConfigurationModel> customizer) {
19+
modelCustomizer = mergeCustomizer(modelCustomizer, customizer);
20+
}
21+
22+
private static <I, O1, O2> Function<I, O2> mergeCustomizer(
23+
Function<? super I, ? extends O1> first, Function<? super O1, ? extends O2> second) {
24+
return (I configured) -> {
25+
O1 firstResult = first.apply(configured);
26+
return second.apply(firstResult);
27+
};
28+
}
29+
30+
/** Customize the configuration model. */
31+
public OpenTelemetryConfigurationModel customizeModel(
32+
OpenTelemetryConfigurationModel configurationModel) {
33+
return modelCustomizer.apply(configurationModel);
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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 io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
9+
import java.util.function.Function;
10+
11+
/** A service provider interface (SPI) for customizing declarative configuration. */
12+
public interface DeclarativeConfigurationCustomizer {
13+
/**
14+
* Method invoked when configuring the SDK to allow further customization of the declarative
15+
* configuration.
16+
*
17+
* @param customizer the customizer to add
18+
*/
19+
void addModelCustomizer(
20+
Function<OpenTelemetryConfigurationModel, OpenTelemetryConfigurationModel> customizer);
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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 io.opentelemetry.sdk.autoconfigure.spi.Ordered;
9+
10+
/** A service provider interface (SPI) for customizing declarative configuration. */
11+
public interface DeclarativeConfigurationCustomizerProvider extends Ordered {
12+
/**
13+
* Method invoked when configuring the SDK to allow further customization of the declarative
14+
* configuration.
15+
*
16+
* @param customizer the customizer to add
17+
*/
18+
void customize(DeclarativeConfigurationCustomizer customizer);
19+
}

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@
1414
import io.github.netmikey.logunit.api.LogCapturer;
1515
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
1616
import io.opentelemetry.internal.testing.CleanupExtension;
17+
import io.opentelemetry.sdk.OpenTelemetrySdk;
18+
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
19+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
20+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
21+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
1722
import java.io.ByteArrayInputStream;
1823
import java.io.File;
1924
import java.io.IOException;
@@ -22,6 +27,7 @@
2227
import java.nio.file.Files;
2328
import java.nio.file.Path;
2429
import java.security.cert.CertificateEncodingException;
30+
import java.util.Collections;
2531
import java.util.Objects;
2632
import org.junit.jupiter.api.Test;
2733
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -61,7 +67,7 @@ void parseAndCreate_Examples(@TempDir Path tempDir)
6167
tempDir, "clientCertificate.cert", clientTls.certificate().getEncoded());
6268

6369
File examplesDir = new File(System.getenv("CONFIG_EXAMPLE_DIR"));
64-
assertThat(examplesDir.isDirectory()).isTrue();
70+
assertThat(examplesDir).isDirectory();
6571

6672
for (File example : Objects.requireNonNull(examplesDir.listFiles())) {
6773
// Skip anchors.yaml because support for merge (i.e. "<<: *anchor") was explicitly removed in
@@ -151,4 +157,32 @@ void parseAndCreate_EmptyComponentProviderConfig() {
151157
new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8))))
152158
.doesNotThrowAnyException();
153159
}
160+
161+
@Test
162+
void create_ModelCustomizer() {
163+
OpenTelemetryConfigurationModel model = new OpenTelemetryConfigurationModel();
164+
model.withFileFormat("0.3");
165+
model.withTracerProvider(
166+
new TracerProviderModel()
167+
.withProcessors(
168+
Collections.singletonList(
169+
new SpanProcessorModel().withAdditionalProperty("test", null))));
170+
OpenTelemetrySdk sdk =
171+
DeclarativeConfiguration.create(
172+
model,
173+
// customizer is TestDeclarativeConfigurationCustomizerProvider
174+
SpiHelper.serviceComponentLoader(
175+
DeclarativeConfigurationCreateTest.class.getClassLoader()));
176+
assertThat(sdk.toString())
177+
.contains(
178+
"resource=Resource{schemaUrl=null, attributes={"
179+
+ "color=\"blue\", "
180+
+ "foo=\"bar\", "
181+
+ "order=\"second\", "
182+
+ "service.name=\"unknown_service:java\", "
183+
+ "shape=\"square\", "
184+
+ "telemetry.sdk.language=\"java\", "
185+
+ "telemetry.sdk.name=\"opentelemetry\", "
186+
+ "telemetry.sdk.version=\"");
187+
}
154188
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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 io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeNameValueModel;
9+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ResourceModel;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
public class TestDeclarativeConfigurationCustomizerProvider
14+
implements DeclarativeConfigurationCustomizerProvider {
15+
@Override
16+
public void customize(DeclarativeConfigurationCustomizer customizer) {
17+
customizer.addModelCustomizer(
18+
model -> {
19+
ResourceModel resource = model.getResource();
20+
if (resource == null) {
21+
resource = new ResourceModel();
22+
model.withResource(resource);
23+
}
24+
List<AttributeNameValueModel> attributes = resource.getAttributes();
25+
if (attributes == null) {
26+
attributes = new ArrayList<>();
27+
resource.withAttributes(attributes);
28+
}
29+
attributes.add(
30+
new AttributeNameValueModel()
31+
.withName("foo")
32+
.withType(AttributeNameValueModel.Type.STRING)
33+
.withValue("bar"));
34+
attributes.add(
35+
new AttributeNameValueModel()
36+
.withName("color")
37+
.withType(AttributeNameValueModel.Type.STRING)
38+
.withValue("blue"));
39+
return model;
40+
});
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.opentelemetry.sdk.extension.incubator.fileconfig.TestDeclarativeConfigurationCustomizerProvider

0 commit comments

Comments
 (0)