67
67
import java .util .Properties ;
68
68
import java .util .concurrent .TimeUnit ;
69
69
import java .util .function .BiFunction ;
70
+ import java .util .function .Consumer ;
70
71
import java .util .function .Supplier ;
72
+ import org .junit .jupiter .api .Assertions ;
71
73
import org .junit .jupiter .api .BeforeEach ;
72
74
import org .junit .jupiter .api .Test ;
73
75
import org .junit .jupiter .api .extension .ExtendWith ;
@@ -391,7 +393,15 @@ void builder_registersShutdownHook() {
391
393
}
392
394
393
395
@ 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 {
395
405
OpenTelemetrySdk sdk = mock (OpenTelemetrySdk .class );
396
406
397
407
Thread thread = builder .shutdownHook (sdk );
@@ -411,7 +421,7 @@ void builder_CallAutoConfigureListeners() {
411
421
}
412
422
413
423
@ Test
414
- void callAutoConfigureListeners () {
424
+ void builder_callAutoConfigureListeners () {
415
425
AutoConfigureListener listener = mock (AutoConfigureListener .class );
416
426
SpiHelper spiHelper = mock (SpiHelper .class );
417
427
when (spiHelper .getListeners ()).thenReturn (Collections .singleton (listener ));
@@ -455,6 +465,39 @@ void disableSdk() {
455
465
verify (logCustomizer , never ()).apply (any (), any ());
456
466
}
457
467
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
+
458
501
@ Test
459
502
void tracerProviderCustomizer () {
460
503
InMemorySpanExporter spanExporter = InMemorySpanExporter .create ();
@@ -510,6 +553,88 @@ void testNonStringProperties() {
510
553
});
511
554
}
512
555
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
+
513
638
@ Test
514
639
@ SuppressLogger (AutoConfiguredOpenTelemetrySdkBuilder .class )
515
640
void configurationError_ClosesResources () {
@@ -539,16 +664,37 @@ void configurationError_ClosesResources() {
539
664
.addLoggerProviderCustomizer ((u1 , u2 ) -> loggerProviderBuilder )
540
665
.addPropertiesSupplier (() -> singletonMap ("otel.metrics.exporter" , "none" ))
541
666
.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 " ))
544
669
.build ())
545
670
.isInstanceOf (ConfigurationException .class )
546
- .hasMessageContaining ("Unrecognized value for otel.propagators " );
671
+ .hasMessageContaining ("Unrecognized value for otel.logs.exporter: foo " );
547
672
548
673
verify (tracerProvider ).close ();
549
674
verify (meterProvider ).close ();
550
- verify (loggerProvider ).close ();
551
675
552
676
logs .assertContains ("Error closing io.opentelemetry.sdk.trace.SdkTracerProvider: Error!" );
553
677
}
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
+ }
554
700
}
0 commit comments