Skip to content

Commit e7f68ab

Browse files
committed
fix(httpclient): ensure proper closure of HttpClient in shutdown method
Fixes #7388
1 parent a756317 commit e7f68ab

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

exporters/sender/jdk/src/main/java/io/opentelemetry/exporter/sender/jdk/internal/JdkHttpSender.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,13 @@ public CompletableResultCode shutdown() {
390390
if (managedExecutor) {
391391
executorService.shutdown();
392392
}
393+
if (AutoCloseable.class.isInstance(client)) {
394+
try {
395+
AutoCloseable.class.cast(client).close();
396+
} catch (Exception e) {
397+
return CompletableResultCode.ofExceptionalFailure(e);
398+
}
399+
}
393400
return CompletableResultCode.ofSuccess();
394401
}
395402
}

exporters/sender/jdk/src/test/java/io/opentelemetry/exporter/sender/jdk/internal/JdkHttpSenderTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.opentelemetry.exporter.internal.marshal.Serializer;
1919
import io.opentelemetry.sdk.common.export.RetryPolicy;
2020
import java.io.IOException;
21+
import java.lang.reflect.Method;
2122
import java.net.ConnectException;
2223
import java.net.ServerSocket;
2324
import java.net.http.HttpClient;
@@ -29,6 +30,7 @@
2930
import org.assertj.core.api.InstanceOfAssertFactories;
3031
import org.junit.jupiter.api.BeforeEach;
3132
import org.junit.jupiter.api.Test;
33+
import org.junit.jupiter.api.condition.EnabledForJreRange;
3234
import org.junit.jupiter.api.extension.ExtendWith;
3335
import org.mockito.Mock;
3436
import org.mockito.junit.jupiter.MockitoExtension;
@@ -66,6 +68,16 @@ void setup() throws IOException, InterruptedException {
6668
null);
6769
}
6870

71+
@Test
72+
@EnabledForJreRange(
73+
minVersion = 21,
74+
disabledReason = "HttpClient#close has been added in Java 21")
75+
void testShutdown() throws Exception {
76+
sender.shutdown();
77+
Method close = HttpClient.class.getMethod("close");
78+
close.invoke(verify(mockHttpClient));
79+
}
80+
6981
@Test
7082
void sendInternal_RetryableConnectTimeoutException() throws IOException, InterruptedException {
7183
assertThatThrownBy(() -> sender.sendInternal(new NoOpMarshaler()))

0 commit comments

Comments
 (0)