diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java index 7f1a5678959..29eb13a549b 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java @@ -649,8 +649,18 @@ private ConfigProperties computeConfigProperties() { } // Visible for testing + @SuppressWarnings("SystemOut") Thread shutdownHook(OpenTelemetrySdk sdk) { - return new Thread(sdk::close); + return new Thread( + () -> { + try { + sdk.close(); + } catch (Throwable e) { + // https://github.com/open-telemetry/opentelemetry-java/issues/6827 + // logging deps might not be on the classpath at this point + System.out.printf("%s Flush failed during shutdown: %s%n", Level.WARNING, e); + } + }); } private static BiFunction mergeCustomizer( diff --git a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java index 3283cd8af6d..8ed8c578693 100644 --- a/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java +++ b/sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java @@ -10,6 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; @@ -445,6 +446,22 @@ void builder_callAutoConfigureListeners() { verify(listener).afterAutoConfigure(sdk); } + @Test + void builder_catchesException() throws InterruptedException { + OpenTelemetrySdk sdk = mock(OpenTelemetrySdk.class); + doThrow(NoClassDefFoundError.class).when(sdk).close(); + + try { + Thread thread = builder.shutdownHook(sdk); + thread.start(); + thread.join(); + } catch (NoClassDefFoundError e) { + fail("shutdownHook threw unexpected NoClassDefFoundError", e); + } + + verify(sdk).close(); + } + private static Supplier> disableExportPropertySupplier() { Map props = new HashMap<>(); props.put("otel.metrics.exporter", "none");