Manual cherrypick for commits 8bbb0e25da
, b2873186e3
(#4104)
This commit is contained in:
parent
89675582a1
commit
3938d96ce2
|
@ -43,6 +43,7 @@ dependencies {
|
||||||
testImplementation("com.linecorp.armeria:armeria-junit5")
|
testImplementation("com.linecorp.armeria:armeria-junit5")
|
||||||
testImplementation("io.opentelemetry.proto:opentelemetry-proto")
|
testImplementation("io.opentelemetry.proto:opentelemetry-proto")
|
||||||
testImplementation("org.skyscreamer:jsonassert")
|
testImplementation("org.skyscreamer:jsonassert")
|
||||||
|
testImplementation("org.assertj:assertj-core")
|
||||||
|
|
||||||
testImplementation("com.google.api.grpc:proto-google-common-protos")
|
testImplementation("com.google.api.grpc:proto-google-common-protos")
|
||||||
testImplementation("io.grpc:grpc-testing")
|
testImplementation("io.grpc:grpc-testing")
|
||||||
|
|
|
@ -16,7 +16,6 @@ import io.grpc.stub.MetadataUtils;
|
||||||
import io.opentelemetry.api.metrics.MeterProvider;
|
import io.opentelemetry.api.metrics.MeterProvider;
|
||||||
import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
@ -44,7 +43,7 @@ public final class DefaultGrpcExporterBuilder<T extends Marshaler>
|
||||||
private boolean compressionEnabled = false;
|
private boolean compressionEnabled = false;
|
||||||
@Nullable private Metadata metadata;
|
@Nullable private Metadata metadata;
|
||||||
@Nullable private byte[] trustedCertificatesPem;
|
@Nullable private byte[] trustedCertificatesPem;
|
||||||
@Nullable private RetryPolicy retryPolicy;
|
@Nullable RetryPolicy retryPolicy;
|
||||||
private MeterProvider meterProvider = MeterProvider.noop();
|
private MeterProvider meterProvider = MeterProvider.noop();
|
||||||
|
|
||||||
/** Creates a new {@link DefaultGrpcExporterBuilder}. */
|
/** Creates a new {@link DefaultGrpcExporterBuilder}. */
|
||||||
|
@ -173,25 +172,4 @@ public final class DefaultGrpcExporterBuilder<T extends Marshaler>
|
||||||
return new DefaultGrpcExporter<>(
|
return new DefaultGrpcExporter<>(
|
||||||
type, channel, stub, meterProvider, timeoutNanos, compressionEnabled);
|
type, channel, stub, meterProvider, timeoutNanos, compressionEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Reflectively access a {@link DefaultGrpcExporterBuilder} instance in field called "delegate" of
|
|
||||||
* the instance.
|
|
||||||
*
|
|
||||||
* @throws IllegalArgumentException if the instance does not contain a field called "delegate" of
|
|
||||||
* type {@link DefaultGrpcExporterBuilder}
|
|
||||||
*/
|
|
||||||
public static <T> DefaultGrpcExporterBuilder<?> getDelegateBuilder(Class<T> type, T instance) {
|
|
||||||
try {
|
|
||||||
Field field = type.getDeclaredField("delegate");
|
|
||||||
field.setAccessible(true);
|
|
||||||
Object value = field.get(instance);
|
|
||||||
if (!(value instanceof DefaultGrpcExporterBuilder)) {
|
|
||||||
throw new IllegalArgumentException("delegate field is not type DefaultGrpcExporterBuilder");
|
|
||||||
}
|
|
||||||
return (DefaultGrpcExporterBuilder<?>) value;
|
|
||||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
|
||||||
throw new IllegalArgumentException("Unable to access delegate reflectively.", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,10 @@
|
||||||
|
|
||||||
package io.opentelemetry.exporter.otlp.internal.retry;
|
package io.opentelemetry.exporter.otlp.internal.retry;
|
||||||
|
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
||||||
import io.opentelemetry.exporter.otlp.internal.grpc.GrpcStatusUtil;
|
import io.opentelemetry.exporter.otlp.internal.grpc.GrpcStatusUtil;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
@ -44,4 +47,29 @@ public class RetryUtil {
|
||||||
public static Set<Integer> retryableHttpResponseCodes() {
|
public static Set<Integer> retryableHttpResponseCodes() {
|
||||||
return RETRYABLE_HTTP_STATUS_CODES;
|
return RETRYABLE_HTTP_STATUS_CODES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reflectively access a {@link DefaultGrpcExporterBuilder} or {@link OkHttpGrpcExporterBuilder}
|
||||||
|
* instance in field called "delegate" of the instance, and set the {@link RetryPolicy}.
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException if the instance does not contain a field called "delegate" of
|
||||||
|
* type {@link DefaultGrpcExporterBuilder}
|
||||||
|
*/
|
||||||
|
public static void setRetryPolicyOnDelegate(Object instance, RetryPolicy retryPolicy) {
|
||||||
|
try {
|
||||||
|
Field field = instance.getClass().getDeclaredField("delegate");
|
||||||
|
field.setAccessible(true);
|
||||||
|
Object value = field.get(instance);
|
||||||
|
if (value instanceof DefaultGrpcExporterBuilder) {
|
||||||
|
((DefaultGrpcExporterBuilder<?>) value).setRetryPolicy(retryPolicy);
|
||||||
|
} else if (value instanceof OkHttpGrpcExporterBuilder) {
|
||||||
|
((OkHttpGrpcExporterBuilder<?>) value).setRetryPolicy(retryPolicy);
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"delegate field is not type DefaultGrpcExporterBuilder or OkHttpGrpcExporterBuilder");
|
||||||
|
}
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||||
|
throw new IllegalArgumentException("Unable to access delegate reflectively.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.exporter.otlp.internal.retry;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.as;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||||
|
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import org.assertj.core.api.InstanceOfAssertFactories;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class RetryUtilTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void setRetryPolicyOnDelegate_DefaultGrpcExporterBuilder() throws URISyntaxException {
|
||||||
|
RetryPolicy retryPolicy = RetryPolicy.getDefault();
|
||||||
|
DefaultGrpcExporterBuilder<?> builder =
|
||||||
|
new DefaultGrpcExporterBuilder<>(
|
||||||
|
"test", unused -> null, 0, new URI("http://localhost"), "test");
|
||||||
|
|
||||||
|
RetryUtil.setRetryPolicyOnDelegate(new WithDelegate(builder), retryPolicy);
|
||||||
|
|
||||||
|
assertThat(builder)
|
||||||
|
.extracting("retryPolicy", as(InstanceOfAssertFactories.type(RetryPolicy.class)))
|
||||||
|
.isEqualTo(retryPolicy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void setRetryPolicyOnDelegate_OkHttpGrpcExporterBuilder() throws URISyntaxException {
|
||||||
|
RetryPolicy retryPolicy = RetryPolicy.getDefault();
|
||||||
|
OkHttpGrpcExporterBuilder<?> builder =
|
||||||
|
new OkHttpGrpcExporterBuilder<>("test", "/test", 0, new URI("http://localhost"));
|
||||||
|
|
||||||
|
RetryUtil.setRetryPolicyOnDelegate(new WithDelegate(builder), retryPolicy);
|
||||||
|
|
||||||
|
assertThat(builder)
|
||||||
|
.extracting("retryPolicy", as(InstanceOfAssertFactories.type(RetryPolicy.class)))
|
||||||
|
.isEqualTo(retryPolicy);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void setRetryPolicyOnDelegate_InvalidUsage() {
|
||||||
|
assertThatThrownBy(
|
||||||
|
() -> RetryUtil.setRetryPolicyOnDelegate(new Object(), RetryPolicy.getDefault()))
|
||||||
|
.hasMessageContaining("Unable to access delegate reflectively");
|
||||||
|
assertThatThrownBy(
|
||||||
|
() ->
|
||||||
|
RetryUtil.setRetryPolicyOnDelegate(
|
||||||
|
new WithDelegate(new Object()), RetryPolicy.getDefault()))
|
||||||
|
.hasMessageContaining(
|
||||||
|
"delegate field is not type DefaultGrpcExporterBuilder or OkHttpGrpcExporterBuilder");
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"UnusedVariable", "FieldCanBeLocal"})
|
||||||
|
private static class WithDelegate {
|
||||||
|
private final Object delegate;
|
||||||
|
|
||||||
|
private WithDelegate(Object delegate) {
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,12 +6,14 @@
|
||||||
package io.opentelemetry.exporter.otlp.logs;
|
package io.opentelemetry.exporter.otlp.logs;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||||
|
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
|
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
|
||||||
import io.opentelemetry.exporter.otlp.internal.logs.ResourceLogsMarshaler;
|
import io.opentelemetry.exporter.otlp.internal.logs.ResourceLogsMarshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
|
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
|
||||||
|
@ -33,6 +35,15 @@ class OtlpGrpcLogExporterTest extends AbstractGrpcTelemetryExporterTest<LogData,
|
||||||
super("log", ResourceLogs.getDefaultInstance());
|
super("log", ResourceLogs.getDefaultInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testBuilderDelegate() {
|
||||||
|
assertThatCode(
|
||||||
|
() ->
|
||||||
|
RetryUtil.setRetryPolicyOnDelegate(
|
||||||
|
OtlpGrpcLogExporter.builder(), RetryPolicy.getDefault()))
|
||||||
|
.doesNotThrowAnyException();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void usingOkHttp() {
|
void usingOkHttp() {
|
||||||
assertThat(OtlpGrpcLogExporter.builder().delegate)
|
assertThat(OtlpGrpcLogExporter.builder().delegate)
|
||||||
|
|
|
@ -13,6 +13,7 @@ import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
||||||
import io.opentelemetry.exporter.otlp.internal.logs.ResourceLogsMarshaler;
|
import io.opentelemetry.exporter.otlp.internal.logs.ResourceLogsMarshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
|
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
|
||||||
|
@ -39,9 +40,8 @@ class OtlpGrpcNettyLogExporterTest
|
||||||
void testBuilderDelegate() {
|
void testBuilderDelegate() {
|
||||||
assertThatCode(
|
assertThatCode(
|
||||||
() ->
|
() ->
|
||||||
DefaultGrpcExporterBuilder.getDelegateBuilder(
|
RetryUtil.setRetryPolicyOnDelegate(
|
||||||
OtlpGrpcLogExporterBuilder.class, OtlpGrpcLogExporter.builder())
|
OtlpGrpcLogExporter.builder(), RetryPolicy.getDefault()))
|
||||||
.setRetryPolicy(RetryPolicy.getDefault()))
|
|
||||||
.doesNotThrowAnyException();
|
.doesNotThrowAnyException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,14 @@ package io.opentelemetry.exporter.otlp.metrics;
|
||||||
|
|
||||||
import static io.opentelemetry.api.common.AttributeKey.stringKey;
|
import static io.opentelemetry.api.common.AttributeKey.stringKey;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||||
|
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
|
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
|
||||||
import io.opentelemetry.exporter.otlp.internal.metrics.ResourceMetricsMarshaler;
|
import io.opentelemetry.exporter.otlp.internal.metrics.ResourceMetricsMarshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
|
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
|
||||||
|
@ -36,6 +38,15 @@ class OtlpGrpcMetricExporterTest
|
||||||
super("metric", ResourceMetrics.getDefaultInstance());
|
super("metric", ResourceMetrics.getDefaultInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testBuilderDelegate() {
|
||||||
|
assertThatCode(
|
||||||
|
() ->
|
||||||
|
RetryUtil.setRetryPolicyOnDelegate(
|
||||||
|
OtlpGrpcMetricExporter.builder(), RetryPolicy.getDefault()))
|
||||||
|
.doesNotThrowAnyException();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void usingOkHttp() {
|
void usingOkHttp() {
|
||||||
assertThat(OtlpGrpcMetricExporter.builder().delegate)
|
assertThat(OtlpGrpcMetricExporter.builder().delegate)
|
||||||
|
|
|
@ -14,6 +14,7 @@ import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
||||||
import io.opentelemetry.exporter.otlp.internal.metrics.ResourceMetricsMarshaler;
|
import io.opentelemetry.exporter.otlp.internal.metrics.ResourceMetricsMarshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
|
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporterBuilder;
|
||||||
|
@ -41,9 +42,8 @@ class OtlpGrpcNettyMetricExporterTest
|
||||||
void testBuilderDelegate() {
|
void testBuilderDelegate() {
|
||||||
assertThatCode(
|
assertThatCode(
|
||||||
() ->
|
() ->
|
||||||
DefaultGrpcExporterBuilder.getDelegateBuilder(
|
RetryUtil.setRetryPolicyOnDelegate(
|
||||||
OtlpGrpcMetricExporterBuilder.class, OtlpGrpcMetricExporter.builder())
|
OtlpGrpcMetricExporter.builder(), RetryPolicy.getDefault()))
|
||||||
.setRetryPolicy(RetryPolicy.getDefault()))
|
|
||||||
.doesNotThrowAnyException();
|
.doesNotThrowAnyException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
package io.opentelemetry.exporter.otlp.trace;
|
package io.opentelemetry.exporter.otlp.trace;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||||
|
|
||||||
import io.opentelemetry.api.trace.SpanContext;
|
import io.opentelemetry.api.trace.SpanContext;
|
||||||
import io.opentelemetry.api.trace.SpanKind;
|
import io.opentelemetry.api.trace.SpanKind;
|
||||||
|
@ -14,6 +15,7 @@ import io.opentelemetry.api.trace.TraceState;
|
||||||
import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
|
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
|
||||||
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
|
||||||
import io.opentelemetry.exporter.otlp.internal.traces.ResourceSpansMarshaler;
|
import io.opentelemetry.exporter.otlp.internal.traces.ResourceSpansMarshaler;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
||||||
|
@ -38,6 +40,15 @@ class OtlpGrpcSpanExporterTest extends AbstractGrpcTelemetryExporterTest<SpanDat
|
||||||
super("span", ResourceSpans.getDefaultInstance());
|
super("span", ResourceSpans.getDefaultInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testBuilderDelegate() {
|
||||||
|
assertThatCode(
|
||||||
|
() ->
|
||||||
|
RetryUtil.setRetryPolicyOnDelegate(
|
||||||
|
OtlpGrpcSpanExporter.builder(), RetryPolicy.getDefault()))
|
||||||
|
.doesNotThrowAnyException();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void usingOkHttp() {
|
void usingOkHttp() {
|
||||||
assertThat(OtlpGrpcSpanExporter.builder().delegate)
|
assertThat(OtlpGrpcSpanExporter.builder().delegate)
|
||||||
|
|
|
@ -15,6 +15,7 @@ import io.opentelemetry.api.trace.TraceState;
|
||||||
import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
import io.opentelemetry.exporter.otlp.internal.Marshaler;
|
||||||
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
||||||
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryPolicy;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
|
||||||
import io.opentelemetry.exporter.otlp.internal.traces.ResourceSpansMarshaler;
|
import io.opentelemetry.exporter.otlp.internal.traces.ResourceSpansMarshaler;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
import io.opentelemetry.exporter.otlp.testing.internal.AbstractGrpcTelemetryExporterTest;
|
||||||
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
import io.opentelemetry.exporter.otlp.testing.internal.TelemetryExporter;
|
||||||
|
@ -44,9 +45,8 @@ class OtlpGrpcNettySpanExporterTest
|
||||||
void builderDelegate() {
|
void builderDelegate() {
|
||||||
assertThatCode(
|
assertThatCode(
|
||||||
() ->
|
() ->
|
||||||
DefaultGrpcExporterBuilder.getDelegateBuilder(
|
RetryUtil.setRetryPolicyOnDelegate(
|
||||||
OtlpGrpcSpanExporterBuilder.class, OtlpGrpcSpanExporter.builder())
|
OtlpGrpcSpanExporter.builder(), RetryPolicy.getDefault()))
|
||||||
.setRetryPolicy(RetryPolicy.getDefault()))
|
|
||||||
.doesNotThrowAnyException();
|
.doesNotThrowAnyException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,13 +25,31 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public final class PrometheusCollector extends Collector implements MetricReader {
|
public final class PrometheusCollector extends Collector implements MetricReader {
|
||||||
private final MetricProducer metricProducer;
|
private final MetricProducer metricProducer;
|
||||||
|
private volatile boolean registered = false;
|
||||||
|
|
||||||
PrometheusCollector(MetricProducer metricProducer) {
|
PrometheusCollector(MetricProducer metricProducer) {
|
||||||
this.metricProducer = metricProducer;
|
this.metricProducer = metricProducer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called in {@link Factory#apply(MetricProducer)}. {@link Collector#register()}
|
||||||
|
* triggers a call to {@link #collect()}, which throws an error because {@link
|
||||||
|
* MetricProducer#collectAllMetrics()} is not yet read to accept calls. To get around this, we
|
||||||
|
* have {@link #collect()} exit early until registration is complete.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("TypeParameterUnusedInFormals")
|
||||||
|
@Override
|
||||||
|
public <T extends Collector> T register() {
|
||||||
|
T result = super.register();
|
||||||
|
this.registered = true;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<MetricFamilySamples> collect() {
|
public List<MetricFamilySamples> collect() {
|
||||||
|
if (!registered) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
Collection<MetricData> allMetrics = metricProducer.collectAllMetrics();
|
Collection<MetricData> allMetrics = metricProducer.collectAllMetrics();
|
||||||
List<MetricFamilySamples> allSamples = new ArrayList<>(allMetrics.size());
|
List<MetricFamilySamples> allSamples = new ArrayList<>(allMetrics.size());
|
||||||
for (MetricData metricData : allMetrics) {
|
for (MetricData metricData : allMetrics) {
|
||||||
|
|
|
@ -7,11 +7,13 @@ package io.opentelemetry.exporter.prometheus;
|
||||||
|
|
||||||
import static io.opentelemetry.api.common.AttributeKey.stringKey;
|
import static io.opentelemetry.api.common.AttributeKey.stringKey;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.assertThatCode;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
|
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
|
||||||
|
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
|
||||||
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
|
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
|
||||||
import io.opentelemetry.sdk.metrics.data.DoublePointData;
|
import io.opentelemetry.sdk.metrics.data.DoublePointData;
|
||||||
import io.opentelemetry.sdk.metrics.data.DoubleSumData;
|
import io.opentelemetry.sdk.metrics.data.DoubleSumData;
|
||||||
|
@ -25,6 +27,7 @@ import io.prometheus.client.exporter.common.TextFormat;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.extension.ExtendWith;
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
@ -43,6 +46,18 @@ class PrometheusCollectorTest {
|
||||||
prometheusCollector.register();
|
prometheusCollector.register();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void registerWithSdkMeterProvider() {
|
||||||
|
assertThatCode(
|
||||||
|
() ->
|
||||||
|
SdkMeterProvider.builder()
|
||||||
|
.registerMetricReader(PrometheusCollector.create())
|
||||||
|
.build()
|
||||||
|
.forceFlush()
|
||||||
|
.join(10, TimeUnit.SECONDS))
|
||||||
|
.doesNotThrowAnyException();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void registerToDefault() throws IOException {
|
void registerToDefault() throws IOException {
|
||||||
when(metricProducer.collectAllMetrics()).thenReturn(generateTestData());
|
when(metricProducer.collectAllMetrics()).thenReturn(generateTestData());
|
||||||
|
|
|
@ -13,8 +13,8 @@ import io.opentelemetry.api.metrics.MeterProvider;
|
||||||
import io.opentelemetry.exporter.logging.SystemOutLogExporter;
|
import io.opentelemetry.exporter.logging.SystemOutLogExporter;
|
||||||
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogExporter;
|
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogExporter;
|
||||||
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogExporterBuilder;
|
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogExporterBuilder;
|
||||||
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
|
||||||
import io.opentelemetry.exporter.otlp.internal.okhttp.OkHttpExporterBuilder;
|
import io.opentelemetry.exporter.otlp.internal.okhttp.OkHttpExporterBuilder;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
|
||||||
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporter;
|
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporter;
|
||||||
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporterBuilder;
|
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogExporterBuilder;
|
||||||
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
|
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
|
||||||
|
@ -129,10 +129,7 @@ class LogExporterConfiguration {
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
builder::setTimeout,
|
builder::setTimeout,
|
||||||
builder::setTrustedCertificates,
|
builder::setTrustedCertificates,
|
||||||
retryPolicy ->
|
retryPolicy -> RetryUtil.setRetryPolicyOnDelegate(builder, retryPolicy));
|
||||||
DefaultGrpcExporterBuilder.getDelegateBuilder(
|
|
||||||
OtlpGrpcLogExporterBuilder.class, builder)
|
|
||||||
.setRetryPolicy(retryPolicy));
|
|
||||||
builder.setMeterProvider(meterProvider);
|
builder.setMeterProvider(meterProvider);
|
||||||
|
|
||||||
return builder.build();
|
return builder.build();
|
||||||
|
|
|
@ -12,8 +12,8 @@ import static io.opentelemetry.sdk.autoconfigure.OtlpConfigUtil.PROTOCOL_HTTP_PR
|
||||||
import io.opentelemetry.exporter.logging.LoggingMetricExporter;
|
import io.opentelemetry.exporter.logging.LoggingMetricExporter;
|
||||||
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter;
|
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter;
|
||||||
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder;
|
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder;
|
||||||
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
|
||||||
import io.opentelemetry.exporter.otlp.internal.okhttp.OkHttpExporterBuilder;
|
import io.opentelemetry.exporter.otlp.internal.okhttp.OkHttpExporterBuilder;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
|
||||||
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter;
|
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter;
|
||||||
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder;
|
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder;
|
||||||
import io.opentelemetry.exporter.prometheus.PrometheusHttpServer;
|
import io.opentelemetry.exporter.prometheus.PrometheusHttpServer;
|
||||||
|
@ -134,10 +134,7 @@ final class MetricExporterConfiguration {
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
builder::setTimeout,
|
builder::setTimeout,
|
||||||
builder::setTrustedCertificates,
|
builder::setTrustedCertificates,
|
||||||
retryPolicy ->
|
retryPolicy -> RetryUtil.setRetryPolicyOnDelegate(builder, retryPolicy));
|
||||||
DefaultGrpcExporterBuilder.getDelegateBuilder(
|
|
||||||
OtlpGrpcMetricExporterBuilder.class, builder)
|
|
||||||
.setRetryPolicy(retryPolicy));
|
|
||||||
OtlpConfigUtil.configureOtlpAggregationTemporality(config, builder::setPreferredTemporality);
|
OtlpConfigUtil.configureOtlpAggregationTemporality(config, builder::setPreferredTemporality);
|
||||||
|
|
||||||
exporter = builder.build();
|
exporter = builder.build();
|
||||||
|
|
|
@ -16,8 +16,8 @@ import io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporterBuilder;
|
||||||
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
|
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
|
||||||
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
|
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
|
||||||
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder;
|
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder;
|
||||||
import io.opentelemetry.exporter.otlp.internal.grpc.DefaultGrpcExporterBuilder;
|
|
||||||
import io.opentelemetry.exporter.otlp.internal.okhttp.OkHttpExporterBuilder;
|
import io.opentelemetry.exporter.otlp.internal.okhttp.OkHttpExporterBuilder;
|
||||||
|
import io.opentelemetry.exporter.otlp.internal.retry.RetryUtil;
|
||||||
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
|
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
|
||||||
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
|
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
|
||||||
import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter;
|
import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter;
|
||||||
|
@ -150,10 +150,7 @@ final class SpanExporterConfiguration {
|
||||||
builder::setCompression,
|
builder::setCompression,
|
||||||
builder::setTimeout,
|
builder::setTimeout,
|
||||||
builder::setTrustedCertificates,
|
builder::setTrustedCertificates,
|
||||||
retryPolicy ->
|
retryPolicy -> RetryUtil.setRetryPolicyOnDelegate(builder, retryPolicy));
|
||||||
DefaultGrpcExporterBuilder.getDelegateBuilder(
|
|
||||||
OtlpGrpcSpanExporterBuilder.class, builder)
|
|
||||||
.setRetryPolicy(retryPolicy));
|
|
||||||
builder.setMeterProvider(meterProvider);
|
builder.setMeterProvider(meterProvider);
|
||||||
|
|
||||||
return builder.build();
|
return builder.build();
|
||||||
|
|
Loading…
Reference in New Issue