Skip to content

Commit 1d5245f

Browse files
committed
hold mutex
1 parent 6153023 commit 1d5245f

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import io.opentelemetry.sdk.trace.samplers.Sampler;
3737
import java.io.Closeable;
3838
import java.io.IOException;
39+
import java.lang.reflect.Field;
3940
import java.util.ArrayList;
4041
import java.util.Collections;
4142
import java.util.HashMap;
@@ -424,6 +425,10 @@ AutoConfiguredOpenTelemetrySdkBuilder setComponentLoader(ComponentLoader compone
424425
* the settings of this {@link AutoConfiguredOpenTelemetrySdkBuilder}.
425426
*/
426427
public AutoConfiguredOpenTelemetrySdk build() {
428+
return maybeRunWithGlobalOpenTelemetryLock(this::buildImpl);
429+
}
430+
431+
private AutoConfiguredOpenTelemetrySdk buildImpl() {
427432
SpiHelper spiHelper = SpiHelper.create(componentLoader);
428433
if (!customized) {
429434
customized = true;
@@ -572,6 +577,34 @@ private void maybeRegisterShutdownHook(OpenTelemetrySdk openTelemetrySdk) {
572577
Runtime.getRuntime().addShutdownHook(shutdownHook(openTelemetrySdk));
573578
}
574579

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+
575608
private void maybeSetAsGlobal(
576609
OpenTelemetrySdk openTelemetrySdk, @Nullable Object configProvider) {
577610
if (!setResultAsGlobal) {

0 commit comments

Comments
 (0)