Skip to content

Commit a972e95

Browse files
committed
inferred spans
1 parent 693e2fb commit a972e95

File tree

6 files changed

+72
-50
lines changed

6 files changed

+72
-50
lines changed

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ public static ConfigProperties resolveInstrumentationConfig(
5656
public static ConfigProperties resolveInstrumentationConfig(
5757
@Nullable DeclarativeConfigProperties instrumentationConfig,
5858
Map<String, String> translationMap) {
59-
if (instrumentationConfig == null) {
60-
instrumentationConfig = DeclarativeConfigProperties.empty();
61-
}
59+
return DeclarativeConfigPropertiesBridge.fromInstrumentationConfig(
60+
instrumentationConfig, translationMap);
61+
}
6262

63-
return new DeclarativeConfigPropertiesBridge(instrumentationConfig, translationMap);
63+
public static ConfigProperties resolveConfig(
64+
@Nullable DeclarativeConfigProperties config, Map<String, String> translationMap) {
65+
return DeclarativeConfigPropertiesBridge.create(config, translationMap);
6466
}
6567

6668
public static String propertyYamlPath(String propertyName) {

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,27 @@ final class DeclarativeConfigPropertiesBridge implements ConfigProperties {
5050

5151
private static final String OTEL_INSTRUMENTATION_PREFIX = "otel.instrumentation.";
5252

53-
// The node at .instrumentation.java
54-
private final DeclarativeConfigProperties instrumentationJavaNode;
53+
@Nullable private final DeclarativeConfigProperties baseNode;
5554
private final Map<String, String> translationMap;
5655

57-
DeclarativeConfigPropertiesBridge(
58-
DeclarativeConfigProperties instrumentationNode, Map<String, String> translationMap) {
59-
instrumentationJavaNode = instrumentationNode.getStructured("java", empty());
56+
static DeclarativeConfigPropertiesBridge fromInstrumentationConfig(
57+
@Nullable DeclarativeConfigProperties instrumentationConfig,
58+
Map<String, String> translationMap) {
59+
if (instrumentationConfig == null) {
60+
instrumentationConfig = DeclarativeConfigProperties.empty();
61+
}
62+
return new DeclarativeConfigPropertiesBridge(
63+
instrumentationConfig.getStructured("java", empty()), translationMap);
64+
}
65+
66+
static DeclarativeConfigPropertiesBridge create(
67+
@Nullable DeclarativeConfigProperties node, Map<String, String> translationMap) {
68+
return new DeclarativeConfigPropertiesBridge(node, translationMap);
69+
}
70+
71+
private DeclarativeConfigPropertiesBridge(
72+
@Nullable DeclarativeConfigProperties baseNode, Map<String, String> translationMap) {
73+
this.baseNode = baseNode;
6074
this.translationMap = translationMap;
6175
}
6276

@@ -133,7 +147,7 @@ public Map<String, String> getMap(String propertyName) {
133147
@Nullable
134148
private <T> T getPropertyValue(
135149
String property, BiFunction<DeclarativeConfigProperties, String, T> extractor) {
136-
if (instrumentationJavaNode == null) {
150+
if (baseNode == null) {
137151
return null;
138152
}
139153

@@ -143,7 +157,7 @@ private <T> T getPropertyValue(
143157
}
144158

145159
// Extract the value by walking to the N-1 entry
146-
DeclarativeConfigProperties target = instrumentationJavaNode;
160+
DeclarativeConfigProperties target = baseNode;
147161
if (segments.length > 1) {
148162
for (int i = 0; i < segments.length - 1; i++) {
149163
target = target.getStructured(segments[i], empty());

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void setup() {
6565
.withAdditionalProperty("instrumentation/development", new InstrumentationModel());
6666
SdkConfigProvider emptyConfigProvider = SdkConfigProvider.create(emptyModel);
6767
emptyBridge =
68-
new DeclarativeConfigPropertiesBridge(
68+
DeclarativeConfigPropertiesBridge.fromInstrumentationConfig(
6969
Objects.requireNonNull(emptyConfigProvider.getInstrumentationConfig()),
7070
Collections.emptyMap());
7171
}
@@ -75,7 +75,7 @@ private static DeclarativeConfigPropertiesBridge createBridge(
7575
OpenTelemetryConfigurationModel model =
7676
DeclarativeConfiguration.parse(
7777
new ByteArrayInputStream(YAML.getBytes(StandardCharsets.UTF_8)));
78-
return new DeclarativeConfigPropertiesBridge(
78+
return DeclarativeConfigPropertiesBridge.fromInstrumentationConfig(
7979
Objects.requireNonNull(SdkConfigProvider.create(model).getInstrumentationConfig()),
8080
translationMap);
8181
}

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
1212
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
1313
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
14+
import io.opentelemetry.sdk.trace.SpanProcessor;
1415
import java.time.Duration;
1516
import java.util.Arrays;
17+
import java.util.Collections;
1618
import java.util.List;
1719
import java.util.function.BiConsumer;
1820
import java.util.function.Consumer;
@@ -44,17 +46,20 @@ public class InferredSpansAutoConfig implements AutoConfigurationCustomizerProvi
4446
public void customize(AutoConfigurationCustomizer config) {
4547
config.addTracerProviderCustomizer(
4648
(providerBuilder, properties) -> {
47-
if (isEnabled(properties)) {
48-
providerBuilder.addSpanProcessor(create(properties));
49-
} else {
50-
log.finest(
51-
"Not enabling inferred spans processor because " + ENABLED_OPTION + " is not set");
52-
}
49+
providerBuilder.addSpanProcessor(create(properties, /* enableByDefault= */ false));
5350
return providerBuilder;
5451
});
5552
}
5653

57-
static InferredSpansProcessor create(ConfigProperties properties) {
54+
static SpanProcessor create(ConfigProperties properties, boolean enableByDefault) {
55+
if (!properties.getBoolean(ENABLED_OPTION, enableByDefault)) {
56+
log.finest(
57+
"Not creating inferred spans processor because "
58+
+ ENABLED_OPTION
59+
+ " is not set to true");
60+
return SpanProcessor.composite(Collections.emptyList());
61+
}
62+
5863
InferredSpansProcessorBuilder builder = InferredSpansProcessor.builder();
5964

6065
PropertiesApplier applier = new PropertiesApplier(properties);
@@ -76,12 +81,7 @@ static InferredSpansProcessor create(ConfigProperties properties) {
7681
builder.parentOverrideHandler(constructParentOverrideHandler(parentOverrideHandlerName));
7782
}
7883

79-
InferredSpansProcessor spanProcessor = builder.build();
80-
return spanProcessor;
81-
}
82-
83-
static boolean isEnabled(ConfigProperties properties) {
84-
return properties.getBoolean(ENABLED_OPTION, false);
84+
return builder.build();
8585
}
8686

8787
@SuppressWarnings("unchecked")

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import io.opentelemetry.contrib.sdk.autoconfigure.ConfigPropertiesUtil;
1111
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
1212
import io.opentelemetry.sdk.trace.SpanProcessor;
13+
import java.util.Collections;
1314

1415
@SuppressWarnings("rawtypes")
1516
@AutoService(ComponentProvider.class)
1617
public class InferredSpansComponentProvider implements ComponentProvider<SpanProcessor> {
18+
1719
@Override
1820
public String getName() {
1921
return "inferred_spans";
@@ -22,8 +24,9 @@ public String getName() {
2224
@Override
2325
public SpanProcessor create(DeclarativeConfigProperties config) {
2426
return InferredSpansAutoConfig.create(
25-
ConfigPropertiesUtil.resolveInstrumentationConfig(
26-
config, InferredSpansCustomizerProvider.TRANSLATION_MAP));
27+
ConfigPropertiesUtil.resolveConfig(
28+
config, Collections.singletonMap("otel.inferred.spans.", "")),
29+
/* enableByDefault= */ true);
2730
}
2831

2932
@Override

inferred-spans/src/test/java/io/opentelemetry/contrib/inferredspans/InferredSpansCustomizerProviderTest.java

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,40 @@
55

66
package io.opentelemetry.contrib.inferredspans;
77

8-
import static org.assertj.core.api.Assertions.assertThat;
9-
108
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
11-
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
9+
import org.junit.jupiter.api.Test;
10+
1211
import java.io.ByteArrayInputStream;
1312
import java.nio.charset.StandardCharsets;
14-
import org.junit.jupiter.api.Test;
13+
14+
import static org.assertj.core.api.Assertions.assertThat;
1515

1616
class InferredSpansCustomizerProviderTest {
1717

18+
private static final String FQDN =
19+
"spanProcessor=io.opentelemetry.contrib.inferredspans.InferredSpansProcessor";
20+
21+
@Test
22+
void enabled() {
23+
assertThat(create("")).contains(FQDN);
24+
}
25+
1826
@Test
19-
void declarativeConfig() {
27+
void disabled() {
28+
assertThat(create("enabled: false")).doesNotContain(FQDN);
29+
}
30+
31+
private static String create(String enabled) {
2032
String yaml =
2133
"file_format: 0.4\n"
2234
+ "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-
});
35+
+ " processors:\n"
36+
+ " - inferred_spans:\n"
37+
+ " "
38+
+ enabled
39+
+ "\n";
40+
return DeclarativeConfiguration.parseAndCreate(
41+
new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8)))
42+
.toString();
4043
}
4144
}

0 commit comments

Comments
 (0)