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 .ComponentProvider ;
1820import io .opentelemetry .sdk .extension .incubator .fileconfig .internal .model .OpenTelemetryConfigurationModel ;
1921import io .opentelemetry .sdk .extension .incubator .fileconfig .internal .model .SamplerModel ;
2224import java .io .Closeable ;
2325import java .io .IOException ;
2426import java .io .InputStream ;
27+ import java .lang .reflect .InvocationTargetException ;
28+ import java .lang .reflect .Method ;
2529import java .util .Collections ;
2630import java .util .Map ;
2731import java .util .Objects ;
@@ -112,38 +116,60 @@ public static OpenTelemetrySdk create(OpenTelemetryConfigurationModel configurat
112116 */
113117 public static OpenTelemetrySdk create (
114118 OpenTelemetryConfigurationModel configurationModel , ComponentLoader componentLoader ) {
115- SpiHelper spiHelper = SpiHelper .create (componentLoader );
119+ return create (configurationModel , DeclarativeConfigContext .create (componentLoader ));
120+ }
121+
122+ private static OpenTelemetrySdk create (
123+ OpenTelemetryConfigurationModel configurationModel , DeclarativeConfigContext context ) {
124+ DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder ();
125+
126+ for (DeclarativeConfigurationCustomizerProvider provider :
127+ context .getSpiHelper ().loadOrdered (DeclarativeConfigurationCustomizerProvider .class )) {
128+ provider .customize (builder );
129+ }
116130
117131 return createAndMaybeCleanup (
118132 OpenTelemetryConfigurationFactory .getInstance (),
119- spiHelper ,
120- customizeModel (configurationModel , spiHelper ));
133+ context ,
134+ builder . customizeModel (configurationModel ));
121135 }
122136
123- public static Resource createResource (
137+ public static AutoConfiguredOpenTelemetrySdk createAutoConfiguredSdk (
124138 OpenTelemetryConfigurationModel configurationModel , ComponentLoader componentLoader ) {
125- SpiHelper spiHelper = SpiHelper .create (componentLoader );
126- OpenTelemetryConfigurationModel model = customizeModel (configurationModel , spiHelper );
127-
128- Resource resource = Resource .getDefault ();
129- if (model .getResource () != null ) {
130- resource =
131- ResourceFactory .getInstance ()
132- .create (model .getResource (), new DeclarativeConfigContext (spiHelper ));
133- }
134- return resource ;
135- }
139+ DeclarativeConfigContext context = DeclarativeConfigContext .create (componentLoader );
136140
137- private static OpenTelemetryConfigurationModel customizeModel (
138- OpenTelemetryConfigurationModel configurationModel , SpiHelper spiHelper ) {
139- DeclarativeConfigurationBuilder builder = new DeclarativeConfigurationBuilder ();
141+ OpenTelemetrySdk sdk = create (configurationModel , context );
142+ SdkConfigProvider provider = SdkConfigProvider .create (configurationModel , componentLoader );
140143
141- for (DeclarativeConfigurationCustomizerProvider provider :
142- spiHelper .loadOrdered (DeclarativeConfigurationCustomizerProvider .class )) {
143- provider .customize (builder );
144+ try {
145+ Method method =
146+ Class .forName (AutoConfiguredOpenTelemetrySdk .class .getName ())
147+ .getDeclaredMethod (
148+ "create" ,
149+ OpenTelemetrySdk .class ,
150+ Resource .class ,
151+ ConfigProperties .class ,
152+ Object .class );
153+ method .setAccessible (true );
154+ return (AutoConfiguredOpenTelemetrySdk )
155+ method .invoke (null , sdk , context .getResource (), null , provider );
156+ } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e ) {
157+ throw new ConfigurationException (
158+ "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?" ,
159+ e );
160+ } catch (InvocationTargetException e ) {
161+ Throwable cause = e .getCause ();
162+ if (cause instanceof DeclarativeConfigException ) {
163+ throw toConfigurationException ((DeclarativeConfigException ) cause );
164+ }
165+ throw new ConfigurationException ("Unexpected error configuring from file" , e );
144166 }
167+ }
145168
146- return builder .customizeModel (configurationModel );
169+ private static ConfigurationException toConfigurationException (
170+ DeclarativeConfigException exception ) {
171+ String message = Objects .requireNonNull (exception .getMessage ());
172+ return new ConfigurationException (message , exception );
147173 }
148174
149175 /**
@@ -226,7 +252,7 @@ public static Sampler createSampler(DeclarativeConfigProperties genericSamplerMo
226252 DeclarativeConfigProperties .toMap (yamlDeclarativeConfigProperties ), SamplerModel .class );
227253 return createAndMaybeCleanup (
228254 SamplerFactory .getInstance (),
229- SpiHelper .create (yamlDeclarativeConfigProperties .getComponentLoader ()),
255+ DeclarativeConfigContext .create (yamlDeclarativeConfigProperties .getComponentLoader ()),
230256 samplerModel );
231257 }
232258
@@ -239,8 +265,8 @@ private static YamlDeclarativeConfigProperties requireYamlDeclarativeConfigPrope
239265 return (YamlDeclarativeConfigProperties ) declarativeConfigProperties ;
240266 }
241267
242- static <M , R > R createAndMaybeCleanup (Factory < M , R > factory , SpiHelper spiHelper , M model ) {
243- DeclarativeConfigContext context = new DeclarativeConfigContext ( spiHelper );
268+ static <M , R > R createAndMaybeCleanup (
269+ Factory < M , R > factory , DeclarativeConfigContext context , M model ) {
244270 try {
245271 return factory .create (model , context );
246272 } catch (RuntimeException e ) {
0 commit comments