Skip to content

Commit 541382c

Browse files
committed
add property translation for inferred spans
1 parent 8abb869 commit 541382c

File tree

5 files changed

+87
-20
lines changed

5 files changed

+87
-20
lines changed

declarative-config-bridge/src/main/java/io/opentelemetry/contrib/sdk/autoconfigure/ConfigPropertiesUtil.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1313
import io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider;
1414
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
15+
import java.util.Collections;
16+
import java.util.Map;
1517

1618
public class ConfigPropertiesUtil {
1719
private ConfigPropertiesUtil() {}
@@ -33,21 +35,25 @@ public static ConfigProperties resolveConfigProperties(
3335
instrumentationConfig = DeclarativeConfigProperties.empty();
3436
}
3537

36-
return new DeclarativeConfigPropertiesBridge(instrumentationConfig);
38+
return new DeclarativeConfigPropertiesBridge(instrumentationConfig, Collections.emptyMap());
3739
}
3840
// Should never happen
3941
throw new IllegalStateException(
4042
"AutoConfiguredOpenTelemetrySdk does not have ConfigProperties or DeclarativeConfigProperties. This is likely a programming error in opentelemetry-java");
4143
}
4244

4345
public static ConfigProperties resolveModel(OpenTelemetryConfigurationModel model) {
46+
return resolveModel(model, Collections.emptyMap());
47+
}
48+
49+
public static ConfigProperties resolveModel(OpenTelemetryConfigurationModel model, Map<String, String> translationMap) {
4450
SdkConfigProvider configProvider = SdkConfigProvider.create(model);
4551
DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig();
4652
if (instrumentationConfig == null) {
4753
instrumentationConfig = DeclarativeConfigProperties.empty();
4854
}
4955

50-
return new DeclarativeConfigPropertiesBridge(instrumentationConfig);
56+
return new DeclarativeConfigPropertiesBridge(instrumentationConfig, translationMap);
5157
}
5258

