Skip to content

Commit 7c48794

Browse files
committed
inferred spans
1 parent a5fe6a2 commit 7c48794

File tree

7 files changed

+152
-48
lines changed

7 files changed

+152
-48
lines changed

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
1515
import java.util.Collections;
1616
import java.util.Map;
17+
import javax.annotation.Nullable;
1718

1819
public class ConfigPropertiesUtil {
1920
private ConfigPropertiesUtil() {}
@@ -29,13 +30,8 @@ public static ConfigProperties resolveConfigProperties(
2930
ConfigProvider configProvider =
3031
AutoConfigureUtil.getConfigProvider(autoConfiguredOpenTelemetrySdk);
3132
if (configProvider != null) {
32-
DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig();
33-
34-
if (instrumentationConfig == null) {
35-
instrumentationConfig = DeclarativeConfigProperties.empty();
36-
}
37-
38-
return new DeclarativeConfigPropertiesBridge(instrumentationConfig, Collections.emptyMap());
33+
return resolveInstrumentationConfig(
34+
configProvider.getInstrumentationConfig(), Collections.emptyMap());
3935
}
4036
// Should never happen
4137
throw new IllegalStateException(
@@ -46,9 +42,20 @@ public static ConfigProperties resolveModel(OpenTelemetryConfigurationModel mode
4642
return resolveModel(model, Collections.emptyMap());
4743
}
4844

49-
public static ConfigProperties resolveModel(OpenTelemetryConfigurationModel model, Map<String, String> translationMap) {
50-
SdkConfigProvider configProvider = SdkConfigProvider.create(model);
51-
DeclarativeConfigProperties instrumentationConfig = configProvider.getInstrumentationConfig();
45+
public static ConfigProperties resolveModel(
46+
OpenTelemetryConfigurationModel model, Map<String, String> translationMap) {
47+
return resolveInstrumentationConfig(
48+
SdkConfigProvider.create(model).getInstrumentationConfig(), translationMap);
49+
}
50+
51+
public static ConfigProperties resolveInstrumentationConfig(
52+
@Nullable DeclarativeConfigProperties instrumentationConfig) {
53+
return resolveInstrumentationConfig(instrumentationConfig, Collections.emptyMap());
54+
}
55+
56+
public static ConfigProperties resolveInstrumentationConfig(
57+
@Nullable DeclarativeConfigProperties instrumentationConfig,
58+
Map<String, String> translationMap) {
5259
if (instrumentationConfig == null) {
5360
instrumentationConfig = DeclarativeConfigProperties.empty();
5461
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ final class DeclarativeConfigPropertiesBridge implements ConfigProperties {
5454
private final DeclarativeConfigProperties instrumentationJavaNode;
5555
private final Map<String, String> translationMap;
5656

57-
DeclarativeConfigPropertiesBridge(DeclarativeConfigProperties instrumentationNode,
58-
Map<String, String> translationMap) {
57+
DeclarativeConfigPropertiesBridge(
58+
DeclarativeConfigProperties instrumentationNode, Map<String, String> translationMap) {
5959
instrumentationJavaNode = instrumentationNode.getStructured("java", empty());
6060
this.translationMap = translationMap;
6161
}

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

Lines changed: 10 additions & 10 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

@@ -132,15 +132,15 @@ void getProperties() {
132132
assertThat(bridge.getLong("otel.instrumentation.other-instrumentation.int_key", 1L))
133133
.isEqualTo(1L);
134134
assertThat(
135-
bridge.getDuration(
136-
"otel.instrumentation.other-instrumentation.int_key", Duration.ofMillis(1)))
135+
bridge.getDuration(
136+
"otel.instrumentation.other-instrumentation.int_key", Duration.ofMillis(1)))
137137
.isEqualTo(Duration.ofMillis(1));
138138
assertThat(bridge.getDouble("otel.instrumentation.other-instrumentation.double_key", 1.1))
139139
.isEqualTo(1.1);
140140
assertThat(
141-
bridge.getList(
142-
"otel.instrumentation.other-instrumentation.list_key",
143-
Arrays.asList("value1", "value2")))
141+
bridge.getList(
142+
"otel.instrumentation.other-instrumentation.list_key",
143+
Arrays.asList("value1", "value2")))
144144
.isEqualTo(Arrays.asList("value1", "value2"));
145145
assertThat(bridge.getMap("otel.instrumentation.other-instrumentation.map_key", expectedMap))
146146
.isEqualTo(expectedMap);
@@ -155,8 +155,8 @@ void vendor() {
155155

156156
@Test
157157
void translation() {
158-
DeclarativeConfigPropertiesBridge propertiesBridge = createBridge(
159-
Collections.singletonMap("acme", "acme.full_name"));
158+
DeclarativeConfigPropertiesBridge propertiesBridge =
159+
createBridge(Collections.singletonMap("acme", "acme.full_name"));
160160
assertThat(propertiesBridge.getBoolean("acme.preserved")).isTrue();
161161
}
162162
}

inferred-spans/src/main/java/io/opentelemetry/contrib/inferredspans/InferredSpansAutoConfig.java

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,8 @@ public class InferredSpansAutoConfig implements AutoConfigurationCustomizerProvi
4444
public void customize(AutoConfigurationCustomizer config) {
4545
config.addTracerProviderCustomizer(
4646
(providerBuilder, properties) -> {
47-
if (properties.getBoolean(ENABLED_OPTION, false)) {
48-
InferredSpansProcessorBuilder builder = InferredSpansProcessor.builder();
49-
50-
PropertiesApplier applier = new PropertiesApplier(properties);
51-
52-
applier.applyBool(LOGGING_OPTION, builder::profilerLoggingEnabled);
53-
applier.applyBool(DIAGNOSTIC_FILES_OPTION, builder::backupDiagnosticFiles);
54-
applier.applyInt(SAFEMODE_OPTION, builder::asyncProfilerSafeMode);
55-
applier.applyBool(POSTPROCESSING_OPTION, builder::postProcessingEnabled);
56-
applier.applyDuration(SAMPLING_INTERVAL_OPTION, builder::samplingInterval);
57-
applier.applyDuration(MIN_DURATION_OPTION, builder::inferredSpansMinDuration);
58-
applier.applyWildcards(INCLUDED_CLASSES_OPTION, builder::includedClasses);
59-
applier.applyWildcards(EXCLUDED_CLASSES_OPTION, builder::excludedClasses);
60-
applier.applyDuration(INTERVAL_OPTION, builder::profilerInterval);
61-
applier.applyDuration(DURATION_OPTION, builder::profilingDuration);
62-
applier.applyString(LIB_DIRECTORY_OPTION, builder::profilerLibDirectory);
63-
64-
String parentOverrideHandlerName = properties.getString(PARENT_OVERRIDE_HANDLER_OPTION);
65-
if (parentOverrideHandlerName != null && !parentOverrideHandlerName.isEmpty()) {
66-
builder.parentOverrideHandler(
67-
constructParentOverrideHandler(parentOverrideHandlerName));
68-
}
69-
70-
providerBuilder.addSpanProcessor(builder.build());
47+
if (isEnabled(properties)) {
48+
providerBuilder.addSpanProcessor(create(properties));
7149
} else {
7250
log.finest(
7351
"Not enabling inferred spans processor because " + ENABLED_OPTION + " is not set");
@@ -76,6 +54,36 @@ public void customize(AutoConfigurationCustomizer config) {
7654
});
7755
}
7856

57+
static InferredSpansProcessor create(ConfigProperties properties) {
58+
InferredSpansProcessorBuilder builder = InferredSpansProcessor.builder();
59+
60+
PropertiesApplier applier = new PropertiesApplier(properties);
61+
62+
applier.applyBool(LOGGING_OPTION, builder::profilerLoggingEnabled);
63+
applier.applyBool(DIAGNOSTIC_FILES_OPTION, builder::backupDiagnosticFiles);
64+
applier.applyInt(SAFEMODE_OPTION, builder::asyncProfilerSafeMode);
65+
applier.applyBool(POSTPROCESSING_OPTION, builder::postProcessingEnabled);
66+
applier.applyDuration(SAMPLING_INTERVAL_OPTION, builder::samplingInterval);
67+
applier.applyDuration(MIN_DURATION_OPTION, builder::inferredSpansMinDuration);
68+
applier.applyWildcards(INCLUDED_CLASSES_OPTION, builder::includedClasses);
69+
applier.applyWildcards(EXCLUDED_CLASSES_OPTION, builder::excludedClasses);
70+
applier.applyDuration(INTERVAL_OPTION, builder::profilerInterval);
71+
applier.applyDuration(DURATION_OPTION, builder::profilingDuration);
72+
applier.applyString(LIB_DIRECTORY_OPTION, builder::profilerLibDirectory);
73+
74+
String parentOverrideHandlerName = properties.getString(PARENT_OVERRIDE_HANDLER_OPTION);
75+
if (parentOverrideHandlerName != null && !parentOverrideHandlerName.isEmpty()) {
76+
builder.parentOverrideHandler(constructParentOverrideHandler(parentOverrideHandlerName));
77+
}
78+
79+
InferredSpansProcessor spanProcessor = builder.build();
80+
return spanProcessor;
81+
}
82+
83+
static boolean isEnabled(ConfigProperties properties) {
84+
return properties.getBoolean(ENABLED_OPTION, false);
85+
}
86+
7987
@SuppressWarnings("unchecked")
8088
private static BiConsumer<SpanBuilder, SpanContext> constructParentOverrideHandler(String name) {
8189
try {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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.api.incubator.config.DeclarativeConfigProperties;
10+
import io.opentelemetry.contrib.sdk.autoconfigure.ConfigPropertiesUtil;
11+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
12+
import io.opentelemetry.sdk.trace.SpanProcessor;
13+
14+
@SuppressWarnings("rawtypes")
15+
@AutoService(ComponentProvider.class)
16+
public class InferredSpansComponentProvider implements ComponentProvider<SpanProcessor> {
17+
@Override
18+
public String getName() {
19+
return "inferred_spans";
20+
}
21+
22+
@Override
23+
public SpanProcessor create(DeclarativeConfigProperties config) {
24+
return InferredSpansAutoConfig.create(
25+
ConfigPropertiesUtil.resolveInstrumentationConfig(
26+
config, InferredSpansCustomizerProvider.TRANSLATION_MAP));
27+
}
28+
29+
@Override
30+
public Class<SpanProcessor> getType() {
31+
return SpanProcessor.class;
32+
}
33+
}

inferred-spans/src/main/java/io/opentelemetry/contrib/inferredspans/InferredSpansCustomizerProvider.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,35 @@
1010
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1111
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
1212
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
13+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
14+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
1315
import java.util.Collections;
16+
import java.util.Map;
1417

1518
@AutoService(DeclarativeConfigurationCustomizerProvider.class)
1619
public class InferredSpansCustomizerProvider implements DeclarativeConfigurationCustomizerProvider {
1720

21+
static final Map<String, String> TRANSLATION_MAP =
22+
Collections.singletonMap("otel.inferred.spans", "inferred_spans");
23+
1824
@Override
1925
public void customize(DeclarativeConfigurationCustomizer customizer) {
2026
customizer.addModelCustomizer(
2127
model -> {
22-
ConfigProperties configProperties = ConfigPropertiesUtil.resolveModel(model,
23-
Collections.singletonMap("otel.inferred.spans", "inferred_spans"));
28+
ConfigProperties configProperties =
29+
ConfigPropertiesUtil.resolveModel(model, TRANSLATION_MAP);
30+
31+
TracerProviderModel tracerProvider = model.getTracerProvider();
32+
if (tracerProvider != null && InferredSpansAutoConfig.isEnabled(configProperties)) {
33+
tracerProvider.getProcessors().add(create());
34+
}
2435

2536
return model;
2637
});
2738
}
2839

40+
@SuppressWarnings("NullAway")
41+
private static SpanProcessorModel create() {
42+
return new SpanProcessorModel().withAdditionalProperty("inferred_spans", null);
43+
}
2944
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.contrib.inferredspans;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
12+
import java.io.ByteArrayInputStream;
13+
import java.nio.charset.StandardCharsets;
14+
import org.junit.jupiter.api.Test;
15+
16+
class InferredSpansCustomizerProviderTest {
17+
18+
@Test
19+
void declarativeConfig() {
20+
String yaml =
21+
"file_format: 0.4\n"
22+
+ "tracer_provider:\n"
23+
+ "instrumentation/development:\n"
24+
+ " java:\n"
25+
+ " inferred_spans:\n"
26+
+ " enabled: true\n";
27+
28+
OpenTelemetryConfigurationModel model =
29+
DeclarativeConfiguration.parse(
30+
new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8)));
31+
32+
new InferredSpansCustomizerProvider()
33+
.customize(
34+
c -> {
35+
OpenTelemetryConfigurationModel configurationModel = c.apply(model);
36+
assertThat(configurationModel.toString())
37+
.matches(
38+
".*SpanProcessorModel@.{8}\\[batch=<null>,simple=<null>,additionalProperties=\\{inferred_spans=null}.*");
39+
});
40+
}
41+
}

0 commit comments

Comments
 (0)