Skip to content

Commit 3938d96

Browse files
authored
Manual cherrypick for commits 8bbb0e2, b287318 (#4104)
1 parent 8967558 commit 3938d96

File tree

15 files changed

+180
-47
lines changed

15 files changed

+180
-47
lines changed

exporters/otlp/common/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ dependencies {
4343
testImplementation("com.linecorp.armeria:armeria-junit5")
4444
testImplementation("io.opentelemetry.proto:opentelemetry-proto")
4545
testImplementation("org.skyscreamer:jsonassert")
46+
testImplementation("org.assertj:assertj-core")
4647

4748
testImplementation("com.google.api.grpc:proto-google-common-protos")
4849
testImplementation("io.grpc:grpc-testing")

exporters/otlp/common/src/main/java/io/opentelemetry/exporter/otlp/internal/grpc/DefaultGrpcExporterBuilder.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import io.opentelemetry.api.metrics.MeterProvider;
1717
import io.opentelemetry.exporter.otlp.internal.Marshaler;
1818
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
19-
import java.lang.reflect.Field;
2019
import java.net.URI;
2120
import java.net.URISyntaxException;
2221
import java.time.Duration;
@@ -44,7 +43,7 @@ public final class DefaultGrpcExporterBuilder<T extends Marshaler>
4443
private boolean compressionEnabled = false;
4544
@Nullable private Metadata metadata;
4645
@Nullable private byte[] trustedCertificatesPem;
47-
@Nullable private RetryPolicy retryPolicy;
46+
@Nullable RetryPolicy retryPolicy;
4847
private MeterProvider meterProvider = MeterProvider.noop();
4948

5049
/** Creates a new {@link DefaultGrpcExporterBuilder}. */
@@ -173,25 +172,4 @@ public GrpcExporter<T> build() {
173172
return new DefaultGrpcExporter<>(
174173
type, channel, stub, meterProvider, timeoutNanos, compressionEnabled);
175174
}
176-
177-
/**
178-
* Reflectively access a {@link DefaultGrpcExporterBuilder} instance in field called "delegate" of
179-
* the instance.
180-
*
181-
* @throws IllegalArgumentException if the instance does not contain a field called "delegate" of
182-
* type {@link DefaultGrpcExporterBuilder}
183-
*/
184-
public static <T> DefaultGrpcExporterBuilder<?> getDelegateBuilder(Class<T> type, T instance) {
185-
try {
186-
Field field = type.getDeclaredField("delegate");
187-
field.setAccessible(true);
188-
Object value = field.get(instance);
189-
if (!(value instanceof DefaultGrpcExporterBuilder)) {
190-
throw new IllegalArgumentException("delegate field is not type DefaultGrpcExporterBuilder");
191-
}
192-
return (DefaultGrpcExporterBuilder<?>) value;
193-
} catch (NoSuchFieldException | IllegalAccessException e) {
194-
throw new IllegalArgumentException("Unable to access delegate reflectively.", e);
195-
}
196-
}
197175
}

exporters/otlp/common/src/main/java/io/opentelemetry/exporter/otlp/internal/retry/RetryUtil.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55

66
package io.opentelemetry.exporter.otlp.internal.retry;
77

8+
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
89
import io.opentelemetry.exporter.otlp.internal.grpc.GrpcStatusUtil;
10+
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
11+
import java.lang.reflect.Field;
912
import java.util.Arrays;
1013
import java.util.Collections;
1114
import java.util.HashSet;
@@ -44,4 +47,29 @@ public static Set<String> retryableGrpcStatusCodes() {
4447
public static Set<Integer> retryableHttpResponseCodes() {
4548
return RETRYABLE_HTTP_STATUS_CODES;
4649
}
50+
51+
/**
52+
* Reflectively access a {@link DefaultGrpcExporterBuilder} or {@link OkHttpGrpcExporterBuilder}
53+
* instance in field called "delegate" of the instance, and set the {@link RetryPolicy}.
54+
*
55+
* @throws IllegalArgumentException if the instance does not contain a field called "delegate" of
56+
* type {@link DefaultGrpcExporterBuilder}
57+
*/
58+
public static void setRetryPolicyOnDelegate(Object instance, RetryPolicy retryPolicy) {
59+
try {
60+
Field field = instance.getClass().getDeclaredField("delegate");
61+
field.setAccessible(true);
62+
Object value = field.get(instance);
63+
if (value instanceof DefaultGrpcExporterBuilder) {
64+
((DefaultGrpcExporterBuilder<?>) value).setRetryPolicy(retryPolicy);
65+
} else if (value instanceof OkHttpGrpcExporterBuilder) {
66+
((OkHttpGrpcExporterBuilder<?>) value).setRetryPolicy(retryPolicy);
67+
} else {
68+
throw new IllegalArgumentException(
69+
"delegate field is not type DefaultGrpcExporterBuilder or OkHttpGrpcExporterBuilder");
70+
}
71+
} catch (NoSuchFieldException | IllegalAccessException e) {
72+
throw new IllegalArgumentException("Unable to access delegate reflectively.", e);
73+
}
74+
}
4775
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.exporter.otlp.internal.retry;
7+
8+
import static org.assertj.core.api.Assertions.as;
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
11+
12+
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
13+
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
14+
import java.net.URI;
15+
import java.net.URISyntaxException;
16+
import org.assertj.core.api.InstanceOfAssertFactories;
17+
import org.junit.jupiter.api.Test;
18+
19+
class RetryUtilTest {
20+
21+
@Test
22+
void setRetryPolicyOnDelegate_DefaultGrpcExporterBuilder() throws URISyntaxException {
23+
RetryPolicy retryPolicy = RetryPolicy.getDefault();
24+
DefaultGrpcExporterBuilder<?> builder =
25+
new DefaultGrpcExporterBuilder<>(
26+
"test", unused -> null, 0, new URI("http://localhost"), "test");
27+
28+
RetryUtil.setRetryPolicyOnDelegate(new WithDelegate(builder), retryPolicy);
29+
30+
assertThat(builder)
31+
.extracting("retryPolicy", as(InstanceOfAssertFactories.type(RetryPolicy.class)))
32+
.isEqualTo(retryPolicy);
33+
}
34+
35+
@Test
36+
void setRetryPolicyOnDelegate_OkHttpGrpcExporterBuilder() throws URISyntaxException {
37+
RetryPolicy retryPolicy = RetryPolicy.getDefault();
38+
OkHttpGrpcExporterBuilder<?> builder =
39+
new OkHttpGrpcExporterBuilder<>("test", "/test", 0, new URI("http://localhost"));
40+
41+
RetryUtil.setRetryPolicyOnDelegate(new WithDelegate(builder), retryPolicy);
42+
43+
assertThat(builder)
44+
.extracting("retryPolicy", as(InstanceOfAssertFactories.type(RetryPolicy.class)))
45+
.isEqualTo(retryPolicy);
46+
}
47+
48+
@Test
49+
void setRetryPolicyOnDelegate_InvalidUsage() {
50+
assertThatThrownBy(
51+
() -> RetryUtil.setRetryPolicyOnDelegate(new Object(), RetryPolicy.getDefault()))
52+
.hasMessageContaining("Unable to access delegate reflectively");
53+
assertThatThrownBy(
54+
() ->
55+
RetryUtil.setRetryPolicyOnDelegate(
56+
new WithDelegate(new Object()), RetryPolicy.getDefault()))
57+
.hasMessageContaining(
58+
"delegate field is not type DefaultGrpcExporterBuilder or OkHttpGrpcExporterBuilder");
59+
}
60+
61+
@SuppressWarnings({"UnusedVariable", "FieldCanBeLocal"})
62+
private static class WithDelegate {
63+
private final Object delegate;
64+
65+
private WithDelegate(Object delegate) {
66+
this.delegate = delegate;
67+
}
68+
}
69+
}

exporters/otlp/logs/src/test/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogExporterTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
package io.opentelemetry.exporter.otlp.logs;
77

88
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.assertj.core.api.Assertions.assertThatCode;
910

1011
import io.opentelemetry.api.common.Attributes;
1112
import io.opentelemetry.exporter.otlp.internal.Marshaler;
1213
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
1314
import io.opentelemetry.exporter.otlp.internal.logs.ResourceLogsMarshaler;
1415
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
16+
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
1517
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
1618
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
1719
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
@@ -33,6 +35,15 @@ class OtlpGrpcLogExporterTest extends AbstractGrpcTelemetryExporterTest<LogData,
3335
super("log", ResourceLogs.getDefaultInstance());
3436
}
3537

38+
@Test
39+
void testBuilderDelegate() {
40+
assertThatCode(
41+
() ->
42+
RetryUtil.setRetryPolicyOnDelegate(
43+
OtlpGrpcLogExporter.builder(), RetryPolicy.getDefault()))
44+
.doesNotThrowAnyException();
45+
}
46+
3647
@Test
3748
void usingOkHttp() {
3849
assertThat(OtlpGrpcLogExporter.builder().delegate)

exporters/otlp/logs/src/testGrpcNetty/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyLogExporterTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
1414
import io.opentelemetry.exporter.otlp.internal.logs.ResourceLogsMarshaler;
1515
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
16+
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
1617
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
1718
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
1819
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
@@ -39,9 +40,8 @@ class OtlpGrpcNettyLogExporterTest
3940
void testBuilderDelegate() {
4041
assertThatCode(
4142
() ->
42-
DefaultGrpcExporterBuilder.getDelegateBuilder(
43-
OtlpGrpcLogExporterBuilder.class, OtlpGrpcLogExporter.builder())
44-
.setRetryPolicy(RetryPolicy.getDefault()))
43+
RetryUtil.setRetryPolicyOnDelegate(
44+
OtlpGrpcLogExporter.builder(), RetryPolicy.getDefault()))
4545
.doesNotThrowAnyException();
4646
}
4747

exporters/otlp/metrics/src/test/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77

88
import static io.opentelemetry.api.common.AttributeKey.stringKey;
99
import static org.assertj.core.api.Assertions.assertThat;
10+
import static org.assertj.core.api.Assertions.assertThatCode;
1011

1112
import io.opentelemetry.api.common.Attributes;
1213
import io.opentelemetry.exporter.otlp.internal.Marshaler;
1314
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
1415
import io.opentelemetry.exporter.otlp.internal.metrics.ResourceMetricsMarshaler;
1516
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
17+
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
1618
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
1719
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
1820
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
@@ -36,6 +38,15 @@ class OtlpGrpcMetricExporterTest
3638
super("metric", ResourceMetrics.getDefaultInstance());
3739
}
3840

