From c46b1770d0794144e7bd0549f0b666c5ce9ecdf7 Mon Sep 17 00:00:00 2001 From: David Sondermann Date: Fri, 23 Sep 2022 05:03:26 +0200 Subject: [PATCH] Add compression configuration to ZipkinSpanExporterBuilder --- .../opentelemetry-exporter-zipkin.txt | 4 +- .../zipkin/ZipkinSpanExporterBuilder.java | 33 ++++++++++++-- .../zipkin/ZipkinSpanExporterTest.java | 45 +++++++++++++++++++ 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt index df26146497b..535314c07b1 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-zipkin.txt @@ -1,2 +1,4 @@ Comparing source compatibility of against -No changes. \ No newline at end of file +*** 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) diff --git a/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporterBuilder.java b/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporterBuilder.java index 9e3731aff76..ba896ad1bdd 100644 --- a/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporterBuilder.java +++ b/exporters/zipkin/src/main/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporterBuilder.java @@ -26,11 +26,14 @@ public final class ZipkinSpanExporterBuilder { private Supplier localIpAddressSupplier = LocalInetAddressSupplier.getInstance(); @Nullable private Sender sender; 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 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. * *

The {@link Sender#close()} method will be called when the exporter is shut down. @@ -75,7 +78,7 @@ public ZipkinSpanExporterBuilder setLocalIpAddressSupplier(Supplier } /** - * 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. * * @param endpoint The Zipkin endpoint URL, ex. "http://zipkinhost:9411/api/v2/spans". @@ -88,6 +91,26 @@ public ZipkinSpanExporterBuilder setEndpoint(String endpoint) { return this; } + /** + * Sets the method used to compress payloads. If unset, compression is enabled. Currently + * supported compression methods include "gzip" and "none". + * + *

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. * @@ -135,7 +158,11 @@ public ZipkinSpanExporter build() { Sender sender = this.sender; if (sender == null) { sender = - OkHttpSender.newBuilder().endpoint(endpoint).readTimeout((int) readTimeoutMillis).build(); + OkHttpSender.newBuilder() + .endpoint(endpoint) + .compressionEnabled(compressionEnabled) + .readTimeout((int) readTimeoutMillis) + .build(); } OtelToZipkinSpanTransformer transformer = OtelToZipkinSpanTransformer.create(localIpAddressSupplier); diff --git a/exporters/zipkin/src/test/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporterTest.java b/exporters/zipkin/src/test/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporterTest.java index 7fab654b511..56ad4ff81cc 100644 --- a/exporters/zipkin/src/test/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporterTest.java +++ b/exporters/zipkin/src/test/java/io/opentelemetry/exporter/zipkin/ZipkinSpanExporterTest.java @@ -136,6 +136,10 @@ void invalidConfig() { .isInstanceOf(NullPointerException.class) .hasMessage("endpoint"); + assertThatThrownBy(() -> ZipkinSpanExporter.builder().setCompression(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("compressionMethod"); + assertThatThrownBy(() -> ZipkinSpanExporter.builder().setSender(null)) .isInstanceOf(NullPointerException.class) .hasMessage("sender"); @@ -144,4 +148,45 @@ void invalidConfig() { .isInstanceOf(NullPointerException.class) .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(); + } + } }