-
Notifications
You must be signed in to change notification settings - Fork 910
Description
Describe the bug
OTLP JDK HTTP sender uses a non-daemon thread, which can prevent shutdown of the JVM.
Steps to reproduce
Run a Java application that uses OTel to produce telemetry data, configured with:
-Dotel.traces.exporter=otlp
-Dotel.exporter.otlp.protocol=http/protobuf
What did you expect to see?
No non-daemon threads are created by the OpenTelemetry SDK, allowing the JVM the shutdown cleanly.
What did you see instead?
A non-daemon thread is created in the JdkHttpSender class:
Thread=pool-1-thread-1 (000000513938A760) Status=Parked
at jdk/internal/misc/Unsafe.park(ZJ)V (Native Method)
at java/util/concurrent/locks/LockSupport.park(Ljava/lang/Object;)V (LockSupport.java:211)
at java/util/concurrent/CompletableFuture$Signaller.block()Z (CompletableFuture.java:1864) at java/util/concurrent/ForkJoinPool.unmanagedBlock(Ljava/util/concurrent/ForkJoinPool$ManagedBlocker;)V (ForkJoinPool.java:3465)
at java/util/concurrent/ForkJoinPool.managedBlock(Ljava/util/concurrent/ForkJoinPool$ManagedBlocker;)V (ForkJoinPool.java:3436)
at java/util/concurrent/CompletableFuture.waitingGet(Z)Ljava/lang/Object; (CompletableFuture.java:1898)
at java/util/concurrent/CompletableFuture.get()Ljava/lang/Object; (CompletableFuture.java:2072)
at jdk/internal/net/http/HttpClientImpl.send(Ljava/net/http/HttpRequest;Ljava/net/http/HttpResponse$BodyHandler;)Ljava/net/http/HttpResponse; (HttpClientImpl.java:554)
at jdk/internal/net/http/HttpClientFacade.send(Ljava/net/http/HttpRequest;Ljava/net/http/HttpResponse$BodyHandler;)Ljava/net/http/HttpResponse; (HttpClientFacade.java:123)
at io/opentelemetry/exporter/sender/jdk/internal/JdkHttpSender.sendRequest(Ljava/net/http/HttpRequest$Builder;Lio/opentelemetry/exporter/sender/jdk/internal/JdkHttpSender$ByteBufferPool;)Ljava/net/http/HttpResponse; (JdkHttpSender.java:298)
at io/opentelemetry/exporter/sender/jdk/internal/JdkHttpSender.sendInternal(Lio/opentelemetry/exporter/internal/marshal/Marshaler;)Ljava/net/http/HttpResponse; (JdkHttpSender.java:236)
at io/opentelemetry/exporter/sender/jdk/internal/JdkHttpSender.lambda$send$1(Lio/opentelemetry/exporter/internal/marshal/Marshaler;)Ljava/net/http/HttpResponse; (JdkHttpSender.java:161)
at io/opentelemetry/exporter/sender/jdk/internal/JdkHttpSender$$Lambda$291/0x0000000000000000.get()Ljava/lang/Object; (Bytecode PC: 8)
at java/util/concurrent/CompletableFuture$AsyncSupply.run()V (CompletableFuture.java:1768)
at java/util/concurrent/ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V (ThreadPoolExecutor.java:1136) (Compiled Code)
at java/util/concurrent/ThreadPoolExecutor$Worker.run()V (ThreadPoolExecutor.java:635)
at java/lang/Thread.run()V (Thread.java:853)
What version and what artifacts are you using?
Artifacts: opentelemetry-api, opentelemetry-sdk, opentelemetry-exporter-otlp, opentelemetry-exporter-sender-jdk, opentelemetry-sdk-extension-autoconfigure
Version: v1.49.0
How did you reference these artifacts? JARs downloaded from Maven Central
Environment
Compiler: IBM Semeru Runtime Certified Edition 17.0.9.0 (build 17.0.9+9)
OS: Windows 11
Runtime (if different from JDK above): IBM Semeru Runtime Certified Edition for z/OS 17.0.14.0 (build 17.0.14+7)
OS (if different from OS compiled on): z/OS
Additional context
Add any other context about the problem here.