88import static java .util .Objects .requireNonNull ;
99
1010import io .opentelemetry .api .GlobalOpenTelemetry ;
11- import io .opentelemetry .api .incubator .config .ConfigProvider ;
12- import io .opentelemetry .api .incubator .config .DeclarativeConfigException ;
13- import io .opentelemetry .api .incubator .config .GlobalConfigProvider ;
1411import io .opentelemetry .context .propagation .ContextPropagators ;
1512import io .opentelemetry .context .propagation .TextMapPropagator ;
1613import io .opentelemetry .sdk .OpenTelemetrySdk ;
3835import io .opentelemetry .sdk .trace .export .SpanExporter ;
3936import io .opentelemetry .sdk .trace .samplers .Sampler ;
4037import java .io .Closeable ;
41- import java .io .FileInputStream ;
42- import java .io .FileNotFoundException ;
4338import java .io .IOException ;
44- import java .io .InputStream ;
45- import java .lang .reflect .InvocationTargetException ;
46- import java .lang .reflect .Method ;
4739import java .util .ArrayList ;
4840import java .util .Collections ;
4941import java .util .HashMap ;
5042import java .util .List ;
5143import java .util .Map ;
52- import java .util .Objects ;
53- import java .util .Optional ;
5444import java .util .function .BiFunction ;
5545import java .util .function .Function ;
5646import java .util .function .Supplier ;
@@ -69,6 +59,18 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
6959
7060 private static final Logger logger =
7161 Logger .getLogger (AutoConfiguredOpenTelemetrySdkBuilder .class .getName ());
62+ private static final boolean INCUBATOR_AVAILABLE ;
63+
64+ static {
65+ boolean incubatorAvailable = false ;
66+ try {
67+ Class .forName ("io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration" );
68+ incubatorAvailable = true ;
69+ } catch (ClassNotFoundException e ) {
70+ // Not available
71+ }
72+ INCUBATOR_AVAILABLE = incubatorAvailable ;
73+ }
7274
7375 @ Nullable private ConfigProperties config ;
7476
@@ -436,9 +438,7 @@ public AutoConfiguredOpenTelemetrySdk build() {
436438 if (fromFileConfiguration != null ) {
437439 maybeRegisterShutdownHook (fromFileConfiguration .getOpenTelemetrySdk ());
438440 maybeSetAsGlobal (
439- fromFileConfiguration .getOpenTelemetrySdk (),
440- Optional .ofNullable (fromFileConfiguration .getConfigProvider ())
441- .orElse (ConfigProvider .noop ()));
441+ fromFileConfiguration .getOpenTelemetrySdk (), fromFileConfiguration .getConfigProvider ());
442442 return fromFileConfiguration ;
443443 }
444444
@@ -464,7 +464,7 @@ public AutoConfiguredOpenTelemetrySdk build() {
464464
465465 OpenTelemetrySdk openTelemetrySdk = sdkBuilder .build ();
466466 maybeRegisterShutdownHook (openTelemetrySdk );
467- maybeSetAsGlobal (openTelemetrySdk , ConfigProvider . noop () );
467+ maybeSetAsGlobal (openTelemetrySdk , null );
468468 callAutoConfigureListeners (spiHelper , openTelemetrySdk );
469469
470470 return AutoConfiguredOpenTelemetrySdk .create (openTelemetrySdk , resource , config , null );
@@ -555,52 +555,11 @@ private static AutoConfiguredOpenTelemetrySdk maybeConfigureFromFile(
555555 if (configurationFile == null || configurationFile .isEmpty ()) {
556556 return null ;
557557 }
558- logger .fine ("Autoconfiguring from configuration file: " + configurationFile );
559- try (FileInputStream fis = new FileInputStream (configurationFile )) {
560- Class <?> declarativeConfiguration =
561- Class .forName (
562- "io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfiguration" );
563- Method parse = declarativeConfiguration .getMethod ("parse" , InputStream .class );
564- Object model = parse .invoke (null , fis );
565- Class <?> openTelemetryConfiguration =
566- Class .forName (
567- "io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel" );
568- Method create =
569- declarativeConfiguration .getMethod (
570- "create" , openTelemetryConfiguration , ComponentLoader .class );
571- OpenTelemetrySdk sdk = (OpenTelemetrySdk ) create .invoke (null , model , componentLoader );
572- Class <?> sdkConfigProvider =
573- Class .forName ("io.opentelemetry.sdk.extension.incubator.fileconfig.SdkConfigProvider" );
574- Method createFileConfigProvider =
575- sdkConfigProvider .getMethod ("create" , openTelemetryConfiguration );
576- ConfigProvider configProvider = (ConfigProvider ) createFileConfigProvider .invoke (null , model );
577- // Note: can't access file configuration resource without reflection so setting a dummy
578- // resource
579- return AutoConfiguredOpenTelemetrySdk .create (
580- sdk , Resource .getDefault (), null , configProvider );
581- } catch (FileNotFoundException e ) {
582- throw new ConfigurationException ("Configuration file not found" , e );
583- } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e ) {
558+ if (!INCUBATOR_AVAILABLE ) {
584559 throw new ConfigurationException (
585- "Error configuring from file. Is opentelemetry-sdk-extension-incubator on the classpath?" ,
586- e );
587- } catch (InvocationTargetException e ) {
588- Throwable cause = e .getCause ();
589- if (cause instanceof DeclarativeConfigException ) {
590- throw toConfigurationException ((DeclarativeConfigException ) cause );
591- }
592- throw new ConfigurationException ("Unexpected error configuring from file" , e );
593- } catch (IOException e ) {
594- // IOException (other than FileNotFoundException which is caught above) is only thrown
595- // above by FileInputStream.close()
596- throw new ConfigurationException ("Error closing file" , e );
560+ "Cannot autoconfigure from config file without opentelemetry-sdk-extension-incubator on the classpath" );
597561 }
598- }
599-
600- private static ConfigurationException toConfigurationException (
601- DeclarativeConfigException exception ) {
602- String message = Objects .requireNonNull (exception .getMessage ());
603- return new ConfigurationException (message , exception );
562+ return IncubatingUtil .configureFromFile (logger , configurationFile , componentLoader );
604563 }
605564
606565 private void maybeRegisterShutdownHook (OpenTelemetrySdk openTelemetrySdk ) {
@@ -610,12 +569,15 @@ private void maybeRegisterShutdownHook(OpenTelemetrySdk openTelemetrySdk) {
610569 Runtime .getRuntime ().addShutdownHook (shutdownHook (openTelemetrySdk ));
611570 }
612571
613- private void maybeSetAsGlobal (OpenTelemetrySdk openTelemetrySdk , ConfigProvider configProvider ) {
572+ private void maybeSetAsGlobal (
573+ OpenTelemetrySdk openTelemetrySdk , @ Nullable Object configProvider ) {
614574 if (!setResultAsGlobal ) {
615575 return ;
616576 }
617577 GlobalOpenTelemetry .set (openTelemetrySdk );
618- GlobalConfigProvider .set (configProvider );
578+ if (INCUBATOR_AVAILABLE && configProvider != null ) {
579+ IncubatingUtil .setGlobalConfigProvider (configProvider );
580+ }
619581 logger .log (
620582 Level .FINE , "Global OpenTelemetry set to {0} by autoconfiguration" , openTelemetrySdk );
621583 }
0 commit comments