diff --git a/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/IOeExceptionInterceptor.java b/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/IOeExceptionInterceptor.java new file mode 100644 index 00000000000..a80a65a01a3 --- /dev/null +++ b/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/IOeExceptionInterceptor.java @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.exporter.sender.okhttp.internal; + +import java.io.IOException; +import okhttp3.Interceptor; +import okhttp3.Response; +import org.jetbrains.annotations.NotNull; + +/** + * Unwrapper of IOExceptions generated by the OkHttp requests. + * + *

This class is internal and is hence not for public use. Its APIs are unstable and can change + * at any time. + */ +public class IOeExceptionInterceptor implements Interceptor { + @NotNull + @Override + public Response intercept(@NotNull Chain chain) throws IOException { + try { + return chain.proceed(chain.request()); + } catch (Throwable e) { + Throwable exceptionCause = e.getCause(); + if (exceptionCause instanceof IOException) { + throw (IOException) exceptionCause; + } + throw e; + } + } +} diff --git a/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java b/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java index 24ade7fae5a..779cd720c9a 100644 --- a/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java +++ b/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java @@ -82,6 +82,7 @@ public OkHttpGrpcSender( new OkHttpClient.Builder() .dispatcher(OkHttpUtil.newDispatcher()) .callTimeout(Duration.ofNanos(timeoutNanos)); + clientBuilder.addInterceptor(new IOeExceptionInterceptor()); if (retryPolicy != null) { clientBuilder.addInterceptor( new RetryInterceptor(retryPolicy, OkHttpGrpcSender::isRetryable)); diff --git a/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpHttpSender.java b/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpHttpSender.java index 337a722a06d..e23da3a6c79 100644 --- a/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpHttpSender.java +++ b/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpHttpSender.java @@ -77,6 +77,7 @@ public OkHttpHttpSender( }); } + builder.addInterceptor(new IOeExceptionInterceptor()); if (retryPolicy != null) { builder.addInterceptor(new RetryInterceptor(retryPolicy, OkHttpHttpSender::isRetryable)); }