Unify compression configuration for exporters (#4775)
* Fix handling of compressionMethod `none` in GrpcExporterBuilder * Fix handling of compressionMethod `none` in OkHttpExporterBuilder * Add compression configuration assertions to AbstractGrpcTelemetryExporterTest * Add compression configuration to JaegerGrpcSpanExporterBuilder * Add compression configuration to ZipkinSpanExporterBuilder * Specify that zipkin default compression is gzip Co-authored-by: Jack Berg <jberg@newrelic.com>
This commit is contained in:
parent
b6c58c5d90
commit
fa46f19d39
|
|
@ -1,2 +1,4 @@
|
||||||
Comparing source compatibility of against
|
Comparing source compatibility of against
|
||||||
No changes.
|
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporterBuilder (not serializable)
|
||||||
|
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
|
||||||
|
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporterBuilder setCompression(java.lang.String)
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,4 @@
|
||||||
Comparing source compatibility of against
|
Comparing source compatibility of against
|
||||||
No changes.
|
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.zipkin.ZipkinSpanExporterBuilder (not serializable)
|
||||||
|
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
|
||||||
|
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.zipkin.ZipkinSpanExporterBuilder setCompression(java.lang.String)
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ public class GrpcExporterBuilder<T extends Marshaler> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public GrpcExporterBuilder<T> setCompression(String compressionMethod) {
|
public GrpcExporterBuilder<T> setCompression(String compressionMethod) {
|
||||||
this.compressionEnabled = true;
|
this.compressionEnabled = compressionMethod.equals("gzip");
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,9 +72,7 @@ public final class OkHttpExporterBuilder<T extends Marshaler> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public OkHttpExporterBuilder<T> setCompression(String compressionMethod) {
|
public OkHttpExporterBuilder<T> setCompression(String compressionMethod) {
|
||||||
if (compressionMethod.equals("gzip")) {
|
this.compressionEnabled = compressionMethod.equals("gzip");
|
||||||
this.compressionEnabled = true;
|
|
||||||
}
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,183 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.exporter.internal.grpc;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.Futures;
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
import io.grpc.CallOptions;
|
||||||
|
import io.grpc.Channel;
|
||||||
|
import io.grpc.Codec;
|
||||||
|
import io.grpc.ManagedChannel;
|
||||||
|
import io.opentelemetry.exporter.internal.marshal.Marshaler;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.function.BiFunction;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class GrpcExporterBuilderTest {
|
||||||
|
|
||||||
|
private final ManagedChannel channel = mock(ManagedChannel.class);
|
||||||
|
|
||||||
|
private GrpcExporterBuilder<Marshaler> builder;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
void setUp() {
|
||||||
|
Supplier<BiFunction<Channel, String, MarshalerServiceStub<Marshaler, ?, ?>>> grpcStubFactory =
|
||||||
|
mock(Supplier.class);
|
||||||
|
when(grpcStubFactory.get())
|
||||||
|
.thenReturn((c, s) -> new TestMarshalerServiceStub(c, CallOptions.DEFAULT));
|
||||||
|
|
||||||
|
builder =
|
||||||
|
GrpcExporter.builder(
|
||||||
|
"otlp", "span", 0, URI.create("http://localhost:4317"), grpcStubFactory, "/test");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionDefault() {
|
||||||
|
GrpcExporter<Marshaler> exporter = builder.build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
OkHttpGrpcExporter.class,
|
||||||
|
otlp -> assertThat(otlp).extracting("compressionEnabled").isEqualTo(false));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionNone() {
|
||||||
|
GrpcExporter<Marshaler> exporter = builder.setCompression("none").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
OkHttpGrpcExporter.class,
|
||||||
|
otlp -> assertThat(otlp).extracting("compressionEnabled").isEqualTo(false));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionGzip() {
|
||||||
|
GrpcExporter<Marshaler> exporter = builder.setCompression("gzip").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
OkHttpGrpcExporter.class,
|
||||||
|
otlp -> assertThat(otlp).extracting("compressionEnabled").isEqualTo(true));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionEnabledAndDisabled() {
|
||||||
|
GrpcExporter<Marshaler> exporter =
|
||||||
|
builder.setCompression("gzip").setCompression("none").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
OkHttpGrpcExporter.class,
|
||||||
|
otlp -> assertThat(otlp).extracting("compressionEnabled").isEqualTo(false));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionDefaultWithChannel() {
|
||||||
|
GrpcExporter<Marshaler> exporter = builder.setChannel(channel).build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
UpstreamGrpcExporter.class,
|
||||||
|
otlp ->
|
||||||
|
assertThat(otlp)
|
||||||
|
.extracting("stub")
|
||||||
|
.extracting("callOptions.compressorName")
|
||||||
|
.isEqualTo(Codec.Identity.NONE.getMessageEncoding()));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionNoneWithChannel() {
|
||||||
|
GrpcExporter<Marshaler> exporter = builder.setChannel(channel).setCompression("none").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
UpstreamGrpcExporter.class,
|
||||||
|
otlp ->
|
||||||
|
assertThat(otlp)
|
||||||
|
.extracting("stub")
|
||||||
|
.extracting("callOptions.compressorName")
|
||||||
|
.isEqualTo(Codec.Identity.NONE.getMessageEncoding()));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionGzipWithChannel() {
|
||||||
|
GrpcExporter<Marshaler> exporter = builder.setChannel(channel).setCompression("gzip").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
UpstreamGrpcExporter.class,
|
||||||
|
otlp ->
|
||||||
|
assertThat(otlp)
|
||||||
|
.extracting("stub")
|
||||||
|
.extracting("callOptions.compressorName")
|
||||||
|
.isEqualTo(new Codec.Gzip().getMessageEncoding()));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionEnabledAndDisabledWithChannel() {
|
||||||
|
GrpcExporter<Marshaler> exporter =
|
||||||
|
builder.setChannel(channel).setCompression("gzip").setCompression("none").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
UpstreamGrpcExporter.class,
|
||||||
|
otlp ->
|
||||||
|
assertThat(otlp)
|
||||||
|
.extracting("stub")
|
||||||
|
.extracting("callOptions.compressorName")
|
||||||
|
.isEqualTo(Codec.Identity.NONE.getMessageEncoding()));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final class TestMarshalerServiceStub
|
||||||
|
extends MarshalerServiceStub<Marshaler, Void, TestMarshalerServiceStub> {
|
||||||
|
|
||||||
|
private TestMarshalerServiceStub(Channel channel, CallOptions callOptions) {
|
||||||
|
super(channel, callOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TestMarshalerServiceStub build(Channel channel, CallOptions callOptions) {
|
||||||
|
return new TestMarshalerServiceStub(channel, callOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ListenableFuture<Void> export(Marshaler request) {
|
||||||
|
return Futures.immediateVoidFuture();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.exporter.internal.okhttp;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import io.opentelemetry.exporter.internal.marshal.Marshaler;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class OkHttpExporterBuilderTest {
|
||||||
|
|
||||||
|
private final OkHttpExporterBuilder<Marshaler> builder =
|
||||||
|
new OkHttpExporterBuilder<>("otlp", "span", "http://localhost:4318/v1/traces");
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionDefault() {
|
||||||
|
OkHttpExporter<Marshaler> exporter = builder.build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
OkHttpExporter.class,
|
||||||
|
otlp -> assertThat(otlp).extracting("compressionEnabled").isEqualTo(false));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionNone() {
|
||||||
|
OkHttpExporter<Marshaler> exporter = builder.setCompression("none").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
OkHttpExporter.class,
|
||||||
|
otlp -> assertThat(otlp).extracting("compressionEnabled").isEqualTo(false));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionGzip() {
|
||||||
|
OkHttpExporter<Marshaler> exporter = builder.setCompression("gzip").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
OkHttpExporter.class,
|
||||||
|
otlp -> assertThat(otlp).extracting("compressionEnabled").isEqualTo(true));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionEnabledAndDisabled() {
|
||||||
|
OkHttpExporter<Marshaler> exporter =
|
||||||
|
builder.setCompression("gzip").setCompression("none").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter)
|
||||||
|
.isInstanceOfSatisfying(
|
||||||
|
OkHttpExporter.class,
|
||||||
|
otlp -> assertThat(otlp).extracting("compressionEnabled").isEqualTo(false));
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -66,6 +66,19 @@ public final class JaegerGrpcSpanExporterBuilder {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the method used to compress payloads. If unset, compression is disabled. Currently
|
||||||
|
* supported compression methods include "gzip" and "none".
|
||||||
|
*/
|
||||||
|
public JaegerGrpcSpanExporterBuilder setCompression(String compressionMethod) {
|
||||||
|
requireNonNull(compressionMethod, "compressionMethod");
|
||||||
|
checkArgument(
|
||||||
|
compressionMethod.equals("gzip") || compressionMethod.equals("none"),
|
||||||
|
"Unsupported compression method. Supported compression methods include: gzip, none.");
|
||||||
|
delegate.setCompression(compressionMethod);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the maximum time to wait for the collector to process an exported batch of spans. If
|
* Sets the maximum time to wait for the collector to process an exported batch of spans. If
|
||||||
* unset, defaults to {@value DEFAULT_TIMEOUT_SECS}s.
|
* unset, defaults to {@value DEFAULT_TIMEOUT_SECS}s.
|
||||||
|
|
|
||||||
|
|
@ -357,6 +357,57 @@ class JaegerGrpcSpanExporterTest {
|
||||||
assertThatThrownBy(() -> JaegerGrpcSpanExporter.builder().setEndpoint("gopher://localhost"))
|
assertThatThrownBy(() -> JaegerGrpcSpanExporter.builder().setEndpoint("gopher://localhost"))
|
||||||
.isInstanceOf(IllegalArgumentException.class)
|
.isInstanceOf(IllegalArgumentException.class)
|
||||||
.hasMessage("Invalid endpoint, must start with http:// or https://: gopher://localhost");
|
.hasMessage("Invalid endpoint, must start with http:// or https://: gopher://localhost");
|
||||||
|
|
||||||
|
assertThatThrownBy(() -> JaegerGrpcSpanExporter.builder().setCompression(null))
|
||||||
|
.isInstanceOf(NullPointerException.class)
|
||||||
|
.hasMessage("compressionMethod");
|
||||||
|
assertThatThrownBy(() -> JaegerGrpcSpanExporter.builder().setCompression("foo"))
|
||||||
|
.isInstanceOf(IllegalArgumentException.class)
|
||||||
|
.hasMessage(
|
||||||
|
"Unsupported compression method. Supported compression methods include: gzip, none.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionDefault() {
|
||||||
|
JaegerGrpcSpanExporter exporter = JaegerGrpcSpanExporter.builder().build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter).extracting("delegate.compressionEnabled").isEqualTo(false);
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionNone() {
|
||||||
|
JaegerGrpcSpanExporter exporter =
|
||||||
|
JaegerGrpcSpanExporter.builder().setCompression("none").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter).extracting("delegate.compressionEnabled").isEqualTo(false);
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionGzip() {
|
||||||
|
JaegerGrpcSpanExporter exporter =
|
||||||
|
JaegerGrpcSpanExporter.builder().setCompression("gzip").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter).extracting("delegate.compressionEnabled").isEqualTo(true);
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionEnabledAndDisabled() {
|
||||||
|
JaegerGrpcSpanExporter exporter =
|
||||||
|
JaegerGrpcSpanExporter.builder().setCompression("gzip").setCompression("none").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter).extracting("delegate.compressionEnabled").isEqualTo(false);
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ package io.opentelemetry.exporter.otlp.testing.internal;
|
||||||
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.assertj.core.api.Assertions.assertThatCode;
|
||||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||||
|
import static org.assertj.core.api.Assumptions.assumeThat;
|
||||||
import static org.junit.jupiter.api.Named.named;
|
import static org.junit.jupiter.api.Named.named;
|
||||||
import static org.junit.jupiter.params.provider.Arguments.arguments;
|
import static org.junit.jupiter.params.provider.Arguments.arguments;
|
||||||
|
|
||||||
|
|
@ -237,6 +238,28 @@ public abstract class AbstractGrpcTelemetryExporterTest<T, U extends Message> {
|
||||||
assertThat(exportedResourceTelemetry).containsExactlyElementsOf(expectedResourceTelemetry);
|
assertThat(exportedResourceTelemetry).containsExactlyElementsOf(expectedResourceTelemetry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionWithNone() {
|
||||||
|
TelemetryExporter<T> exporter =
|
||||||
|
exporterBuilder().setEndpoint(server.httpUri().toString()).setCompression("none").build();
|
||||||
|
// UpstreamGrpcExporter doesn't support compression, so we skip the assertion
|
||||||
|
assumeThat(exporter.unwrap())
|
||||||
|
.extracting("delegate")
|
||||||
|
.isNotInstanceOf(UpstreamGrpcExporter.class);
|
||||||
|
assertThat(exporter.unwrap()).extracting("delegate.compressionEnabled").isEqualTo(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionWithGzip() {
|
||||||
|
TelemetryExporter<T> exporter =
|
||||||
|
exporterBuilder().setEndpoint(server.httpUri().toString()).setCompression("gzip").build();
|
||||||
|
// UpstreamGrpcExporter doesn't support compression, so we skip the assertion
|
||||||
|
assumeThat(exporter.unwrap())
|
||||||
|
.extracting("delegate")
|
||||||
|
.isNotInstanceOf(UpstreamGrpcExporter.class);
|
||||||
|
assertThat(exporter.unwrap()).extracting("delegate.compressionEnabled").isEqualTo(true);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void authorityWithAuth() {
|
void authorityWithAuth() {
|
||||||
TelemetryExporter<T> exporter =
|
TelemetryExporter<T> exporter =
|
||||||
|
|
|
||||||
|
|
@ -139,6 +139,11 @@ public final class ManagedChannelTelemetryExporterBuilder<T>
|
||||||
delegate.setChannel(channel);
|
delegate.setChannel(channel);
|
||||||
TelemetryExporter<T> delegateExporter = delegate.build();
|
TelemetryExporter<T> delegateExporter = delegate.build();
|
||||||
return new TelemetryExporter<T>() {
|
return new TelemetryExporter<T>() {
|
||||||
|
@Override
|
||||||
|
public Object unwrap() {
|
||||||
|
return delegateExporter.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableResultCode export(Collection<T> items) {
|
public CompletableResultCode export(Collection<T> items) {
|
||||||
return delegateExporter.export(items);
|
return delegateExporter.export(items);
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,11 @@ public interface TelemetryExporter<T> {
|
||||||
/** Wraps a SpanExporter. */
|
/** Wraps a SpanExporter. */
|
||||||
static TelemetryExporter<SpanData> wrap(SpanExporter exporter) {
|
static TelemetryExporter<SpanData> wrap(SpanExporter exporter) {
|
||||||
return new TelemetryExporter<SpanData>() {
|
return new TelemetryExporter<SpanData>() {
|
||||||
|
@Override
|
||||||
|
public Object unwrap() {
|
||||||
|
return exporter;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableResultCode export(Collection<SpanData> items) {
|
public CompletableResultCode export(Collection<SpanData> items) {
|
||||||
return exporter.export(items);
|
return exporter.export(items);
|
||||||
|
|
@ -34,6 +39,11 @@ public interface TelemetryExporter<T> {
|
||||||
/** Wraps a MetricExporter. */
|
/** Wraps a MetricExporter. */
|
||||||
static TelemetryExporter<MetricData> wrap(MetricExporter exporter) {
|
static TelemetryExporter<MetricData> wrap(MetricExporter exporter) {
|
||||||
return new TelemetryExporter<MetricData>() {
|
return new TelemetryExporter<MetricData>() {
|
||||||
|
@Override
|
||||||
|
public Object unwrap() {
|
||||||
|
return exporter;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableResultCode export(Collection<MetricData> items) {
|
public CompletableResultCode export(Collection<MetricData> items) {
|
||||||
return exporter.export(items);
|
return exporter.export(items);
|
||||||
|
|
@ -49,6 +59,11 @@ public interface TelemetryExporter<T> {
|
||||||
/** Wraps a LogRecordExporter. */
|
/** Wraps a LogRecordExporter. */
|
||||||
static TelemetryExporter<LogRecordData> wrap(LogRecordExporter exporter) {
|
static TelemetryExporter<LogRecordData> wrap(LogRecordExporter exporter) {
|
||||||
return new TelemetryExporter<LogRecordData>() {
|
return new TelemetryExporter<LogRecordData>() {
|
||||||
|
@Override
|
||||||
|
public Object unwrap() {
|
||||||
|
return exporter;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableResultCode export(Collection<LogRecordData> items) {
|
public CompletableResultCode export(Collection<LogRecordData> items) {
|
||||||
return exporter.export(items);
|
return exporter.export(items);
|
||||||
|
|
@ -61,6 +76,8 @@ public interface TelemetryExporter<T> {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Object unwrap();
|
||||||
|
|
||||||
CompletableResultCode export(Collection<T> items);
|
CompletableResultCode export(Collection<T> items);
|
||||||
|
|
||||||
CompletableResultCode shutdown();
|
CompletableResultCode shutdown();
|
||||||
|
|
|
||||||
|
|
@ -26,11 +26,14 @@ public final class ZipkinSpanExporterBuilder {
|
||||||
private Supplier<InetAddress> localIpAddressSupplier = LocalInetAddressSupplier.getInstance();
|
private Supplier<InetAddress> localIpAddressSupplier = LocalInetAddressSupplier.getInstance();
|
||||||
@Nullable private Sender sender;
|
@Nullable private Sender sender;
|
||||||
private String endpoint = ZipkinSpanExporter.DEFAULT_ENDPOINT;
|
private String endpoint = ZipkinSpanExporter.DEFAULT_ENDPOINT;
|
||||||
|
// compression is enabled by default, because this is the default of OkHttpSender,
|
||||||
|
// which is created when no custom sender is set (see OkHttpSender.Builder)
|
||||||
|
private boolean compressionEnabled = true;
|
||||||
private long readTimeoutMillis = TimeUnit.SECONDS.toMillis(10);
|
private long readTimeoutMillis = TimeUnit.SECONDS.toMillis(10);
|
||||||
private MeterProvider meterProvider = MeterProvider.noop();
|
private MeterProvider meterProvider = MeterProvider.noop();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the Zipkin sender. Implements the client side of the span transport. A {@link
|
* Sets the Zipkin sender. Implements the client side of the span transport. An {@link
|
||||||
* OkHttpSender} is a good default.
|
* OkHttpSender} is a good default.
|
||||||
*
|
*
|
||||||
* <p>The {@link Sender#close()} method will be called when the exporter is shut down.
|
* <p>The {@link Sender#close()} method will be called when the exporter is shut down.
|
||||||
|
|
@ -75,7 +78,7 @@ public final class ZipkinSpanExporterBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the zipkin endpoint. This will use the endpoint to assign a {@link OkHttpSender} instance
|
* Sets the zipkin endpoint. This will use the endpoint to assign an {@link OkHttpSender} instance
|
||||||
* to this builder.
|
* to this builder.
|
||||||
*
|
*
|
||||||
* @param endpoint The Zipkin endpoint URL, ex. "http://zipkinhost:9411/api/v2/spans".
|
* @param endpoint The Zipkin endpoint URL, ex. "http://zipkinhost:9411/api/v2/spans".
|
||||||
|
|
@ -88,6 +91,26 @@ public final class ZipkinSpanExporterBuilder {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the method used to compress payloads. If unset, gzip compression is enabled. Currently
|
||||||
|
* supported compression methods include "gzip" and "none".
|
||||||
|
*
|
||||||
|
* <p>The compression method is ignored when a custom Zipkin sender is set via {@link
|
||||||
|
* #setSender(Sender)}.
|
||||||
|
*
|
||||||
|
* @param compressionMethod The compression method, ex. "gzip".
|
||||||
|
* @return this.
|
||||||
|
* @see OkHttpSender
|
||||||
|
*/
|
||||||
|
public ZipkinSpanExporterBuilder setCompression(String compressionMethod) {
|
||||||
|
requireNonNull(compressionMethod, "compressionMethod");
|
||||||
|
checkArgument(
|
||||||
|
compressionMethod.equals("gzip") || compressionMethod.equals("none"),
|
||||||
|
"Unsupported compression method. Supported compression methods include: gzip, none.");
|
||||||
|
this.compressionEnabled = compressionMethod.equals("gzip");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the maximum time to wait for the export of a batch of spans. If unset, defaults to 10s.
|
* Sets the maximum time to wait for the export of a batch of spans. If unset, defaults to 10s.
|
||||||
*
|
*
|
||||||
|
|
@ -135,7 +158,11 @@ public final class ZipkinSpanExporterBuilder {
|
||||||
Sender sender = this.sender;
|
Sender sender = this.sender;
|
||||||
if (sender == null) {
|
if (sender == null) {
|
||||||
sender =
|
sender =
|
||||||
OkHttpSender.newBuilder().endpoint(endpoint).readTimeout((int) readTimeoutMillis).build();
|
OkHttpSender.newBuilder()
|
||||||
|
.endpoint(endpoint)
|
||||||
|
.compressionEnabled(compressionEnabled)
|
||||||
|
.readTimeout((int) readTimeoutMillis)
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
OtelToZipkinSpanTransformer transformer =
|
OtelToZipkinSpanTransformer transformer =
|
||||||
OtelToZipkinSpanTransformer.create(localIpAddressSupplier);
|
OtelToZipkinSpanTransformer.create(localIpAddressSupplier);
|
||||||
|
|
|
||||||
|
|
@ -136,6 +136,10 @@ class ZipkinSpanExporterTest {
|
||||||
.isInstanceOf(NullPointerException.class)
|
.isInstanceOf(NullPointerException.class)
|
||||||
.hasMessage("endpoint");
|
.hasMessage("endpoint");
|
||||||
|
|
||||||
|
assertThatThrownBy(() -> ZipkinSpanExporter.builder().setCompression(null))
|
||||||
|
.isInstanceOf(NullPointerException.class)
|
||||||
|
.hasMessage("compressionMethod");
|
||||||
|
|
||||||
assertThatThrownBy(() -> ZipkinSpanExporter.builder().setSender(null))
|
assertThatThrownBy(() -> ZipkinSpanExporter.builder().setSender(null))
|
||||||
.isInstanceOf(NullPointerException.class)
|
.isInstanceOf(NullPointerException.class)
|
||||||
.hasMessage("sender");
|
.hasMessage("sender");
|
||||||
|
|
@ -144,4 +148,45 @@ class ZipkinSpanExporterTest {
|
||||||
.isInstanceOf(NullPointerException.class)
|
.isInstanceOf(NullPointerException.class)
|
||||||
.hasMessage("encoder");
|
.hasMessage("encoder");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionDefault() {
|
||||||
|
ZipkinSpanExporter exporter = ZipkinSpanExporter.builder().build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter).extracting("sender.compressionEnabled").isEqualTo(true);
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionNone() {
|
||||||
|
ZipkinSpanExporter exporter = ZipkinSpanExporter.builder().setCompression("none").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter).extracting("sender.compressionEnabled").isEqualTo(false);
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionGzip() {
|
||||||
|
ZipkinSpanExporter exporter = ZipkinSpanExporter.builder().setCompression("gzip").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter).extracting("sender.compressionEnabled").isEqualTo(true);
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void compressionEnabledAndDisabled() {
|
||||||
|
ZipkinSpanExporter exporter =
|
||||||
|
ZipkinSpanExporter.builder().setCompression("gzip").setCompression("none").build();
|
||||||
|
try {
|
||||||
|
assertThat(exporter).extracting("sender.compressionEnabled").isEqualTo(false);
|
||||||
|
} finally {
|
||||||
|
exporter.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue