6767import java .util .Properties ;
6868import java .util .concurrent .TimeUnit ;
6969import java .util .function .BiFunction ;
70+ import java .util .function .Consumer ;
7071import java .util .function .Supplier ;
72+ import org .junit .jupiter .api .Assertions ;
7173import org .junit .jupiter .api .BeforeEach ;
7274import org .junit .jupiter .api .Test ;
7375import org .junit .jupiter .api .extension .ExtendWith ;
@@ -391,7 +393,15 @@ void builder_registersShutdownHook() {
391393 }
392394
393395 @ Test
394- void shutdownHook () throws InterruptedException {
396+ void builder_customizes () {
397+ builder = spy (builder );
398+ OpenTelemetrySdk sdk = builder .build ().getOpenTelemetrySdk ();
399+ assertThat (sdk ).isNotNull ();
400+ verify (builder , times (1 )).mergeSdkTracerProviderConfigurer ();
401+ }
402+
403+ @ Test
404+ void builder_shutdownHook () throws InterruptedException {
395405 OpenTelemetrySdk sdk = mock (OpenTelemetrySdk .class );
396406
397407 Thread thread = builder .shutdownHook (sdk );
@@ -411,7 +421,7 @@ void builder_CallAutoConfigureListeners() {
411421 }
412422
413423 @ Test
414- void callAutoConfigureListeners () {
424+ void builder_callAutoConfigureListeners () {
415425 AutoConfigureListener listener = mock (AutoConfigureListener .class );
416426 SpiHelper spiHelper = mock (SpiHelper .class );
417427 when (spiHelper .getListeners ()).thenReturn (Collections .singleton (listener ));
@@ -455,6 +465,39 @@ void disableSdk() {
455465 verify (logCustomizer , never ()).apply (any (), any ());
456466 }
457467
468+ @ Test
469+ void disableSdk_PropagatorCustomizer () {
470+ Context extracted = Context .root ().with (ContextKey .named ("animal" ), "bear" );
471+
472+ when (propagator2 .extract (any (), any (), any ())).thenReturn (extracted );
473+
474+ AutoConfiguredOpenTelemetrySdk autoConfiguredSdk =
475+ AutoConfiguredOpenTelemetrySdk .builder ()
476+ .addPropertiesSupplier (() -> singletonMap ("otel.sdk.disabled" , "true" ))
477+ .addPropertiesSupplier (() -> singletonMap ("otel.propagators" , "tracecontext" ))
478+ .addPropagatorCustomizer (
479+ (previous , config ) -> {
480+ assertThat (previous ).isSameAs (W3CTraceContextPropagator .getInstance ());
481+ return propagator1 ;
482+ })
483+ .addPropagatorCustomizer (
484+ (previous , config ) -> {
485+ assertThat (previous ).isSameAs (propagator1 );
486+ return propagator2 ;
487+ })
488+ .build ();
489+
490+ // When the SDK is disabled, propagators are still configured
491+ assertThat (autoConfiguredSdk .getOpenTelemetrySdk ().getPropagators ()).isNotNull ();
492+ Consumer <TextMapPropagator > propagatorConsumer =
493+ propagator -> {
494+ assertThat (propagator .extract (Context .root (), Collections .emptyMap (), getter ))
495+ .isEqualTo (extracted );
496+ };
497+ assertThat (autoConfiguredSdk .getOpenTelemetrySdk ().getPropagators ().getTextMapPropagator ())
498+ .isInstanceOfSatisfying (TextMapPropagator .class , propagatorConsumer );
499+ }
500+
458501 @ Test
459502 void tracerProviderCustomizer () {
460503 InMemorySpanExporter spanExporter = InMemorySpanExporter .create ();
@@ -510,6 +553,88 @@ void testNonStringProperties() {
510553 });
511554 }
512555
556+ @ Test
557+ @ SuppressLogger (AutoConfiguredOpenTelemetrySdkBuilder .class )
558+ void configurationError_propagators () {
559+ BiFunction <SdkTracerProviderBuilder , ConfigProperties , SdkTracerProviderBuilder >
560+ traceCustomizer = getTracerProviderBuilderSpy ();
561+ BiFunction <SdkMeterProviderBuilder , ConfigProperties , SdkMeterProviderBuilder >
562+ metricCustomizer = getMeterProviderBuilderSpy ();
563+ BiFunction <SdkLoggerProviderBuilder , ConfigProperties , SdkLoggerProviderBuilder > logCustomizer =
564+ getLoggerProviderBuilderSpy ();
565+
566+ assertThatThrownBy (
567+ () ->
568+ // Override the provider builders with mocks which we can verify are closed
569+ AutoConfiguredOpenTelemetrySdk .builder ()
570+ .addTracerProviderCustomizer (traceCustomizer )
571+ .addMeterProviderCustomizer (metricCustomizer )
572+ .addLoggerProviderCustomizer (logCustomizer )
573+ .addPropertiesSupplier (() -> singletonMap ("otel.metrics.exporter" , "none" ))
574+ .addPropertiesSupplier (() -> singletonMap ("otel.traces.exporter" , "none" ))
575+ .addPropertiesSupplier (() -> singletonMap ("otel.logs.exporter" , "none" ))
576+ .addPropertiesSupplier (() -> singletonMap ("otel.propagators" , "foo" ))
577+ .addPropertiesSupplier (() -> singletonMap ("otel.sdk.disabled" , "true" ))
578+ .build ())
579+ .isInstanceOf (ConfigurationException .class )
580+ .hasMessageContaining ("Unrecognized value for otel.propagators" );
581+
582+ // When the SDK is disabled and propagators are mis-configured, none of the customizers are
583+ // called
584+ verify (traceCustomizer , never ()).apply (any (), any ());
585+ verify (metricCustomizer , never ()).apply (any (), any ());
586+ verify (logCustomizer , never ()).apply (any (), any ());
587+
588+ assertThatThrownBy (
589+ () ->
590+ // Override the provider builders with mocks which we can verify are closed
591+ AutoConfiguredOpenTelemetrySdk .builder ()
592+ .addTracerProviderCustomizer (traceCustomizer )
593+ .addMeterProviderCustomizer (metricCustomizer )
594+ .addLoggerProviderCustomizer (logCustomizer )
595+ .addPropertiesSupplier (() -> singletonMap ("otel.metrics.exporter" , "none" ))
596+ .addPropertiesSupplier (() -> singletonMap ("otel.traces.exporter" , "none" ))
597+ .addPropertiesSupplier (() -> singletonMap ("otel.logs.exporter" , "none" ))
598+ .addPropertiesSupplier (() -> singletonMap ("otel.propagators" , "foo" ))
599+ .addPropertiesSupplier (() -> singletonMap ("otel.sdk.disabled" , "false" ))
600+ .build ())
601+ .isInstanceOf (ConfigurationException .class )
602+ .hasMessageContaining ("Unrecognized value for otel.propagators" );
603+
604+ // When the SDK is enabled and propagators are mis-configured, none of the customizers are
605+ // called
606+ verify (traceCustomizer , never ()).apply (any (), any ());
607+ verify (metricCustomizer , never ()).apply (any (), any ());
608+ verify (logCustomizer , never ()).apply (any (), any ());
609+ }
610+
611+ @ Test
612+ @ SuppressLogger (AutoConfiguredOpenTelemetrySdkBuilder .class )
613+ void configurationError_runtime () {
614+ BiFunction <SdkTracerProviderBuilder , ConfigProperties , SdkTracerProviderBuilder >
615+ traceCustomizer = getTracerProviderBuilderSpy ();
616+ BiFunction <SdkMeterProviderBuilder , ConfigProperties , SdkMeterProviderBuilder >
617+ metricCustomizer = getMeterProviderBuilderSpy ();
618+ BiFunction <SdkLoggerProviderBuilder , ConfigProperties , SdkLoggerProviderBuilder > logCustomizer =
619+ getLoggerProviderBuilderSpy ();
620+
621+ doThrow (new RuntimeException ()).when (traceCustomizer ).apply (any (), any ());
622+
623+ assertThatThrownBy (
624+ () ->
625+ AutoConfiguredOpenTelemetrySdk .builder ()
626+ .addTracerProviderCustomizer (traceCustomizer )
627+ .addMeterProviderCustomizer (metricCustomizer )
628+ .addLoggerProviderCustomizer (logCustomizer )
629+ .addPropertiesSupplier (() -> singletonMap ("otel.metrics.exporter" , "none" ))
630+ .addPropertiesSupplier (() -> singletonMap ("otel.traces.exporter" , "none" ))
631+ .addPropertiesSupplier (() -> singletonMap ("otel.logs.exporter" , "none" ))
632+ .addPropertiesSupplier (() -> singletonMap ("otel.sdk.disabled" , "false" ))
633+ .build ())
634+ .isInstanceOf (ConfigurationException .class )
635+ .hasMessageContaining ("Unexpected configuration error" );
636+ }
637+
513638 @ Test
514639 @ SuppressLogger (AutoConfiguredOpenTelemetrySdkBuilder .class )
515640 void configurationError_ClosesResources () {
@@ -539,16 +664,37 @@ void configurationError_ClosesResources() {
539664 .addLoggerProviderCustomizer ((u1 , u2 ) -> loggerProviderBuilder )
540665 .addPropertiesSupplier (() -> singletonMap ("otel.metrics.exporter" , "none" ))
541666 .addPropertiesSupplier (() -> singletonMap ("otel.traces.exporter" , "none" ))
542- .addPropertiesSupplier (() -> singletonMap ("otel.logs.exporter" , "none " ))
543- .addPropertiesSupplier (() -> singletonMap ("otel.propagators " , "foo " ))
667+ .addPropertiesSupplier (() -> singletonMap ("otel.logs.exporter" , "foo " ))
668+ .addPropertiesSupplier (() -> singletonMap ("otel.sdk.disabled " , "false " ))
544669 .build ())
545670 .isInstanceOf (ConfigurationException .class )
546- .hasMessageContaining ("Unrecognized value for otel.propagators " );
671+ .hasMessageContaining ("Unrecognized value for otel.logs.exporter: foo " );
547672
548673 verify (tracerProvider ).close ();
549674 verify (meterProvider ).close ();
550- verify (loggerProvider ).close ();
551675
552676 logs .assertContains ("Error closing io.opentelemetry.sdk.trace.SdkTracerProvider: Error!" );
553677 }
678+
679+ @ Test
680+ @ SuppressLogger (AutoConfiguredOpenTelemetrySdkBuilder .class )
681+ void configurationError_fileNotFound () {
682+ assertThatThrownBy (
683+ () ->
684+ AutoConfiguredOpenTelemetrySdk .builder ()
685+ .addPropertiesSupplier (() -> singletonMap ("otel.config.file" , "foo" ))
686+ .addPropertiesSupplier (
687+ () -> singletonMap ("otel.experimental.config.file" , "foo" ))
688+ .addPropertiesSupplier (() -> singletonMap ("otel.sdk.disabled" , "true" ))
689+ .build ())
690+ .isInstanceOf (ConfigurationException .class )
691+ .hasMessageContaining ("Configuration file not found" );
692+
693+ Assertions .assertDoesNotThrow (
694+ () ->
695+ AutoConfiguredOpenTelemetrySdk .builder ()
696+ .addPropertiesSupplier (() -> singletonMap ("otel.experimental.config.file" , "" ))
697+ .addPropertiesSupplier (() -> singletonMap ("otel.sdk.disabled" , "true" ))
698+ .build ());
699+ }
554700}
0 commit comments