5359
public static String propertyYamlPath(String propertyName) {

declarative-config-bridge/src/main/java/io/opentelemetry/contrib/sdk/autoconfigure/DeclarativeConfigPropertiesBridge.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,12 @@ final class DeclarativeConfigPropertiesBridge implements ConfigProperties {
5252

5353
// The node at .instrumentation.java
5454
private final DeclarativeConfigProperties instrumentationJavaNode;
55+
private final Map<String, String> translationMap;
5556

56-
DeclarativeConfigPropertiesBridge(DeclarativeConfigProperties instrumentationNode) {
57+
DeclarativeConfigPropertiesBridge(DeclarativeConfigProperties instrumentationNode,
58+
Map<String, String> translationMap) {
5759
instrumentationJavaNode = instrumentationNode.getStructured("java", empty());
60+
this.translationMap = translationMap;
5861
}
5962

6063
@Nullable
@@ -134,7 +137,7 @@ private <T> T getPropertyValue(
134137
return null;
135138
}
136139

137-
String[] segments = getSegments(property);
140+
String[] segments = getSegments(translate(property));
138141
if (segments.length == 0) {
139142
return null;
140143
}
@@ -151,6 +154,15 @@ private <T> T getPropertyValue(
151154
return extractor.apply(target, lastPart);
152155
}
153156

157+
private String translate(String property) {
158+
for (Map.Entry<String, String> entry : translationMap.entrySet()) {
159+
if (property.startsWith(entry.getKey())) {
160+
return entry.getValue() + property.substring(entry.getKey().length());
161+
}
162+
}
163+
return property;
164+
}
165+
154166
private static String[] getSegments(String property) {
155167
if (property.startsWith(OTEL_INSTRUMENTATION_PREFIX)) {
156168
property = property.substring(OTEL_INSTRUMENTATION_PREFIX.length());

declarative-config-bridge/src/test/java/io/opentelemetry/contrib/sdk/autoconfigure/DeclarativeConfigPropertiesBridgeTest.java

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
*/
55

66
package io.opentelemetry.contrib.sdk.autoconfigure; /*
7-
* Copyright The OpenTelemetry Authors
8-
* SPDX-License-Identifier: Apache-2.0
9-
*/
7+
* Copyright The OpenTelemetry Authors
8+
* SPDX-License-Identifier: Apache-2.0
9+
*/
1010

1111
import static org.assertj.core.api.Assertions.assertThat;
1212

@@ -19,6 +19,7 @@
1919
import java.nio.charset.StandardCharsets;
2020
import java.time.Duration;
2121
import java.util.Arrays;
22+
import java.util.Collections;
2223
import java.util.HashMap;
2324
import java.util.Map;
2425
import java.util.Objects;
@@ -57,21 +58,26 @@ class DeclarativeConfigPropertiesBridgeTest {
5758

5859
@BeforeEach
5960
void setup() {
60-
OpenTelemetryConfigurationModel model =
61-
DeclarativeConfiguration.parse(
62-
new ByteArrayInputStream(YAML.getBytes(StandardCharsets.UTF_8)));
63-
SdkConfigProvider configProvider = SdkConfigProvider.create(model);
64-
bridge =
65-
new DeclarativeConfigPropertiesBridge(
66-
Objects.requireNonNull(configProvider.getInstrumentationConfig()));
61+
bridge = createBridge(Collections.emptyMap());
6762

6863
OpenTelemetryConfigurationModel emptyModel =
6964
new OpenTelemetryConfigurationModel()
7065
.withAdditionalProperty("instrumentation/development", new InstrumentationModel());
7166
SdkConfigProvider emptyConfigProvider = SdkConfigProvider.create(emptyModel);
7267
emptyBridge =
7368
new DeclarativeConfigPropertiesBridge(
74-
Objects.requireNonNull(emptyConfigProvider.getInstrumentationConfig()));
69+
Objects.requireNonNull(emptyConfigProvider.getInstrumentationConfig()),
70+
Collections.emptyMap());
71+
}
72+
73+
private static DeclarativeConfigPropertiesBridge createBridge(
74+
Map<String, String> translationMap) {
75+
OpenTelemetryConfigurationModel model =
76+
DeclarativeConfiguration.parse(
77+
new ByteArrayInputStream(YAML.getBytes(StandardCharsets.UTF_8)));
78+
return new DeclarativeConfigPropertiesBridge(
79+
Objects.requireNonNull(SdkConfigProvider.create(model).getInstrumentationConfig()),
80+
translationMap);
7581
}
7682

7783
@Test
@@ -126,21 +132,31 @@ void getProperties() {
126132
assertThat(bridge.getLong("otel.instrumentation.other-instrumentation.int_key", 1L))
127133
.isEqualTo(1L);
128134
assertThat(
129-
bridge.getDuration(
130-
"otel.instrumentation.other-instrumentation.int_key", Duration.ofMillis(1)))
135+
bridge.getDuration(
136+
"otel.instrumentation.other-instrumentation.int_key", Duration.ofMillis(1)))
131137
.isEqualTo(Duration.ofMillis(1));
132138
assertThat(bridge.getDouble("otel.instrumentation.other-instrumentation.double_key", 1.1))
133139
.isEqualTo(1.1);
134140
assertThat(
135-
bridge.getList(
136-
"otel.instrumentation.other-instrumentation.list_key",
137-
Arrays.asList("value1", "value2")))
141+
bridge.getList(
142+
"otel.instrumentation.other-instrumentation.list_key",
143+
Arrays.asList("value1", "value2")))
138144
.isEqualTo(Arrays.asList("value1", "value2"));
139145
assertThat(bridge.getMap("otel.instrumentation.other-instrumentation.map_key", expectedMap))
140146
.isEqualTo(expectedMap);
147+
}
141148

149+
@Test
150+
void vendor() {
142151
// verify vendor specific property names are preserved in unchanged form (prefix is not stripped
143152
// as for otel.instrumentation.*)
144153
assertThat(bridge.getBoolean("acme.full_name.preserved")).isTrue();
145154
}
155+
156+
@Test
157+
void translation() {
158+
DeclarativeConfigPropertiesBridge propertiesBridge = createBridge(
159+
Collections.singletonMap("acme", "acme.full_name"));
160+
assertThat(propertiesBridge.getBoolean("acme.preserved")).isTrue();
161+
}
146162
}

inferred-spans/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@ description = "OpenTelemetry Java profiling based inferred spans module"
99
otelJava.moduleName.set("io.opentelemetry.contrib.inferredspans")
1010

1111
dependencies {
12+
implementation(project(":declarative-config-bridge"))
13+
1214
annotationProcessor("com.google.auto.service:auto-service")
1315
compileOnly("com.google.auto.service:auto-service-annotations")
1416
compileOnly("io.opentelemetry:opentelemetry-sdk")
1517
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
18+
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator")
1619
compileOnly("io.opentelemetry.semconv:opentelemetry-semconv")
1720
implementation("com.lmax:disruptor")
1821
implementation("org.jctools:jctools-core")
@@ -25,6 +28,7 @@ dependencies {
2528
testImplementation("io.opentelemetry.semconv:opentelemetry-semconv")
2629
testImplementation("io.opentelemetry:opentelemetry-sdk")
2730
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
31+
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator")
2832
testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
2933
testImplementation("io.opentelemetry:opentelemetry-api-incubator")
3034
testImplementation("io.opentelemetry:opentelemetry-exporter-logging")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.contrib.inferredspans;
7+
8+
import com.google.auto.service.AutoService;
9+
import io.opentelemetry.contrib.sdk.autoconfigure.ConfigPropertiesUtil;
10+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
13+
import java.util.Collections;
14+
15+
@AutoService(DeclarativeConfigurationCustomizerProvider.class)
16+
public class InferredSpansCustomizerProvider implements DeclarativeConfigurationCustomizerProvider {
17+
18+
@Override
19+
public void customize(DeclarativeConfigurationCustomizer customizer) {
20+
customizer.addModelCustomizer(
21+
model -> {
22+
ConfigProperties configProperties = ConfigPropertiesUtil.resolveModel(model,
23+
Collections.singletonMap("otel.inferred.spans", "inferred_spans"));
24+
25+
return model;
26+
});
27+
}
28+
29+
}

0 commit comments

Comments
 (0)