Skip to content

Commit 83525bc

Browse files
committed
declarative config
1 parent 3ff27a2 commit 83525bc

File tree

2 files changed

+95
-61
lines changed

2 files changed

+95
-61
lines changed

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/OpenTelemetryAutoConfiguration.java

Lines changed: 88 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.opentelemetry.api.OpenTelemetry;
99
import io.opentelemetry.api.trace.TracerProvider;
1010
import io.opentelemetry.instrumentation.api.internal.EmbeddedInstrumentationProperties;
11+
import io.opentelemetry.instrumentation.sdk.DeclarativeConfigPropertiesBridge;
1112
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.OtelMapConverter;
1213
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.SdkEnabled;
1314
import io.opentelemetry.instrumentation.spring.autoconfigure.internal.properties.OtelResourceProperties;
@@ -23,14 +24,14 @@
2324
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
2425
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
2526
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
27+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
28+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
2629
import java.util.Collections;
2730
import java.util.List;
2831
import java.util.Optional;
2932
import java.util.function.Function;
3033
import java.util.function.Supplier;
3134
import java.util.stream.Collectors;
32-
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration;
33-
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
3435
import org.slf4j.Logger;
3536
import org.slf4j.LoggerFactory;
3637
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -43,7 +44,6 @@
4344
import org.springframework.context.annotation.Bean;
4445
import org.springframework.context.annotation.Conditional;
4546
import org.springframework.context.annotation.Configuration;
46-
import org.springframework.context.annotation.DependsOn;
4747
import org.springframework.core.env.Environment;
4848

