88import io .opentelemetry .api .OpenTelemetry ;
99import io .opentelemetry .api .trace .TracerProvider ;
1010import io .opentelemetry .instrumentation .api .internal .EmbeddedInstrumentationProperties ;
11+ import io .opentelemetry .instrumentation .sdk .DeclarativeConfigPropertiesBridge ;
1112import io .opentelemetry .instrumentation .spring .autoconfigure .internal .OtelMapConverter ;
1213import io .opentelemetry .instrumentation .spring .autoconfigure .internal .SdkEnabled ;
1314import io .opentelemetry .instrumentation .spring .autoconfigure .internal .properties .OtelResourceProperties ;
2324import io .opentelemetry .sdk .autoconfigure .spi .ConfigProperties ;
2425import io .opentelemetry .sdk .autoconfigure .spi .ResourceProvider ;
2526import 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 ;
2629import java .util .Collections ;
2730import java .util .List ;
2831import java .util .Optional ;
2932import java .util .function .Function ;
3033import java .util .function .Supplier ;
3134import java .util .stream .Collectors ;
32- import io .opentelemetry .sdk .extension .incubator .fileconfig .DeclarativeConfiguration ;
33- import io .opentelemetry .sdk .extension .incubator .fileconfig .internal .model .OpenTelemetryConfigurationModel ;
3435import org .slf4j .Logger ;
3536import org .slf4j .LoggerFactory ;
3637import org .springframework .boot .autoconfigure .condition .ConditionalOnBean ;
4344import org .springframework .context .annotation .Bean ;
4445import org .springframework .context .annotation .Conditional ;
4546import org .springframework .context .annotation .Configuration ;
46- import org .springframework .context .annotation .DependsOn ;
4747import 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" );
0 commit comments