Skip to content

Commit b0e91b7

Browse files
committed
Refactor method signatures
1 parent e015bfa commit b0e91b7

File tree

4 files changed

+77
-29
lines changed

4 files changed

+77
-29
lines changed

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,13 @@ static Map<String, Object> toMap(DeclarativeConfigProperties declarativeConfigPr
4848
private static Object resolveValue(
4949
String key, DeclarativeConfigProperties declarativeConfigProperties) {
5050
for (int i = 0; i < valueResolvers.size(); i++) {
51-
Object value = valueResolvers.get(i).apply(key, declarativeConfigProperties);
52-
if (value != null) {
53-
return value;
51+
try {
52+
Object value = valueResolvers.get(i).apply(key, declarativeConfigProperties);
53+
if (value != null) {
54+
return value;
55+
}
56+
} catch (DeclarativeConfigException e) {
57+
// Ignore and continue
5458
}
5559
}
5660
return null;

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

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,24 +151,46 @@ public static <T> T getOrNull(
151151
private InstrumentationConfigUtil() {}
152152

153153
/**
154-
* Convert the {@code declarativeConfigProperties} to an instance of a given {@code modelType}.
154+
* Return {@code .instrumentation.java.<instrumentationName>}, after converting it to the {@code
155+
* modelType} using the {@code objectMapper}. If no configuration exists for the {@code }
155156
*
156-
* <p>This method is a simple wrapper of {@link ObjectMapper#convertValue(Object, Class)} combined
157-
* with a call to {@link DeclarativeConfigProperties#toMap(DeclarativeConfigProperties)}.
157+
* <p>This method is a convenience method for a common instrumentation library workflow:
158+
*
159+
* <ul>
160+
* <li>During initialization, an instrumentation library is given an {@link ConfigProvider} and
161+
* must initialize according to the relevant config
162+
* <li>It checks if the user has provided configuration for it, and if so...
163+
* <li>It converts the configuration to an in-memory model representing all of its relevant
164+
* properties
165+
* <li>It initializes using the strongly typed in-memory model
166+
* </ul>
167+
*
168+
* <p>Conversion is done using {@link ObjectMapper#convertValue(Object, Class)} from {@code
169+
* com.fasterxml.jackson.databind}, and assumes the {@code modelType} is a POJO written /
170+
* annotated to support jackson databinding.
158171
*
159172
* <p>NOTE: callers MUST add their own dependency on {@code
160173
* com.fasterxml.jackson.core:jackson-databind}. This module's dependency is {@code compileOnly}
161174
* since jackson is a large dependency that many users will not require. It's very possible to
162175
* convert between {@link DeclarativeConfigProperties} (or a map representation from {@link
163176
* DeclarativeConfigProperties#toMap(DeclarativeConfigProperties)}) and a target model type
164-
* without jackson. This method is provided a convenience method for demonstration purposes.
177+
* without jackson. This method is provided as an optional convenience method.
178+
*
179+
* @throws IllegalArgumentException if conversion fails. See {@link
180+
* ObjectMapper#convertValue(Object, Class)} for details.
165181
*/
166-
public static <T> T convertToModel(
182+
@Nullable
183+
public static <T> T getInstrumentationConfigModel(
184+
ConfigProvider configProvider,
185+
String instrumentationName,
167186
ObjectMapper objectMapper,
168-
DeclarativeConfigProperties declarativeConfigProperties,
169187
Class<T> modelType) {
170-
Map<String, Object> configPropertiesMap =
171-
DeclarativeConfigProperties.toMap(declarativeConfigProperties);
188+
DeclarativeConfigProperties properties =
189+
javaInstrumentationConfig(configProvider, instrumentationName);
190+
if (properties == null) {
191+
return null;
192+
}
193+
Map<String, Object> configPropertiesMap = DeclarativeConfigProperties.toMap(properties);
172194
return objectMapper.convertValue(configPropertiesMap, modelType);
173195
}
174196
}

api/incubator/src/testConvertToModel/java/io/opentelemetry/api/incubator/ConvertToModelTest.java renamed to api/incubator/src/testConvertToModel/java/io/opentelemetry/api/incubator/InstrumentationConfigUtilTest.java

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
import com.fasterxml.jackson.core.JsonProcessingException;
1212
import com.fasterxml.jackson.databind.ObjectMapper;
1313
import com.google.common.collect.ImmutableMap;
14+
import io.opentelemetry.api.incubator.config.ConfigProvider;
1415
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
1516
import io.opentelemetry.api.incubator.config.InstrumentationConfigUtil;
16-
import io.opentelemetry.sdk.autoconfigure.internal.ComponentLoader;
17-
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1817
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
19-
import io.opentelemetry.sdk.extension.incubator.fileconfig.YamlDeclarativeConfigProperties;
18+
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
19+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLanguageSpecificInstrumentationModel;
20+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.InstrumentationModel;
21+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
2022
import java.io.ByteArrayInputStream;
2123
import java.nio.charset.StandardCharsets;
2224
import java.util.Arrays;
@@ -27,7 +29,7 @@
2729
import java.util.Objects;
2830
import org.junit.jupiter.api.Test;
2931

30-
class ConvertToModelTest {
32+
class InstrumentationConfigUtilTest {
3133

3234
private static final ObjectMapper MAPPER = new ObjectMapper();
3335

@@ -58,17 +60,31 @@ void toMap_RoundTrip() throws JsonProcessingException {
5860
}
5961

6062
@Test
61-
void convertToModel_Empty() {
62-
DeclarativeConfigProperties properties = ofMap(Collections.emptyMap());
63+
void getInstrumentationConfigModel_UnsetConfig() {
64+
ConfigProvider configProvider = () -> null;
6365

64-
assertThat(InstrumentationConfigUtil.convertToModel(MAPPER, properties, Model.class))
66+
assertThat(
67+
InstrumentationConfigUtil.getInstrumentationConfigModel(
68+
configProvider, "my_instrumentation_library", MAPPER, Model.class))
69+
.isEqualTo(null);
70+
}
71+
72+
@Test
73+
void getInstrumentationConfigModel_EmptyConfig() {
74+
ConfigProvider configProvider =
75+
withInstrumentationConfig("my_instrumentation_library", Collections.emptyMap());
76+
77+
assertThat(
78+
InstrumentationConfigUtil.getInstrumentationConfigModel(
79+
configProvider, "my_instrumentation_library", MAPPER, Model.class))
6580
.isEqualTo(new Model());
6681
}
6782

6883
@Test
69-
void convertToModel_KitchenSink() {
70-
DeclarativeConfigProperties properties =
71-
ofMap(
84+
void getInstrumentationConfigModel_KitchenSink() {
85+
ConfigProvider configProvider =
86+
withInstrumentationConfig(
87+
"my_instrumentation_library",
7288
ImmutableMap.<String, Object>builder()
7389
.put("string_property", "value")
7490
.put("boolean_property", true)
@@ -84,6 +100,7 @@ void convertToModel_KitchenSink() {
84100
Collections.singletonList(
85101
ImmutableMap.of("key", "the_key", "value", "the_value")))
86102
.build());
103+
87104
Model expected = new Model();
88105
expected.stringProperty = "value";
89106
expected.booleanProperty = true;
@@ -99,15 +116,21 @@ void convertToModel_KitchenSink() {
99116
listEntryModel.value = "the_value";
100117
expected.structuredListProperty = Collections.singletonList(listEntryModel);
101118

102-
assertThat(InstrumentationConfigUtil.convertToModel(MAPPER, properties, Model.class))
119+
assertThat(
120+
InstrumentationConfigUtil.getInstrumentationConfigModel(
121+
configProvider, "my_instrumentation_library", MAPPER, Model.class))
103122
.isEqualTo(expected);
104123
}
105124

106-
private static final ComponentLoader componentLoader =
107-
SpiHelper.serviceComponentLoader(ConvertToModelTest.class.getClassLoader());
125+
private static ConfigProvider withInstrumentationConfig(
126+
String instrumentationName, Map<String, Object> instrumentationConfig) {
127+
ExperimentalLanguageSpecificInstrumentationModel javaConfig =
128+
new ExperimentalLanguageSpecificInstrumentationModel();
129+
javaConfig.setAdditionalProperty(instrumentationName, instrumentationConfig);
108130

109-
private static YamlDeclarativeConfigProperties ofMap(Map<String, Object> map) {
110-
return YamlDeclarativeConfigProperties.create(map, componentLoader);
131+
return SdkConfigProvider.create(
132+
new OpenTelemetryConfigurationModel()
133+
.withInstrumentationDevelopment(new InstrumentationModel().withJava(javaConfig)));
111134
}
112135

113136
private static class Model {

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
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;
1514
import io.opentelemetry.sdk.OpenTelemetrySdk;
1615
import io.opentelemetry.sdk.autoconfigure.internal.ComponentLoader;
1716
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
@@ -203,8 +202,8 @@ public static Sampler createSampler(DeclarativeConfigProperties genericSamplerMo
203202
YamlDeclarativeConfigProperties yamlDeclarativeConfigProperties =
204203
requireYamlDeclarativeConfigProperties(genericSamplerModel);
205204
SamplerModel samplerModel =
206-
InstrumentationConfigUtil.convertToModel(
207-
MAPPER, yamlDeclarativeConfigProperties, SamplerModel.class);
205+
MAPPER.convertValue(
206+
DeclarativeConfigProperties.toMap(yamlDeclarativeConfigProperties), SamplerModel.class);
208207
return createAndMaybeCleanup(
209208
SamplerFactory.getInstance(),
210209
SpiHelper.create(yamlDeclarativeConfigProperties.getComponentLoader()),

0 commit comments

Comments
 (0)