1313import io .opentelemetry .api .incubator .config .DeclarativeConfigProperties ;
1414import io .opentelemetry .common .ComponentLoader ;
1515import io .opentelemetry .sdk .OpenTelemetrySdk ;
16- import io .opentelemetry .sdk .autoconfigure .internal .SpiHelper ;
16+ import io .opentelemetry .sdk .autoconfigure .AutoConfiguredOpenTelemetrySdk ;
17+ import io .opentelemetry .sdk .autoconfigure .spi .ConfigProperties ;
18+ import io .opentelemetry .sdk .autoconfigure .spi .ConfigurationException ;
1719import io .opentelemetry .sdk .autoconfigure .spi .internal .AutoConfigureListener ;
1820import io .opentelemetry .sdk .autoconfigure .spi .internal .ComponentProvider ;
1921import io .opentelemetry .sdk .extension .incubator .ExtendedOpenTelemetrySdk ;
2426import java .io .Closeable ;
2527import java .io .IOException ;
2628import java .io .InputStream ;
29+ import java .lang .reflect .InvocationTargetException ;
30+ import java .lang .reflect .Method ;
2731import java .util .Collections ;
2832import java .util .Map ;
2933import java .util .Objects ;
@@ -116,40 +120,62 @@ public static ExtendedOpenTelemetrySdk create(
116120 */
117121 public static ExtendedOpenTelemetrySdk create (
118122 OpenTelemetryConfigurationModel configurationModel , ComponentLoader componentLoader ) {
119- SpiHelper spiHelper = SpiHelper .create (componentLoader );
123+ return create (configurationModel , DeclarativeConfigContext .create (componentLoader ));
124+ }
125+
126+ private static OpenTelemetrySdk create (
127+ OpenTelemetryConfigurationModel configurationModel , DeclarativeConfigContext context ) {
128+ DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder ();
129+
130+ for (DeclarativeConfigurationCustomizerProvider provider :
131+ context .getSpiHelper ().loadOrdered (DeclarativeConfigurationCustomizerProvider .class )) {
132+ provider .customize (builder );
133+ }
120134
121135 ExtendedOpenTelemetrySdk sdk = createAndMaybeCleanup (
122136 OpenTelemetryConfigurationFactory .getInstance (),
123- spiHelper ,
124- customizeModel (configurationModel , spiHelper ));
137+ context ,
138+ builder . customizeModel (configurationModel ));
125139 callAutoConfigureListeners (spiHelper , sdk );
126140 return sdk ;
127141 }
128142
129- public static Resource createResource (
143+ public static AutoConfiguredOpenTelemetrySdk createAutoConfiguredSdk (
130144 OpenTelemetryConfigurationModel configurationModel , ComponentLoader componentLoader ) {
131- SpiHelper spiHelper = SpiHelper .create (componentLoader );
132- OpenTelemetryConfigurationModel model = customizeModel (configurationModel , spiHelper );
133-
134- Resource resource = Resource .getDefault ();
135- if (model .getResource () != null ) {
136- resource =
137- ResourceFactory .getInstance ()
138- .create (model .getResource (), new DeclarativeConfigContext (spiHelper ));
139- }
140- return resource ;
141- }
145+ DeclarativeConfigContext context = DeclarativeConfigContext .create (componentLoader );
142146
143- private static OpenTelemetryConfigurationModel customizeModel (
144- OpenTelemetryConfigurationModel configurationModel , SpiHelper spiHelper ) {
145- DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder ();
147+ OpenTelemetrySdk sdk = create (configurationModel , context );
148+ SdkConfigProvider provider = SdkConfigProvider .create (configurationModel , componentLoader );
146149
147- for (DeclarativeConfigurationCustomizerProvider provider :
148- spiHelper .loadOrdered (DeclarativeConfigurationCustomizerProvider .class )) {
149- provider .customize (builder );
150+ try {
151+ Method method =
152+ Class .forName (AutoConfiguredOpenTelemetrySdk .class .getName ())
153+ .getDeclaredMethod (
154+ "create" ,
155+ OpenTelemetrySdk .class ,
156+ Resource .class ,
157+ ConfigProperties .class ,
158+ Object .class );
159+ method .setAccessible (true );
160+ return (AutoConfiguredOpenTelemetrySdk )
161+ method .invoke (null , sdk , context .getResource (), null , provider );
162+ } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e ) {
163+ throw new ConfigurationException (
164+ "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?" ,
165+ e );
166+ } catch (InvocationTargetException e ) {
167+ Throwable cause = e .getCause ();
168+ if (cause instanceof DeclarativeConfigException ) {
169+ throw toConfigurationException ((DeclarativeConfigException ) cause );
170+ }
171+ throw new ConfigurationException ("Unexpected error configuring from file" , e );
150172 }
173+ }
151174
152- return builder .customizeModel (configurationModel );
175+ private static ConfigurationException toConfigurationException (
176+ DeclarativeConfigException exception ) {
177+ String message = Objects .requireNonNull (exception .getMessage ());
178+ return new ConfigurationException (message , exception );
153179 }
154180
155181 /**
@@ -232,7 +258,7 @@ public static Sampler createSampler(DeclarativeConfigProperties genericSamplerMo
232258 DeclarativeConfigProperties .toMap (yamlDeclarativeConfigProperties ), SamplerModel .class );
233259 return createAndMaybeCleanup (
234260 SamplerFactory .getInstance (),
235- SpiHelper .create (yamlDeclarativeConfigProperties .getComponentLoader ()),
261+ DeclarativeConfigContext .create (yamlDeclarativeConfigProperties .getComponentLoader ()),
236262 samplerModel );
237263 }
238264
@@ -245,8 +271,8 @@ private static YamlDeclarativeConfigProperties requireYamlDeclarativeConfigPrope
245271 return (YamlDeclarativeConfigProperties ) declarativeConfigProperties ;
246272 }
247273
248- static <M , R > R createAndMaybeCleanup (Factory < M , R > factory , SpiHelper spiHelper , M model ) {
249- DeclarativeConfigContext context = new DeclarativeConfigContext ( spiHelper );
274+ static <M , R > R createAndMaybeCleanup (
275+ Factory < M , R > factory , DeclarativeConfigContext context , M model ) {
250276 try {
251277 return factory .create (model , context );
252278 } catch (RuntimeException e ) {
0 commit comments