4949
/**
@@ -65,23 +65,8 @@ public class OpenTelemetryAutoConfiguration {
6565

6666
public OpenTelemetryAutoConfiguration() {}
6767

68-
@Bean
69-
@ConfigurationPropertiesBinding
70-
OtelMapConverter otelMapConverter() {
71-
// This is needed for otlp exporter headers and OtelResourceProperties.
72-
73-
// We need this converter, even if the SDK is disabled,
74-
// because the properties are parsed before the SDK is disabled.
75-
76-
// We also need this converter if the OpenTelemetry bean is user supplied,
77-
// because the environment variables may still contain a value that needs to be converted,
78-
// even if the SDK is disabled (and the value thus ignored).
79-
return new OtelMapConverter();
80-
}
81-
8268
@Configuration
8369
@Conditional(SdkEnabled.class)
84-
@DependsOn("otelMapConverter")
8570
@ConditionalOnMissingBean(OpenTelemetry.class)
8671
static class OpenTelemetrySdkConfig {
8772

@@ -101,67 +86,109 @@ public ResourceProvider otelDistroVersionResourceProvider() {
10186
return new DistroVersionResourceProvider();
10287
}
10388

104-
@Bean
105-
public AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk(
106-
Environment env,
107-
OtlpExporterProperties otlpExporterProperties,
108-
OtelResourceProperties resourceProperties,
109-
OtelSpringProperties otelSpringProperties,
110-
OpenTelemetrySdkComponentLoader componentLoader) {
111-
112-
return AutoConfigureUtil.setComponentLoader(
113-
AutoConfigureUtil.setConfigPropertiesCustomizer(
114-
AutoConfiguredOpenTelemetrySdk.builder(),
115-
c ->
116-
SpringConfigProperties.create(
117-
env,
118-
otlpExporterProperties,
119-
resourceProperties,
120-
otelSpringProperties,
121-
c)),
122-
componentLoader)
123-
.build();
89+
@Configuration
90+
@ConditionalOnProperty(name = "otel.file_format", matchIfMissing = true, havingValue = "never")
91+
static class PropertiesConfig {
92+
93+
@Bean
94+
@ConfigurationPropertiesBinding
95+
OtelMapConverter otelMapConverter() {
96+
return new OtelMapConverter();
97+
}
98+
99+
@Bean
100+
public AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk(
101+
Environment env,
102+
OtlpExporterProperties otlpExporterProperties,
103+
OtelResourceProperties resourceProperties,
104+
OtelSpringProperties otelSpringProperties,
105+
OpenTelemetrySdkComponentLoader componentLoader) {
106+
107+
return AutoConfigureUtil.setComponentLoader(
108+
AutoConfigureUtil.setConfigPropertiesCustomizer(
109+
AutoConfiguredOpenTelemetrySdk.builder(),
110+
c ->
111+
SpringConfigProperties.create(
112+
env,
113+
otlpExporterProperties,
114+
resourceProperties,
115+
otelSpringProperties,
116+
c)),
117+
componentLoader)
118+
.build();
119+
}
120+
121+
@Bean
122+
public OpenTelemetry openTelemetry(
123+
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
124+
logStart();
125+
return autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
126+
}
127+
128+
/**
129+
* Expose the {@link ConfigProperties} bean for use in other auto-configurations.
130+
*
131+
* <p>Not using spring boot properties directly in order to support {@link
132+
* io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer#addPropertiesCustomizer(Function)}
133+
* and {@link
134+
* io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer#addPropertiesSupplier(Supplier)}.
135+
*/
136+
@Bean
137+
public ConfigProperties otelProperties(
138+
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
139+
return AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk);
140+
}
124141
}
142+
}
143+
144+
@Configuration
145+
@ConditionalOnProperty(name = "otel.file_format")
146+
static class OpenTelemetrySdkEmbeddedConfigFileConfig {
125147

126-
// todo is not available with declarative config - unless via file property
127148
@Bean
128-
public OpenTelemetry openTelemetry(
129-
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
130-
logger.info(
131-
"OpenTelemetry Spring Boot starter ({}) has been started",
132-
EmbeddedInstrumentationProperties.findVersion(
133-
"io.opentelemetry.spring-boot-autoconfigure"));
134-
135-
return autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk();
149+
public OpenTelemetry openTelemetry() {
150+
151+
// todo declarative configuration
152+
// todo map converter not needed here, because the declarative configuration is not using
153+
// environment variables
154+
155+
logStart();
156+
157+
return null;
136158
}
137159

138160
/**
139161
* Expose the {@link ConfigProperties} bean for use in other auto-configurations.
140162
*
141-
* <p>Not using spring boot properties directly in order to support {@link
142-
* io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer#addPropertiesCustomizer(Function)}
143-
* and {@link
144-
* io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer#addPropertiesSupplier(Supplier)}.
163+
* <p>Not using spring boot properties directly, because declarative configuration does not
164+
* integrate with spring boot properties.
145165
*/
146166
@Bean
147-
public ConfigProperties otelProperties(
148-
AutoConfiguredOpenTelemetrySdk autoConfiguredOpenTelemetrySdk) {
149-
return AutoConfigureUtil.getConfig(autoConfiguredOpenTelemetrySdk);
167+
public ConfigProperties otelProperties(OpenTelemetryConfigurationModel model) {
168+
// todo component loader
169+
return DeclarativeConfigPropertiesBridge.create(
170+
DeclarativeConfiguration.toConfigProperties(model));
150171
}
172+
}
151173

152-
@Bean(name = "otelProperties")
153-
public ConfigProperties otelBridgeProperties(OpenTelemetryConfigurationModel model) {
154-
// todo componet loader
155-
// todo bridge properties
156-
return DeclarativeConfiguration.toConfigProperties(model);
157-
}
174+
private static void logStart() {
175+
logger.info(
176+
"OpenTelemetry Spring Boot starter ({}) has been started",
177+
EmbeddedInstrumentationProperties.findVersion(
178+
"io.opentelemetry.spring-boot-autoconfigure"));
158179
}
159180

160181
@Configuration
161-
@DependsOn("otelMapConverter")
162182
@ConditionalOnMissingBean(OpenTelemetry.class)
163183
@ConditionalOnProperty(name = "otel.sdk.disabled", havingValue = "true")
164184
static class DisabledOpenTelemetrySdkConfig {
185+
186+
@Bean
187+
@ConfigurationPropertiesBinding
188+
OtelMapConverter otelMapConverter() {
189+
return new OtelMapConverter();
190+
}
191+
165192
@Bean
166193
public OpenTelemetry openTelemetry() {
167194
logger.info("OpenTelemetry Spring Boot starter has been disabled");

instrumentation/spring/spring-boot-autoconfigure/src/main/java/io/opentelemetry/instrumentation/spring/autoconfigure/internal/OtelMapConverter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@
1717
* <p>This is the expected format for the <code>OTEL_RESOURCE_ATTRIBUTES</code> and <code>
1818
* OTEL_EXPORTER_OTLP_HEADERS</code> environment variables.
1919
*
20+
* <p>We need this converter, even if the SDK is disabled, because the properties are parsed before
21+
* the SDK is disabled.
22+
*
23+
* <p>We also need this converter if the OpenTelemetry bean is user supplied, because the
24+
* environment variables may still contain a value that needs to be converted, even if the SDK is
25+
* disabled (and the value thus ignored).
26+
*
2027
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
2128
* at any time.
2229
*/

0 commit comments

Comments
 (0)