Skip to content

Commit e015bfa

Browse files
committed
Move convertToModel to InstrumentationConfigUtil
1 parent afe2a07 commit e015bfa

File tree

5 files changed

+57
-25
lines changed

5 files changed

+57
-25
lines changed

api/incubator/build.gradle.kts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ otelJava.moduleName.set("io.opentelemetry.api.incubator")
1212
dependencies {
1313
api(project(":api:all"))
1414

15+
// Supports optional InstrumentationConfigUtil#convertToModel
16+
compileOnly("com.fasterxml.jackson.core:jackson-databind")
17+
1518
annotationProcessor("com.google.auto.value:auto-value")
1619

1720
// To use parsed config file as input for InstrumentationConfigUtilTest
@@ -24,3 +27,16 @@ dependencies {
2427

2528
testImplementation("com.google.guava:guava")
2629
}
30+
31+
testing {
32+
suites {
33+
register<JvmTestSuite>("testConvertToModel") {
34+
dependencies {
35+
implementation("com.fasterxml.jackson.core:jackson-databind")
36+
implementation(project(":sdk-extensions:incubator"))
37+
implementation(project(":sdk-extensions:autoconfigure"))
38+
implementation("com.google.guava:guava")
39+
}
40+
}
41+
}
42+
}

api/incubator/src/main/java/io/opentelemetry/api/incubator/config/InstrumentationConfigUtil.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.api.incubator.config;
77

8+
import com.fasterxml.jackson.databind.ObjectMapper;
89
import java.util.LinkedHashMap;
910
import java.util.List;
1011
import java.util.Map;
@@ -148,4 +149,26 @@ public static <T> T getOrNull(
148149
}
149150

150151
private InstrumentationConfigUtil() {}
152+
153+
/**
154+
* Convert the {@code declarativeConfigProperties} to an instance of a given {@code modelType}.
155+
*
156+
* <p>This method is a simple wrapper of {@link ObjectMapper#convertValue(Object, Class)} combined
157+
* with a call to {@link DeclarativeConfigProperties#toMap(DeclarativeConfigProperties)}.
158+
*
159+
* <p>NOTE: callers MUST add their own dependency on {@code
160+
* com.fasterxml.jackson.core:jackson-databind}. This module's dependency is {@code compileOnly}
161+
* since jackson is a large dependency that many users will not require. It's very possible to
162+
* convert between {@link DeclarativeConfigProperties} (or a map representation from {@link
163+
* DeclarativeConfigProperties#toMap(DeclarativeConfigProperties)}) and a target model type
164+
* without jackson. This method is provided a convenience method for demonstration purposes.
165+
*/
166+
public static <T> T convertToModel(
167+
ObjectMapper objectMapper,
168+
DeclarativeConfigProperties declarativeConfigProperties,
169+
Class<T> modelType) {
170+
Map<String, Object> configPropertiesMap =
171+
DeclarativeConfigProperties.toMap(declarativeConfigProperties);
172+
return objectMapper.convertValue(configPropertiesMap, modelType);
173+
}
151174
}

sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/DeclarativeConfigurationConvertTest.java renamed to api/incubator/src/testConvertToModel/java/io/opentelemetry/api/incubator/ConvertToModelTest.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,20 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.sdk.extension.incubator.fileconfig;
6+
package io.opentelemetry.api.incubator;
77

8-
import static io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration.MAPPER;
98
import static org.assertj.core.api.Assertions.assertThat;
109

1110
import com.fasterxml.jackson.annotation.JsonProperty;
1211
import com.fasterxml.jackson.core.JsonProcessingException;
12+
import com.fasterxml.jackson.databind.ObjectMapper;
1313
import com.google.common.collect.ImmutableMap;
1414
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
15+
import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil;
1516
import io.opentelemetry.sdk.autoconfigure.internal.ComponentLoader;
1617
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
18+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
19+
import io.opentelemetry.sdk.extension.incubator.fileconfig.YamlDeclarativeConfigProperties;
1720
import java.io.ByteArrayInputStream;
1821
import java.nio.charset.StandardCharsets;
1922
import java.util.Arrays;
@@ -24,7 +27,9 @@
2427
import java.util.Objects;
2528
import org.junit.jupiter.api.Test;
2629

