|
36 | 36 | import io.opentelemetry.sdk.trace.samplers.Sampler; |
37 | 37 | import java.io.Closeable; |
38 | 38 | import java.io.IOException; |
| 39 | +import java.lang.reflect.Field; |
39 | 40 | import java.util.ArrayList; |
40 | 41 | import java.util.Collections; |
41 | 42 | import java.util.HashMap; |
@@ -424,6 +425,10 @@ AutoConfiguredOpenTelemetrySdkBuilder setComponentLoader(ComponentLoader compone |
424 | 425 | * the settings of this {@link AutoConfiguredOpenTelemetrySdkBuilder}. |
425 | 426 | */ |
426 | 427 | public AutoConfiguredOpenTelemetrySdk build() { |
| 428 | + return maybeRunWithGlobalOpenTelemetryLock(this::buildImpl); |
| 429 | + } |
| 430 | + |
| 431 | + private AutoConfiguredOpenTelemetrySdk buildImpl() { |
427 | 432 | SpiHelper spiHelper = SpiHelper.create(componentLoader); |
428 | 433 | if (!customized) { |
429 | 434 | customized = true; |
@@ -572,6 +577,34 @@ private void maybeRegisterShutdownHook(OpenTelemetrySdk openTelemetrySdk) { |
572 | 577 | Runtime.getRuntime().addShutdownHook(shutdownHook(openTelemetrySdk)); |
573 | 578 | } |
574 | 579 |
|
| 580 | + @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter") |
| 581 | + private <T> T maybeRunWithGlobalOpenTelemetryLock(Supplier<T> supplier) { |
| 582 | + if (setResultAsGlobal) { |
| 583 | + return supplier.get(); |
| 584 | + } |
| 585 | + |
| 586 | + Object mutex = null; |
| 587 | + try { |
| 588 | + Field mutexField = GlobalOpenTelemetry.class.getDeclaredField("mutex"); |
| 589 | + mutexField.setAccessible(true); |
| 590 | + mutex = mutexField.get(null); |
| 591 | + if (mutex == null) { |
| 592 | + logger.log( |
| 593 | + Level.SEVERE, |
| 594 | + "Found a null Global OpenTelemetry mutex, this is a bug in the opentelemetry-java SDK and should be reported"); |
| 595 | + } |
| 596 | + } catch (Exception exception) { |
| 597 | + logger.log(Level.WARNING, "Could not acquire Global OpenTelemetry mutex", exception); |
| 598 | + } |
| 599 | + |
| 600 | + if (mutex == null) { |
| 601 | + return supplier.get(); |
| 602 | + } |
| 603 | + synchronized (mutex) { |
| 604 | + return supplier.get(); |
| 605 | + } |
| 606 | + } |
| 607 | + |
575 | 608 | private void maybeSetAsGlobal( |
576 | 609 | OpenTelemetrySdk openTelemetrySdk, @Nullable Object configProvider) { |
577 | 610 | if (!setResultAsGlobal) { |
|
0 commit comments