From b00bf829d7143545dad4526faca9d076bac709fc Mon Sep 17 00:00:00 2001 From: Brenden Ehlers Date: Thu, 8 May 2025 21:01:48 -0600 Subject: [PATCH 1/9] change exception logging when running in maven --- .../AutoConfiguredOpenTelemetrySdkBuilder.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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 e12848f0d81..ab176935a10 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 @@ -60,6 +60,7 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur private static final Logger logger = Logger.getLogger(AutoConfiguredOpenTelemetrySdkBuilder.class.getName()); private static final boolean INCUBATOR_AVAILABLE; + private static final Boolean IS_MAVEN; static { boolean incubatorAvailable = false; @@ -73,6 +74,7 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur // Not available } INCUBATOR_AVAILABLE = incubatorAvailable; + IS_MAVEN = System.getProperty("maven.home") != null; } @Nullable private ConfigProperties config; @@ -629,7 +631,19 @@ private ConfigProperties computeConfigProperties() { // Visible for testing Thread shutdownHook(OpenTelemetrySdk sdk) { - return new Thread(sdk::close); + return new Thread( + () -> { + try { + sdk.close(); + } catch (NoClassDefFoundError e) { + if (IS_MAVEN) { + // do something useful + logger.log(Level.WARNING, "Flush failed during shutdown", e); + return; + } + throw e; + } + }); } private static BiFunction mergeCustomizer( From 6ae5cf9d006db1246a77b6eac53382a531ebeccb Mon Sep 17 00:00:00 2001 From: Brenden Ehlers Date: Fri, 9 May 2025 06:35:21 -0600 Subject: [PATCH 2/9] add test --- .../AutoConfiguredOpenTelemetrySdkTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 c7ae65de9a0..327fd1f558d 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 @@ -73,6 +73,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; +import org.junitpioneer.jupiter.SetSystemProperty; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; @@ -431,6 +432,20 @@ void builder_callAutoConfigureListeners() { verify(listener).afterAutoConfigure(sdk); } + @Test + @SetSystemProperty(key = "maven.home", value = "temp") + void builder_catchesException() throws InterruptedException { + OpenTelemetrySdk sdk = mock(OpenTelemetrySdk.class); + doThrow(NoClassDefFoundError.class).when(sdk).close(); + + Thread thread = builder.shutdownHook(sdk); + thread.start(); + thread.join(); + + verify(sdk).close(); + logs.assertContains("Flush failed during shutdown"); + } + private static Supplier> disableExportPropertySupplier() { Map props = new HashMap<>(); props.put("otel.metrics.exporter", "none"); From 6f63548259a0de945318647a50db50ace7d93506 Mon Sep 17 00:00:00 2001 From: Brenden Ehlers Date: Fri, 9 May 2025 17:00:04 -0600 Subject: [PATCH 3/9] use system.out instead of logger --- .../AutoConfiguredOpenTelemetrySdkBuilder.java | 6 ++++-- .../AutoConfiguredOpenTelemetrySdkTest.java | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) 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 ab176935a10..7efaa47fbd3 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 @@ -630,6 +630,7 @@ private ConfigProperties computeConfigProperties() { } // Visible for testing + @SuppressWarnings("SystemOut") Thread shutdownHook(OpenTelemetrySdk sdk) { return new Thread( () -> { @@ -637,8 +638,9 @@ Thread shutdownHook(OpenTelemetrySdk sdk) { sdk.close(); } catch (NoClassDefFoundError e) { if (IS_MAVEN) { - // do something useful - logger.log(Level.WARNING, "Flush failed during shutdown", e); + // logging deps might not be on the classpath at this point + System.out.printf( + "%s Flush failed during shutdown: %s\n", Level.WARNING, e.getMessage()); return; } throw e; 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 327fd1f558d..4fb894b2370 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; @@ -438,12 +439,15 @@ void builder_catchesException() throws InterruptedException { OpenTelemetrySdk sdk = mock(OpenTelemetrySdk.class); doThrow(NoClassDefFoundError.class).when(sdk).close(); - Thread thread = builder.shutdownHook(sdk); - thread.start(); - thread.join(); + try { + Thread thread = builder.shutdownHook(sdk); + thread.start(); + thread.join(); + } catch (NoClassDefFoundError e) { + fail("shutdownHook threw unexpected NoClassDefFoundError", e); + } verify(sdk).close(); - logs.assertContains("Flush failed during shutdown"); } private static Supplier> disableExportPropertySupplier() { From a1ba77f647dfe0990b329ac365d21dcaf7a44418 Mon Sep 17 00:00:00 2001 From: Brenden Ehlers Date: Fri, 9 May 2025 17:12:48 -0600 Subject: [PATCH 4/9] update error message --- .../autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 7efaa47fbd3..296c37c5d26 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 @@ -639,8 +639,7 @@ Thread shutdownHook(OpenTelemetrySdk sdk) { } catch (NoClassDefFoundError e) { if (IS_MAVEN) { // logging deps might not be on the classpath at this point - System.out.printf( - "%s Flush failed during shutdown: %s\n", Level.WARNING, e.getMessage()); + System.out.printf("%s Flush failed during shutdown: %s%n", Level.WARNING, e); return; } throw e; From bd57cf161cadd71e624ab0fdf99efd16aa12a0a1 Mon Sep 17 00:00:00 2001 From: Brenden Ehlers Date: Sat, 10 May 2025 14:29:47 -0600 Subject: [PATCH 5/9] add issue documentation --- .../sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java | 1 + 1 file changed, 1 insertion(+) 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 296c37c5d26..3890e7ebdd4 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 @@ -637,6 +637,7 @@ Thread shutdownHook(OpenTelemetrySdk sdk) { try { sdk.close(); } catch (NoClassDefFoundError e) { + // https://github.com/open-telemetry/opentelemetry-java/issues/6827 if (IS_MAVEN) { // logging deps might not be on the classpath at this point System.out.printf("%s Flush failed during shutdown: %s%n", Level.WARNING, e); From 6fa723b6a2831fa2ea33861c11a3e8ffd2fc54e4 Mon Sep 17 00:00:00 2001 From: Brenden Ehlers Date: Thu, 21 Aug 2025 20:50:48 -0600 Subject: [PATCH 6/9] remove maven-specific code --- .../AutoConfiguredOpenTelemetrySdkBuilder.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) 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 3890e7ebdd4..a71051f4925 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 @@ -60,7 +60,6 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur private static final Logger logger = Logger.getLogger(AutoConfiguredOpenTelemetrySdkBuilder.class.getName()); private static final boolean INCUBATOR_AVAILABLE; - private static final Boolean IS_MAVEN; static { boolean incubatorAvailable = false; @@ -74,7 +73,6 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur // Not available } INCUBATOR_AVAILABLE = incubatorAvailable; - IS_MAVEN = System.getProperty("maven.home") != null; } @Nullable private ConfigProperties config; @@ -638,12 +636,9 @@ Thread shutdownHook(OpenTelemetrySdk sdk) { sdk.close(); } catch (NoClassDefFoundError e) { // https://github.com/open-telemetry/opentelemetry-java/issues/6827 - if (IS_MAVEN) { - // logging deps might not be on the classpath at this point - System.out.printf("%s Flush failed during shutdown: %s%n", Level.WARNING, e); - return; - } - throw e; + // logging deps might not be on the classpath at this point + System.out.printf("%s Flush failed during shutdown: %s%n", Level.WARNING, e); + return; } }); } From 051b0eb187cc74b5870d94b1ac16dcc0026fa919 Mon Sep 17 00:00:00 2001 From: Brenden Ehlers Date: Thu, 21 Aug 2025 21:00:57 -0600 Subject: [PATCH 7/9] clean up remaining code --- .../sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java | 1 - .../sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java | 1 - 2 files changed, 2 deletions(-) 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 a71051f4925..9d97b49a862 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 @@ -638,7 +638,6 @@ Thread shutdownHook(OpenTelemetrySdk sdk) { // 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); - return; } }); } 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 4fb894b2370..deb1216ec80 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 @@ -434,7 +434,6 @@ void builder_callAutoConfigureListeners() { } @Test - @SetSystemProperty(key = "maven.home", value = "temp") void builder_catchesException() throws InterruptedException { OpenTelemetrySdk sdk = mock(OpenTelemetrySdk.class); doThrow(NoClassDefFoundError.class).when(sdk).close(); From 92f76492819beac76530ee1256545b03a9393793 Mon Sep 17 00:00:00 2001 From: Brenden Ehlers Date: Thu, 21 Aug 2025 21:07:49 -0600 Subject: [PATCH 8/9] remove unused import --- .../sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java | 1 - 1 file changed, 1 deletion(-) 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 deb1216ec80..5dc450eeb3f 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 @@ -74,7 +74,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; -import org.junitpioneer.jupiter.SetSystemProperty; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; From 85718a0dcdbb247d137bb2db1a05f99e549bd53e Mon Sep 17 00:00:00 2001 From: Brenden Ehlers Date: Wed, 24 Sep 2025 10:18:39 -0600 Subject: [PATCH 9/9] update to throwable --- .../autoconfigure/AutoConfiguredOpenTelemetrySdkBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 79f7a652d61..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 @@ -655,7 +655,7 @@ Thread shutdownHook(OpenTelemetrySdk sdk) { () -> { try { sdk.close(); - } catch (NoClassDefFoundError e) { + } 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);