27-
class DeclarativeConfigurationConvertTest {
30+
class ConvertToModelTest {
31+
32+
private static final ObjectMapper MAPPER = new ObjectMapper();
2833

2934
@Test
3035
void toMap_RoundTrip() throws JsonProcessingException {
@@ -56,7 +61,7 @@ void toMap_RoundTrip() throws JsonProcessingException {
5661
void convertToModel_Empty() {
5762
DeclarativeConfigProperties properties = ofMap(Collections.emptyMap());
5863

59-
assertThat(DeclarativeConfiguration.convertToModel(properties, Model.class))
64+
assertThat(InstrumentationConfigUtil.convertToModel(MAPPER, properties, Model.class))
6065
.isEqualTo(new Model());
6166
}
6267

@@ -94,12 +99,12 @@ void convertToModel_KitchenSink() {
9499
listEntryModel.value = "the_value";
95100
expected.structuredListProperty = Collections.singletonList(listEntryModel);
96101

97-
assertThat(DeclarativeConfiguration.convertToModel(properties, Model.class))
102+
assertThat(InstrumentationConfigUtil.convertToModel(MAPPER, properties, Model.class))
98103
.isEqualTo(expected);
99104
}
100105

101106
private static final ComponentLoader componentLoader =
102-
SpiHelper.serviceComponentLoader(DeclarativeConfigurationConvertTest.class.getClassLoader());
107+
SpiHelper.serviceComponentLoader(ConvertToModelTest.class.getClassLoader());
103108

104109
private static YamlDeclarativeConfigProperties ofMap(Map<String, Object> map) {
105110
return YamlDeclarativeConfigProperties.create(map, componentLoader);
@@ -140,7 +145,7 @@ private static class Model {
140145

141146
@Override
142147
public boolean equals(Object o) {
143-
if (o == null || getClass() != o.getClass()) {
148+
if (!(o instanceof Model)) {
144149
return false;
145150
}
146151
Model model = (Model) o;

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

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.fasterxml.jackson.databind.ObjectMapper;
1212
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
1313
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
14+
import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil;
1415
import io.opentelemetry.sdk.OpenTelemetrySdk;
1516
import io.opentelemetry.sdk.autoconfigure.internal.ComponentLoader;
1617
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
@@ -201,7 +202,9 @@ static DeclarativeConfigProperties toConfigProperties(
201202
public static Sampler createSampler(DeclarativeConfigProperties genericSamplerModel) {
202203
YamlDeclarativeConfigProperties yamlDeclarativeConfigProperties =
203204
requireYamlDeclarativeConfigProperties(genericSamplerModel);
204-
SamplerModel samplerModel = convertToModel(yamlDeclarativeConfigProperties, SamplerModel.class);
205+
SamplerModel samplerModel =
206+
InstrumentationConfigUtil.convertToModel(
207+
MAPPER, yamlDeclarativeConfigProperties, SamplerModel.class);
205208
return createAndMaybeCleanup(
206209
SamplerFactory.getInstance(),
207210
SpiHelper.create(yamlDeclarativeConfigProperties.getComponentLoader()),
@@ -217,20 +220,6 @@ private static YamlDeclarativeConfigProperties requireYamlDeclarativeConfigPrope
217220
return (YamlDeclarativeConfigProperties) declarativeConfigProperties;
218221
}
219222

220-
/**
221-
* Convert the {@code declarativeConfigProperties} to an instance of a given {@code modelType}.
222-
*
223-
* <p>Wrapper around {@link ObjectMapper#convertValue(Object, Class)}. See {@link ObjectMapper}
224-
* for full details. If the {@link ObjectMapper} we use doesn't match your requirements, configure
225-
* your own instance and call {@link ObjectMapper#convertValue(Object, Class)} using it.
226-
*/
227-
public static <T> T convertToModel(
228-
DeclarativeConfigProperties declarativeConfigProperties, Class<T> modelType) {
229-
Map<String, Object> configPropertiesMap =
230-
DeclarativeConfigProperties.toMap(declarativeConfigProperties);
231-
return MAPPER.convertValue(configPropertiesMap, modelType);
232-
}
233-
234223
static <M, R> R createAndMaybeCleanup(Factory<M, R> factory, SpiHelper spiHelper, M model) {
235224
DeclarativeConfigContext context = new DeclarativeConfigContext(spiHelper);
236225
try {

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
1212
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
1313
import io.opentelemetry.sdk.autoconfigure.internal.ComponentLoader;
14-
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
1514
import java.util.Arrays;
1615
import java.util.Collections;
1716
import java.util.LinkedHashMap;
@@ -67,10 +66,10 @@ private YamlDeclarativeConfigProperties(
6766
* com.fasterxml.jackson.databind.ObjectMapper}), and have values which are scalars, lists of
6867
* scalars, lists of maps, and maps.
6968
*
70-
* @see DeclarativeConfiguration#toConfigProperties(OpenTelemetryConfigurationModel)
69+
* @see DeclarativeConfiguration#toConfigProperties(Object)
7170
*/
7271
@SuppressWarnings("unchecked")
73-
static YamlDeclarativeConfigProperties create(
72+
public static YamlDeclarativeConfigProperties create(
7473
Map<String, Object> properties, ComponentLoader componentLoader) {
7574
Map<String, Object> simpleEntries = new LinkedHashMap<>();
7675
Map<String, List<YamlDeclarativeConfigProperties>> listEntries = new LinkedHashMap<>();

0 commit comments

Comments
 (0)