41+
@Test
42+
void testBuilderDelegate() {
43+
assertThatCode(
44+
() ->
45+
RetryUtil.setRetryPolicyOnDelegate(
46+
OtlpGrpcMetricExporter.builder(), RetryPolicy.getDefault()))
47+
.doesNotThrowAnyException();
48+
}
49+
3950
@Test
4051
void usingOkHttp() {
4152
assertThat(OtlpGrpcMetricExporter.builder().delegate)

exporters/otlp/metrics/src/testGrpcNetty/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcNettyMetricExporterTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
1515
import io.opentelemetry.exporter.otlp.internal.metrics.ResourceMetricsMarshaler;
1616
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
17+
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
1718
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
1819
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
1920
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
@@ -41,9 +42,8 @@ class OtlpGrpcNettyMetricExporterTest
4142
void testBuilderDelegate() {
4243
assertThatCode(
4344
() ->
44-
DefaultGrpcExporterBuilder.getDelegateBuilder(
45-
OtlpGrpcMetricExporterBuilder.class, OtlpGrpcMetricExporter.builder())
46-
.setRetryPolicy(RetryPolicy.getDefault()))
45+
RetryUtil.setRetryPolicyOnDelegate(
46+
OtlpGrpcMetricExporter.builder(), RetryPolicy.getDefault()))
4747
.doesNotThrowAnyException();
4848
}
4949

