Skip to content

Commit 902d68c

Browse files
authored
Add connectTimeout configuration option OtlpHttp{Signal}Exporters (#5941)
1 parent 2b33f9f commit 902d68c

File tree

21 files changed

+236
-13
lines changed

21 files changed

+236
-13
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,13 @@
11
Comparing source compatibility of against
2-
No changes.
2+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder (not serializable)
3+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
4+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder setConnectTimeout(long, java.util.concurrent.TimeUnit)
5+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder setConnectTimeout(java.time.Duration)
6+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder (not serializable)
7+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
8+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder setConnectTimeout(long, java.util.concurrent.TimeUnit)
9+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder setConnectTimeout(java.time.Duration)
10+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder (not serializable)
11+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
12+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder setConnectTimeout(long, java.util.concurrent.TimeUnit)
13+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder setConnectTimeout(java.time.Duration)

exporters/common/src/main/java/io/opentelemetry/exporter/internal/http/HttpExporterBuilder.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import io.opentelemetry.exporter.internal.marshal.Marshaler;
1515
import io.opentelemetry.sdk.common.export.RetryPolicy;
1616
import java.net.URI;
17-
import java.time.Duration;
1817
import java.util.Collections;
1918
import java.util.HashMap;
2019
import java.util.Map;
@@ -37,6 +36,7 @@
3736
@SuppressWarnings("checkstyle:JavadocMethod")
3837
public final class HttpExporterBuilder<T extends Marshaler> {
3938
public static final long DEFAULT_TIMEOUT_SECS = 10;
39+
public static final long DEFAULT_CONNECT_TIMEOUT_SECS = 10;
4040

4141
private static final Logger LOGGER = Logger.getLogger(HttpExporterBuilder.class.getName());
4242

@@ -46,6 +46,7 @@ public final class HttpExporterBuilder<T extends Marshaler> {
4646
private String endpoint;
4747

4848
private long timeoutNanos = TimeUnit.SECONDS.toNanos(DEFAULT_TIMEOUT_SECS);
49+
private long connectTimeoutNanos = TimeUnit.SECONDS.toNanos(DEFAULT_CONNECT_TIMEOUT_SECS);
4950
private boolean compressionEnabled = false;
5051
private boolean exportAsJson = false;
5152
@Nullable private Map<String, String> headers;
@@ -67,8 +68,9 @@ public HttpExporterBuilder<T> setTimeout(long timeout, TimeUnit unit) {
6768
return this;
6869
}
6970

70-
public HttpExporterBuilder<T> setTimeout(Duration timeout) {
71-
return setTimeout(timeout.toNanos(), TimeUnit.NANOSECONDS);
71+
public HttpExporterBuilder<T> setConnectTimeout(long timeout, TimeUnit unit) {
72+
connectTimeoutNanos = unit.toNanos(timeout);
73+
return this;
7274
}
7375

7476
public HttpExporterBuilder<T> setEndpoint(String endpoint) {
@@ -132,6 +134,7 @@ public HttpExporterBuilder<T> copy() {
132134
HttpExporterBuilder<T> copy = new HttpExporterBuilder<>(exporterName, type, endpoint);
133135
copy.endpoint = endpoint;
134136
copy.timeoutNanos = timeoutNanos;
137+
copy.connectTimeoutNanos = connectTimeoutNanos;
135138
copy.exportAsJson = exportAsJson;
136139
copy.compressionEnabled = compressionEnabled;
137140
if (headers != null) {
@@ -157,6 +160,7 @@ public HttpExporter<T> build() {
157160
compressionEnabled,
158161
exportAsJson ? "application/json" : "application/x-protobuf",
159162
timeoutNanos,
163+
connectTimeoutNanos,
160164
headerSupplier,
161165
authenticator,
162166
retryPolicy,
@@ -176,6 +180,7 @@ public String toString(boolean includePrefixAndSuffix) {
176180
joiner.add("type=" + type);
177181
joiner.add("endpoint=" + endpoint);
178182
joiner.add("timeoutNanos=" + timeoutNanos);
183+
joiner.add("connectTimeoutNanos=" + connectTimeoutNanos);
179184
joiner.add("compressionEnabled=" + compressionEnabled);
180185
joiner.add("exportAsJson=" + exportAsJson);
181186
if (headers != null) {

exporters/common/src/main/java/io/opentelemetry/exporter/internal/http/HttpSenderProvider.java

+2
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@
2323
public interface HttpSenderProvider {
2424

2525
/** Returns a {@link HttpSender} configured with the provided parameters. */
26+
@SuppressWarnings("TooManyParameters")
2627
HttpSender createSender(
2728
String endpoint,
2829
boolean compressionEnabled,
2930
String contentType,
3031
long timeoutNanos,
32+
long connectTimeout,
3133
Supplier<Map<String, String>> headerSupplier,
3234
@Nullable Authenticator authenticator,
3335
@Nullable RetryPolicy retryPolicy,

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java

+20
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,26 @@ public OtlpHttpLogRecordExporterBuilder setTimeout(Duration timeout) {
6060
return setTimeout(timeout.toNanos(), TimeUnit.NANOSECONDS);
6161
}
6262

63+
/**
64+
* Sets the maximum time to wait for new connections to be established. If unset, defaults to
65+
* {@value HttpExporterBuilder#DEFAULT_CONNECT_TIMEOUT_SECS}s.
66+
*/
67+
public OtlpHttpLogRecordExporterBuilder setConnectTimeout(long timeout, TimeUnit unit) {
68+
requireNonNull(unit, "unit");
69+
checkArgument(timeout >= 0, "timeout must be non-negative");
70+
delegate.setConnectTimeout(timeout, unit);
71+
return this;
72+
}
73+
74+
/**
75+
* Sets the maximum time to wait for new connections to be established. If unset, defaults to
76+
* {@value HttpExporterBuilder#DEFAULT_CONNECT_TIMEOUT_SECS}s.
77+
*/
78+
public OtlpHttpLogRecordExporterBuilder setConnectTimeout(Duration timeout) {
79+
requireNonNull(timeout, "timeout");
80+
return setConnectTimeout(timeout.toNanos(), TimeUnit.NANOSECONDS);
81+
}
82+
6383
/**
6484
* Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT}. The
6585
* endpoint must start with either http:// or https://, and include the full HTTP path.

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java

+20
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,26 @@ public OtlpHttpMetricExporterBuilder setTimeout(Duration timeout) {
7171
return setTimeout(timeout.toNanos(), TimeUnit.NANOSECONDS);
7272
}
7373

74+
/**
75+
* Sets the maximum time to wait for new connections to be established. If unset, defaults to
76+
* {@value HttpExporterBuilder#DEFAULT_CONNECT_TIMEOUT_SECS}s.
77+
*/
78+
public OtlpHttpMetricExporterBuilder setConnectTimeout(long timeout, TimeUnit unit) {
79+
requireNonNull(unit, "unit");
80+
checkArgument(timeout >= 0, "timeout must be non-negative");
81+
delegate.setConnectTimeout(timeout, unit);
82+
return this;
83+
}
84+
85+
/**
86+
* Sets the maximum time to wait for new connections to be established. If unset, defaults to
87+
* {@value HttpExporterBuilder#DEFAULT_CONNECT_TIMEOUT_SECS}s.
88+
*/
89+
public OtlpHttpMetricExporterBuilder setConnectTimeout(Duration timeout) {
90+
requireNonNull(timeout, "timeout");
91+
return setConnectTimeout(timeout.toNanos(), TimeUnit.NANOSECONDS);
92+
}
93+
7494
/**
7595
* Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT}. The
7696
* endpoint must start with either http:// or https://, and include the full HTTP path.

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java

+20
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,26 @@ public OtlpHttpSpanExporterBuilder setTimeout(Duration timeout) {
6060
return setTimeout(timeout.toNanos(), TimeUnit.NANOSECONDS);
6161
}
6262

63+
/**
64+
* Sets the maximum time to wait for new connections to be established. If unset, defaults to
65+
* {@value HttpExporterBuilder#DEFAULT_CONNECT_TIMEOUT_SECS}s.
66+
*/
67+
public OtlpHttpSpanExporterBuilder setConnectTimeout(long timeout, TimeUnit unit) {
68+
requireNonNull(unit, "unit");
69+
checkArgument(timeout >= 0, "timeout must be non-negative");
70+
delegate.setConnectTimeout(timeout, unit);
71+
return this;
72+
}
73+
74+
/**
75+
* Sets the maximum time to wait for new connections to be established. If unset, defaults to
76+
* {@value HttpExporterBuilder#DEFAULT_CONNECT_TIMEOUT_SECS}s.
77+
*/
78+
public OtlpHttpSpanExporterBuilder setConnectTimeout(Duration timeout) {
79+
requireNonNull(timeout, "timeout");
80+
return setConnectTimeout(timeout.toNanos(), TimeUnit.NANOSECONDS);
81+
}
82+
6383
/**
6484
* Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT}. The
6585
* endpoint must start with either http:// or https://, and include the full HTTP path.

exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractHttpTelemetryExporterTest.java

+49
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,28 @@ public Stream<? extends Arguments> provideArguments(ExtensionContext context) th
464464
}
465465
}
466466

467+
@Test
468+
@SuppressLogger(HttpExporter.class)
469+
void connectTimeout() {
470+
TelemetryExporter<T> exporter =
471+
exporterBuilder()
472+
// Connecting to a non-routable IP address to trigger connection error
473+
.setEndpoint("http://10.255.255.1")
474+
.setConnectTimeout(Duration.ofMillis(1))
475+
.build();
476+
try {
477+
long startTimeMillis = System.currentTimeMillis();
478+
CompletableResultCode result =
479+
exporter.export(Collections.singletonList(generateFakeTelemetry()));
480+
assertThat(result.join(10, TimeUnit.SECONDS).isSuccess()).isFalse();
481+
// Assert that the export request fails well before the default connect timeout of 10s
482+
assertThat(System.currentTimeMillis() - startTimeMillis)
483+
.isLessThan(TimeUnit.SECONDS.toMillis(1));
484+
} finally {
485+
exporter.shutdown();
486+
}
487+
}
488+
467489
@Test
468490
void deadlineSetPerExport() throws InterruptedException {
469491
TelemetryExporter<T> exporter =
@@ -602,6 +624,15 @@ void validConfig() {
602624
assertThatCode(() -> exporterBuilder().setTimeout(Duration.ofMillis(10)))
603625
.doesNotThrowAnyException();
604626

627+
assertThatCode(() -> exporterBuilder().setConnectTimeout(0, TimeUnit.MILLISECONDS))
628+
.doesNotThrowAnyException();
629+
assertThatCode(() -> exporterBuilder().setConnectTimeout(Duration.ofMillis(0)))
630+
.doesNotThrowAnyException();
631+
assertThatCode(() -> exporterBuilder().setConnectTimeout(10, TimeUnit.MILLISECONDS))
632+
.doesNotThrowAnyException();
633+
assertThatCode(() -> exporterBuilder().setConnectTimeout(Duration.ofMillis(10)))
634+
.doesNotThrowAnyException();
635+
605636
assertThatCode(() -> exporterBuilder().setEndpoint("http://localhost:4318"))
606637
.doesNotThrowAnyException();
607638
assertThatCode(() -> exporterBuilder().setEndpoint("http://localhost/"))
@@ -635,6 +666,16 @@ void invalidConfig() {
635666
.isInstanceOf(NullPointerException.class)
636667
.hasMessage("timeout");
637668

669+
assertThatThrownBy(() -> exporterBuilder().setConnectTimeout(-1, TimeUnit.MILLISECONDS))
670+
.isInstanceOf(IllegalArgumentException.class)
671+
.hasMessage("timeout must be non-negative");
672+
assertThatThrownBy(() -> exporterBuilder().setConnectTimeout(1, null))
673+
.isInstanceOf(NullPointerException.class)
674+
.hasMessage("unit");
675+
assertThatThrownBy(() -> exporterBuilder().setConnectTimeout(null))
676+
.isInstanceOf(NullPointerException.class)
677+
.hasMessage("timeout");
678+
638679
assertThatThrownBy(() -> exporterBuilder().setEndpoint(null))
639680
.isInstanceOf(NullPointerException.class)
640681
.hasMessage("endpoint");
@@ -666,6 +707,7 @@ void toBuilderEquality()
666707
TelemetryExporter<T> exporter =
667708
exporterBuilder()
668709
.setTimeout(Duration.ofSeconds(5))
710+
.setConnectTimeout(Duration.ofSeconds(4))
669711
.setEndpoint("http://localhost:4318")
670712
.setCompression("gzip")
671713
.addHeader("foo", "bar")
@@ -728,6 +770,9 @@ void stringRepresentation() throws IOException, CertificateEncodingException {
728770
+ "timeoutNanos="
729771
+ TimeUnit.SECONDS.toNanos(10)
730772
+ ", "
773+
+ "connectTimeoutNanos="
774+
+ TimeUnit.SECONDS.toNanos(10)
775+
+ ", "
731776
+ "compressionEnabled=false, "
732777
+ "exportAsJson=false, "
733778
+ "headers=Headers\\{User-Agent=OBFUSCATED\\}"
@@ -739,6 +784,7 @@ void stringRepresentation() throws IOException, CertificateEncodingException {
739784
telemetryExporter =
740785
exporterBuilder()
741786
.setTimeout(Duration.ofSeconds(5))
787+
.setConnectTimeout(Duration.ofSeconds(4))
742788
.setEndpoint("http://example:4318/v1/logs")
743789
.setCompression("gzip")
744790
.addHeader("foo", "bar")
@@ -764,6 +810,9 @@ void stringRepresentation() throws IOException, CertificateEncodingException {
764810
+ "timeoutNanos="
765811
+ TimeUnit.SECONDS.toNanos(5)
766812
+ ", "
813+
+ "connectTimeoutNanos="
814+
+ TimeUnit.SECONDS.toNanos(4)
815+
+ ", "
767816
+ "compressionEnabled=true, "
768817
+ "exportAsJson=false, "
769818
+ "headers=Headers\\{.*foo=OBFUSCATED.*\\}, "

exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcLogRecordExporterBuilderWrapper.java

+10
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ public TelemetryExporterBuilder<LogRecordData> setTimeout(Duration timeout) {
4040
return this;
4141
}
4242

43+
@Override
44+
public TelemetryExporterBuilder<LogRecordData> setConnectTimeout(long timeout, TimeUnit unit) {
45+
throw new UnsupportedOperationException();
46+
}
47+
48+
@Override
49+
public TelemetryExporterBuilder<LogRecordData> setConnectTimeout(Duration timeout) {
50+
throw new UnsupportedOperationException();
51+
}
52+
4353
@Override
4454
public TelemetryExporterBuilder<LogRecordData> setCompression(String compression) {
4555
builder.setCompression(compression);

exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcMetricExporterBuilderWrapper.java

+10
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ public TelemetryExporterBuilder<MetricData> setTimeout(Duration timeout) {
4040
return this;
4141
}
4242

43+
@Override
44+
public TelemetryExporterBuilder<MetricData> setConnectTimeout(long timeout, TimeUnit unit) {
45+
throw new UnsupportedOperationException();
46+
}
47+
48+
@Override
49+
public TelemetryExporterBuilder<MetricData> setConnectTimeout(Duration timeout) {
50+
throw new UnsupportedOperationException();
51+
}
52+
4353
@Override
4454
public TelemetryExporterBuilder<MetricData> setCompression(String compression) {
4555
builder.setCompression(compression);

exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcSpanExporterBuilderWrapper.java

+10
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ public TelemetryExporterBuilder<SpanData> setTimeout(Duration timeout) {
4141
return this;
4242
}
4343

44+
@Override
45+
public TelemetryExporterBuilder<SpanData> setConnectTimeout(long timeout, TimeUnit unit) {
46+
throw new UnsupportedOperationException();
47+
}
48+
49+
@Override
50+
public TelemetryExporterBuilder<SpanData> setConnectTimeout(Duration timeout) {
51+
throw new UnsupportedOperationException();
52+
}
53+
4454
@Override
4555
public TelemetryExporterBuilder<SpanData> setCompression(String compression) {
4656
builder.setCompression(compression);

exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpLogRecordExporterBuilderWrapper.java

+12
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@ public TelemetryExporterBuilder<LogRecordData> setTimeout(Duration timeout) {
4141
return this;
4242
}
4343

44+
@Override
45+
public TelemetryExporterBuilder<LogRecordData> setConnectTimeout(long timeout, TimeUnit unit) {
46+
builder.setConnectTimeout(timeout, unit);
47+
return this;
48+
}
49+
50+
@Override
51+
public TelemetryExporterBuilder<LogRecordData> setConnectTimeout(Duration timeout) {
52+
builder.setConnectTimeout(timeout);
53+
return this;
54+
}
55+
4456
@Override
4557
public TelemetryExporterBuilder<LogRecordData> setCompression(String compression) {
4658
builder.setCompression(compression);

exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpMetricExporterBuilderWrapper.java

+12
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ public TelemetryExporterBuilder<MetricData> setTimeout(Duration timeout) {
4040
return this;
4141
}
4242

43+
@Override
44+
public TelemetryExporterBuilder<MetricData> setConnectTimeout(long timeout, TimeUnit unit) {
45+
builder.setConnectTimeout(timeout, unit);
46+
return this;
47+
}
48+
49+
@Override
50+
public TelemetryExporterBuilder<MetricData> setConnectTimeout(Duration timeout) {
51+
builder.setConnectTimeout(timeout);
52+
return this;
53+
}
54+
4355
@Override
4456
public TelemetryExporterBuilder<MetricData> setCompression(String compression) {
4557
builder.setCompression(compression);

exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpSpanExporterBuilderWrapper.java

+12
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ public TelemetryExporterBuilder<SpanData> setTimeout(Duration timeout) {
4040
return this;
4141
}
4242

43+
@Override
44+
public TelemetryExporterBuilder<SpanData> setConnectTimeout(long timeout, TimeUnit unit) {
45+
builder.setConnectTimeout(timeout, unit);
46+
return this;
47+
}
48+
49+
@Override
50+
public TelemetryExporterBuilder<SpanData> setConnectTimeout(Duration timeout) {
51+
builder.setConnectTimeout(timeout);
52+
return this;
53+
}
54+
4355
@Override
4456
public TelemetryExporterBuilder<SpanData> setCompression(String compression) {
4557
builder.setCompression(compression);

exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java

+12
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,18 @@ public TelemetryExporterBuilder<T> setTimeout(Duration timeout) {
7676
return this;
7777
}
7878

79+
@Override
80+
public TelemetryExporterBuilder<T> setConnectTimeout(long timeout, TimeUnit unit) {
81+
delegate.setConnectTimeout(timeout, unit);
82+
return this;
83+
}
84+
85+
@Override
86+
public TelemetryExporterBuilder<T> setConnectTimeout(Duration timeout) {
87+
delegate.setConnectTimeout(timeout);
88+
return this;
89+
}
90+
7991
@Override
8092
public TelemetryExporterBuilder<T> setCompression(String compression) {
8193
delegate.setCompression(compression);

0 commit comments

Comments
 (0)