Skip to content

Commit 6d9f4d8

Browse files
[release/v1.23.x] Fix autoconfigure shutdown hook (#5225)
* Fix autoconfigure shutdown hook (#5221) * Fix autoconfigure shutdown hook * Add unit test * Add changelog entry --------- Co-authored-by: jack-berg <[email protected]> Co-authored-by: Jack Berg <[email protected]>
1 parent a295066 commit 6d9f4d8

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
* Fix bug that broke `AutoConfiguredOpenTelemetrySdk`'s shutdown hook.
6+
([#5221](https://github.com/open-telemetry/opentelemetry-java/pull/5221))
7+
38
## Version 1.23.0 (2023-02-10)
49

510
This release is a notable release for metrics:

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -378,10 +378,6 @@ public AutoConfiguredOpenTelemetrySdk build() {
378378
SdkLoggerProvider loggerProvider = loggerProviderBuilder.build();
379379
closeables.add(loggerProvider);
380380

381-
if (registerShutdownHook) {
382-
Runtime.getRuntime().addShutdownHook(new Thread(openTelemetrySdk::close));
383-
}
384-
385381
ContextPropagators propagators =
386382
PropagatorConfiguration.configurePropagators(
387383
config, serviceClassLoader, propagatorCustomizer);
@@ -396,6 +392,11 @@ public AutoConfiguredOpenTelemetrySdk build() {
396392
openTelemetrySdk = sdkBuilder.build();
397393
}
398394

395+
// NOTE: Shutdown hook registration is untested. Modify with caution.
396+
if (registerShutdownHook) {
397+
Runtime.getRuntime().addShutdownHook(shutdownHook(openTelemetrySdk));
398+
}
399+
399400
if (setResultAsGlobal) {
400401
GlobalOpenTelemetry.set(openTelemetrySdk);
401402
GlobalLoggerProvider.set(openTelemetrySdk.getSdkLoggerProvider());
@@ -456,6 +457,11 @@ private ConfigProperties computeConfigProperties() {
456457
return properties;
457458
}
458459

460+
// Visible for testing
461+
Thread shutdownHook(OpenTelemetrySdk sdk) {
462+
return new Thread(sdk::close);
463+
}
464+
459465
private static <I, O1, O2> BiFunction<I, ConfigProperties, O2> mergeCustomizer(
460466
BiFunction<? super I, ConfigProperties, ? extends O1> first,
461467
BiFunction<? super O1, ConfigProperties, ? extends O2> second) {

sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/AutoConfiguredOpenTelemetrySdkTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import static org.assertj.core.api.Assertions.assertThat;
1111
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1212
import static org.mockito.ArgumentMatchers.any;
13+
import static org.mockito.Mockito.doReturn;
1314
import static org.mockito.Mockito.doThrow;
1415
import static org.mockito.Mockito.mock;
1516
import static org.mockito.Mockito.never;
1617
import static org.mockito.Mockito.spy;
18+
import static org.mockito.Mockito.times;
1719
import static org.mockito.Mockito.verify;
1820
import static org.mockito.Mockito.when;
1921

@@ -374,6 +376,29 @@ void builder_setResultAsGlobalTrue() {
374376
.isSameAs(openTelemetry.getSdkLoggerProvider());
375377
}
376378

379+
@Test
380+
void builder_registersShutdownHook() {
381+
builder = spy(builder);
382+
Thread thread = new Thread();
383+
doReturn(thread).when(builder).shutdownHook(any());
384+
385+
OpenTelemetrySdk sdk = builder.setResultAsGlobal(false).build().getOpenTelemetrySdk();
386+
387+
verify(builder, times(1)).shutdownHook(sdk);
388+
assertThat(Runtime.getRuntime().removeShutdownHook(thread)).isTrue();
389+
}
390+
391+
@Test
392+
void shutdownHook() throws InterruptedException {
393+
OpenTelemetrySdk sdk = mock(OpenTelemetrySdk.class);
394+
395+
Thread thread = builder.shutdownHook(sdk);
396+
thread.start();
397+
thread.join();
398+
399+
verify(sdk).close();
400+
}
401+
377402
private static Supplier<Map<String, String>> disableExportPropertySupplier() {
378403
Map<String, String> props = new HashMap<>();
379404
props.put("otel.metrics.exporter", "none");

0 commit comments

Comments
 (0)