exporters/otlp/trace/src/test/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.exporter.otlp.trace;
77

88
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.assertj.core.api.Assertions.assertThatCode;
910

1011
import io.opentelemetry.api.trace.SpanContext;
1112
import io.opentelemetry.api.trace.SpanKind;
@@ -14,6 +15,7 @@
1415
import io.opentelemetry.exporter.otlp.internal.Marshaler;
1516
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
1617
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
18+
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
1719
import io.opentelemetry.exporter.otlp.internal.traces.ResourceSpansMarshaler;
1820
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
1921
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
@@ -38,6 +40,15 @@ class OtlpGrpcSpanExporterTest extends AbstractGrpcTelemetryExporterTest<SpanDat
3840
super("span", ResourceSpans.getDefaultInstance());
3941
}
4042

43+
@Test
44+
void testBuilderDelegate() {
45+
assertThatCode(
46+
() ->
47+
RetryUtil.setRetryPolicyOnDelegate(
48+
OtlpGrpcSpanExporter.builder(), RetryPolicy.getDefault()))
49+
.doesNotThrowAnyException();
50+
}
51+
4152
@Test
4253
void usingOkHttp() {
4354
assertThat(OtlpGrpcSpanExporter.builder().delegate)

exporters/otlp/trace/src/testGrpcNetty/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcNettySpanExporterTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.opentelemetry.exporter.otlp.internal.Marshaler;
1616
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
1717
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
18+
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
1819
import io.opentelemetry.exporter.otlp.internal.traces.ResourceSpansMarshaler;
1920
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
2021
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
@@ -44,9 +45,8 @@ class OtlpGrpcNettySpanExporterTest
4445
void builderDelegate() {
4546
assertThatCode(
4647
() ->
47-
DefaultGrpcExporterBuilder.getDelegateBuilder(
48-
OtlpGrpcSpanExporterBuilder.class, OtlpGrpcSpanExporter.builder())
49-
.setRetryPolicy(RetryPolicy.getDefault()))
48+
RetryUtil.setRetryPolicyOnDelegate(
49+
OtlpGrpcSpanExporter.builder(), RetryPolicy.getDefault()))
5050
.doesNotThrowAnyException();
5151
}
5252

0 commit comments

Comments
 (0)