diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt index f352a43e886..fa606968575 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt @@ -1,2 +1,19 @@ Comparing source compatibility of opentelemetry-exporter-otlp-1.64.0-SNAPSHOT.jar against opentelemetry-exporter-otlp-1.63.0.jar -No changes. \ No newline at end of file +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder setMaxRequestBodySize(long) +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder setMaxRequestBodySize(long) +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder setMaxRequestBodySize(long) +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder setMaxRequestMessageSize(long) +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder setMaxRequestMessageSize(long) +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder setMaxRequestMessageSize(long) diff --git a/exporters/otlp/all/src/jmh/java/io/opentelemetry/exporter/otlp/trace/OltpExporterBenchmark.java b/exporters/otlp/all/src/jmh/java/io/opentelemetry/exporter/otlp/trace/OltpExporterBenchmark.java index d73bb2989c2..7a7b4fffaa9 100644 --- a/exporters/otlp/all/src/jmh/java/io/opentelemetry/exporter/otlp/trace/OltpExporterBenchmark.java +++ b/exporters/otlp/all/src/jmh/java/io/opentelemetry/exporter/otlp/trace/OltpExporterBenchmark.java @@ -13,6 +13,7 @@ import io.grpc.stub.StreamObserver; import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.exporter.otlp.internal.GrpcExporter; +import io.opentelemetry.exporter.otlp.internal.GrpcExporterBuilder; import io.opentelemetry.exporter.otlp.internal.HttpExporter; import io.opentelemetry.exporter.otlp.internal.HttpExporterBuilder; import io.opentelemetry.exporter.sender.grpc.managedchannel.internal.UpstreamGrpcSender; @@ -95,7 +96,8 @@ public void setUp() { InternalTelemetryVersion.LATEST, ComponentId.generateLazy(StandardComponentId.ExporterType.OTLP_GRPC_SPAN_EXPORTER), MeterProvider::noop, - URI.create("http://localhost")); + URI.create("http://localhost"), + GrpcExporterBuilder.DEFAULT_MAX_REQUEST_MESSAGE_SIZE); okhttpGrpcSender = new GrpcExporter( @@ -115,7 +117,8 @@ public void setUp() { InternalTelemetryVersion.LATEST, ComponentId.generateLazy(StandardComponentId.ExporterType.OTLP_GRPC_SPAN_EXPORTER), MeterProvider::noop, - URI.create("http://localhost")); + URI.create("http://localhost"), + GrpcExporterBuilder.DEFAULT_MAX_REQUEST_MESSAGE_SIZE); httpExporter = new HttpExporterBuilder( diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java index 9918de27b85..d2b5aa60e54 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java @@ -98,6 +98,13 @@ public OtlpHttpLogRecordExporterBuilder setConnectTimeout(Duration timeout) { return this; } + /** Sets the maximum OTLP HTTP request body size in bytes. If unset, defaults to 64 MiB. */ + public OtlpHttpLogRecordExporterBuilder setMaxRequestBodySize(long maxRequestBodySizeBytes) { + checkArgument(maxRequestBodySizeBytes > 0, "maxRequestBodySizeBytes must be positive"); + delegate.setMaxRequestBodySize(maxRequestBodySizeBytes); + return this; + } + /** * Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT}. The * endpoint must start with either http:// or https://, and include the full HTTP path. diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java index d408c5543f5..d0fb197c3dd 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java @@ -118,6 +118,13 @@ public OtlpHttpMetricExporterBuilder setConnectTimeout(Duration timeout) { return this; } + /** Sets the maximum OTLP HTTP request body size in bytes. If unset, defaults to 64 MiB. */ + public OtlpHttpMetricExporterBuilder setMaxRequestBodySize(long maxRequestBodySizeBytes) { + checkArgument(maxRequestBodySizeBytes > 0, "maxRequestBodySizeBytes must be positive"); + delegate.setMaxRequestBodySize(maxRequestBodySizeBytes); + return this; + } + /** * Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT}. The * endpoint must start with either http:// or https://, and include the full HTTP path. diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java index 11f3e2d63a9..df125287f76 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java @@ -98,6 +98,13 @@ public OtlpHttpSpanExporterBuilder setConnectTimeout(Duration timeout) { return this; } + /** Sets the maximum OTLP HTTP request body size in bytes. If unset, defaults to 64 MiB. */ + public OtlpHttpSpanExporterBuilder setMaxRequestBodySize(long maxRequestBodySizeBytes) { + checkArgument(maxRequestBodySizeBytes > 0, "maxRequestBodySizeBytes must be positive"); + delegate.setMaxRequestBodySize(maxRequestBodySizeBytes); + return this; + } + /** * Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT}. The * endpoint must start with either http:// or https://, and include the full HTTP path. diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/GrpcExporter.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/GrpcExporter.java index 62d5695baf0..851940f5f31 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/GrpcExporter.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/GrpcExporter.java @@ -14,8 +14,11 @@ import io.opentelemetry.sdk.common.export.GrpcResponse; import io.opentelemetry.sdk.common.export.GrpcSender; import io.opentelemetry.sdk.common.export.GrpcStatusCode; +import io.opentelemetry.sdk.common.export.MessageWriter; import io.opentelemetry.sdk.common.internal.StandardComponentId; import io.opentelemetry.sdk.common.internal.ThrottlingLogger; +import java.io.IOException; +import java.io.OutputStream; import java.net.URI; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; @@ -42,18 +45,21 @@ public final class GrpcExporter { private final String type; private final GrpcSender grpcSender; private final ExporterInstrumentation exporterMetrics; + private final long maxRequestMessageSize; public GrpcExporter( GrpcSender grpcSender, InternalTelemetryVersion internalTelemetryVersion, StandardComponentId componentId, Supplier meterProviderSupplier, - URI endpoint) { + URI endpoint, + long maxRequestMessageSize) { this.type = componentId.getStandardType().signal().logFriendlyName(); this.grpcSender = grpcSender; this.exporterMetrics = new ExporterInstrumentation( internalTelemetryVersion, meterProviderSupplier, componentId, endpoint); + this.maxRequestMessageSize = maxRequestMessageSize; } public CompletableResultCode export(Marshaler exportRequest, int numItems) { @@ -64,16 +70,73 @@ public CompletableResultCode export(Marshaler exportRequest, int numItems) { ExporterInstrumentation.Recording metricRecording = exporterMetrics.startRecordingExport(numItems); + MessageWriter messageWriter = exportRequest.toBinaryMessageWriter(); + + long requestMessageSize = getRequestMessageSize(messageWriter); + if (requestMessageSize > maxRequestMessageSize) { + return failRequestTooLarge(metricRecording, requestMessageSize); + } + CompletableResultCode result = new CompletableResultCode(); grpcSender.send( - exportRequest.toBinaryMessageWriter(), + messageWriter, grpcResponse -> onResponse(result, metricRecording, grpcResponse), throwable -> onError(result, metricRecording, throwable)); return result; } + private CompletableResultCode failRequestTooLarge( + ExporterInstrumentation.Recording metricRecording, long requestMessageSize) { + String errorMessage = + "Failed to export " + + type + + "s. Request message size " + + requestMessageSize + + " exceeded limit of " + + maxRequestMessageSize + + " bytes"; + IOException exception = new IOException(errorMessage); + metricRecording.finishFailed(exception); + logger.log(Level.WARNING, errorMessage); + CompletableResultCode result = new CompletableResultCode(); + result.failExceptionally(FailedExportException.grpcFailedExceptionally(exception)); + return result; + } + + private static long getRequestMessageSize(MessageWriter messageWriter) { + int contentLength = messageWriter.getContentLength(); + if (contentLength >= 0) { + return contentLength; + } + try { + CountingOutputStream countingOutputStream = new CountingOutputStream(); + messageWriter.writeMessage(countingOutputStream); + return countingOutputStream.getCount(); + } catch (IOException e) { + return Long.MAX_VALUE; + } + } + + private static final class CountingOutputStream extends OutputStream { + private long count; + + @Override + public void write(int b) { + count++; + } + + @Override + public void write(byte[] b, int off, int len) { + count += len; + } + + private long getCount() { + return count; + } + } + private void onResponse( CompletableResultCode result, ExporterInstrumentation.Recording metricRecording, diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterBuilder.java index ad5b9cbd0d1..814fd62da3b 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterBuilder.java @@ -47,6 +47,7 @@ public class GrpcExporterBuilder { public static final long DEFAULT_CONNECT_TIMEOUT_SECS = 10; + public static final long DEFAULT_MAX_REQUEST_MESSAGE_SIZE = 64 * 1024L * 1024L; private static final Logger LOGGER = Logger.getLogger(GrpcExporterBuilder.class.getName()); @@ -68,6 +69,7 @@ public class GrpcExporterBuilder { private ComponentLoader componentLoader = ComponentLoader.forClassLoader(GrpcExporterBuilder.class.getClassLoader()); @Nullable private ExecutorService executorService; + private long maxRequestMessageSize = DEFAULT_MAX_REQUEST_MESSAGE_SIZE; // Use Object type since gRPC may not be on the classpath. @Nullable private Object grpcChannel; @@ -170,6 +172,11 @@ public GrpcExporterBuilder setExecutorService(ExecutorService executorService) { return this; } + public GrpcExporterBuilder setMaxRequestMessageSize(long maxRequestMessageSize) { + this.maxRequestMessageSize = maxRequestMessageSize; + return this; + } + @SuppressWarnings("BuilderReturnThis") public GrpcExporterBuilder copy() { GrpcExporterBuilder copy = @@ -189,6 +196,7 @@ public GrpcExporterBuilder copy() { copy.internalTelemetryVersion = internalTelemetryVersion; copy.grpcChannel = grpcChannel; copy.componentLoader = componentLoader; + copy.maxRequestMessageSize = maxRequestMessageSize; return copy; } @@ -240,7 +248,8 @@ public GrpcExporter build() { internalTelemetryVersion, ComponentId.generateLazy(exporterType), meterProviderSupplier, - endpoint); + endpoint, + maxRequestMessageSize); } public String toString(boolean includePrefixAndSuffix) { @@ -272,6 +281,7 @@ public String toString(boolean includePrefixAndSuffix) { if (executorService != null) { joiner.add("executorService=" + executorService); } + joiner.add("maxRequestMessageSize=" + maxRequestMessageSize); joiner.add("exporterType=" + exporterType.toString()); joiner.add("internalTelemetrySchemaVersion=" + internalTelemetryVersion); // Note: omit tlsConfigHelper because we can't log the configuration in any readable way diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/HttpExporter.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/HttpExporter.java index eaaad3c8659..9f187cabdf1 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/HttpExporter.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/HttpExporter.java @@ -42,6 +42,7 @@ public final class HttpExporter { private final HttpSender httpSender; private final ExporterInstrumentation exporterMetrics; private final boolean exportAsJson; + private final long maxRequestBodySize; public HttpExporter( StandardComponentId componentId, @@ -49,13 +50,15 @@ public HttpExporter( Supplier meterProviderSupplier, InternalTelemetryVersion internalTelemetryVersion, URI endpoint, - boolean exportAsJson) { + boolean exportAsJson, + long maxRequestBodySize) { this.type = componentId.getStandardType().signal().logFriendlyName(); this.httpSender = httpSender; this.exporterMetrics = new ExporterInstrumentation( internalTelemetryVersion, meterProviderSupplier, componentId, endpoint); this.exportAsJson = exportAsJson; + this.maxRequestBodySize = maxRequestBodySize; } public CompletableResultCode export(Marshaler exportRequest, int numItems) { @@ -66,10 +69,16 @@ public CompletableResultCode export(Marshaler exportRequest, int numItems) { ExporterInstrumentation.Recording metricRecording = exporterMetrics.startRecordingExport(numItems); - CompletableResultCode result = new CompletableResultCode(); MessageWriter messageWriter = exportAsJson ? exportRequest.toJsonMessageWriter() : exportRequest.toBinaryMessageWriter(); + int requestBodySize = messageWriter.getContentLength(); + if (requestBodySize > maxRequestBodySize) { + return failRequestTooLarge(metricRecording, requestBodySize); + } + + CompletableResultCode result = new CompletableResultCode(); + httpSender.send( messageWriter, httpResponse -> onResponse(result, metricRecording, httpResponse), @@ -78,6 +87,24 @@ public CompletableResultCode export(Marshaler exportRequest, int numItems) { return result; } + private CompletableResultCode failRequestTooLarge( + ExporterInstrumentation.Recording metricRecording, long requestBodySize) { + String errorMessage = + "Failed to export " + + type + + "s. Request body size " + + requestBodySize + + " exceeded limit of " + + maxRequestBodySize + + " bytes"; + IOException exception = new IOException(errorMessage); + metricRecording.finishFailed(exception); + logger.log(Level.WARNING, errorMessage); + CompletableResultCode result = new CompletableResultCode(); + result.failExceptionally(FailedExportException.httpFailedExceptionally(exception)); + return result; + } + private void onResponse( CompletableResultCode result, ExporterInstrumentation.Recording metricRecording, diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/HttpExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/HttpExporterBuilder.java index 98a5a2e2b85..e211d39e8c8 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/HttpExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/HttpExporterBuilder.java @@ -46,6 +46,7 @@ public final class HttpExporterBuilder { public static final long DEFAULT_TIMEOUT_SECS = 10; public static final long DEFAULT_CONNECT_TIMEOUT_SECS = 10; + public static final long DEFAULT_MAX_REQUEST_BODY_SIZE = 64 * 1024L * 1024L; private static final Logger LOGGER = Logger.getLogger(HttpExporterBuilder.class.getName()); @@ -69,6 +70,7 @@ public final class HttpExporterBuilder { private ComponentLoader componentLoader = ComponentLoader.forClassLoader(HttpExporterBuilder.class.getClassLoader()); @Nullable private ExecutorService executorService; + private long maxRequestBodySize = DEFAULT_MAX_REQUEST_BODY_SIZE; public HttpExporterBuilder( StandardComponentId.ExporterType exporterType, String defaultEndpoint) { @@ -167,6 +169,11 @@ public HttpExporterBuilder setExecutorService(ExecutorService executorService) { return this; } + public HttpExporterBuilder setMaxRequestBodySize(long maxRequestBodySize) { + this.maxRequestBodySize = maxRequestBodySize; + return this; + } + public HttpExporterBuilder exportAsJson() { this.exportAsJson = true; exporterType = mapToJsonTypeIfPossible(exporterType); @@ -204,6 +211,7 @@ public HttpExporterBuilder copy() { copy.internalTelemetryVersion = internalTelemetryVersion; copy.proxyOptions = proxyOptions; copy.componentLoader = componentLoader; + copy.maxRequestBodySize = maxRequestBodySize; return copy; } @@ -256,7 +264,8 @@ public HttpExporter build() { meterProviderSupplier, internalTelemetryVersion, endpoint, - exportAsJson); + exportAsJson, + maxRequestBodySize); } public String toString(boolean includePrefixAndSuffix) { @@ -286,6 +295,7 @@ public String toString(boolean includePrefixAndSuffix) { if (executorService != null) { joiner.add("executorService=" + executorService); } + joiner.add("maxRequestBodySize=" + maxRequestBodySize); joiner.add("exporterType=" + exporterType); joiner.add("internalTelemetrySchemaVersion=" + internalTelemetryVersion); // Note: omit tlsConfigHelper because we can't log the configuration in any readable way diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java index e111962d83e..59353446460 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java @@ -127,6 +127,15 @@ public OtlpGrpcLogRecordExporterBuilder setConnectTimeout(Duration timeout) { return this; } + /** Sets the maximum OTLP gRPC request message size in bytes. If unset, defaults to 64 MiB. */ + public OtlpGrpcLogRecordExporterBuilder setMaxRequestMessageSize( + long maxRequestMessageSizeBytes) { + checkArgument( + maxRequestMessageSizeBytes > 0, "maxRequestMessageSizeBytes must be positive"); + delegate.setMaxRequestMessageSize(maxRequestMessageSizeBytes); + return this; + } + /** * Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT_URL}. The * endpoint must start with either http:// or https://. diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java index 73e0861e6cd..c0704b324de 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java @@ -146,6 +146,14 @@ public OtlpGrpcMetricExporterBuilder setConnectTimeout(Duration timeout) { return this; } + /** Sets the maximum OTLP gRPC request message size in bytes. If unset, defaults to 64 MiB. */ + public OtlpGrpcMetricExporterBuilder setMaxRequestMessageSize(long maxRequestMessageSizeBytes) { + checkArgument( + maxRequestMessageSizeBytes > 0, "maxRequestMessageSizeBytes must be positive"); + delegate.setMaxRequestMessageSize(maxRequestMessageSizeBytes); + return this; + } + /** * Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT_URL}. The * endpoint must start with either http:// or https://. diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java index edceb408381..179205fd988 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanExporterBuilder.java @@ -124,6 +124,14 @@ public OtlpGrpcSpanExporterBuilder setConnectTimeout(Duration timeout) { return this; } + /** Sets the maximum OTLP gRPC request message size in bytes. If unset, defaults to 64 MiB. */ + public OtlpGrpcSpanExporterBuilder setMaxRequestMessageSize(long maxRequestMessageSizeBytes) { + checkArgument( + maxRequestMessageSizeBytes > 0, "maxRequestMessageSizeBytes must be positive"); + delegate.setMaxRequestMessageSize(maxRequestMessageSizeBytes); + return this; + } + /** * Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT_URL}. The * endpoint must start with either http:// or https://. diff --git a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterBuilderTest.java b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterBuilderTest.java index 70db9cd2639..95f0f1c83e1 100644 --- a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterBuilderTest.java +++ b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterBuilderTest.java @@ -94,4 +94,11 @@ void compressionString_usesServiceClassLoader() { builder.setCompression("none"); assertThat(builder).extracting("compressor").isNull(); } + + @Test + void maxRequestMessageSize() { + builder.setMaxRequestMessageSize(1234); + + assertThat(builder).extracting("maxRequestMessageSize").isEqualTo(1234L); + } } diff --git a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterTest.java b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterTest.java index a618b8574c8..59093b9d0cf 100644 --- a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterTest.java +++ b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/GrpcExporterTest.java @@ -9,7 +9,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.verifyNoInteractions; +import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.exporter.internal.marshal.Marshaler; import io.opentelemetry.internal.testing.slf4j.SuppressLogger; @@ -17,6 +19,7 @@ import io.opentelemetry.sdk.common.export.GrpcResponse; import io.opentelemetry.sdk.common.export.GrpcSender; import io.opentelemetry.sdk.common.export.GrpcStatusCode; +import io.opentelemetry.sdk.common.export.MessageWriter; import io.opentelemetry.sdk.common.internal.ComponentId; import io.opentelemetry.sdk.common.internal.SemConvAttributes; import io.opentelemetry.sdk.common.internal.StandardComponentId; @@ -24,9 +27,12 @@ import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; import java.io.IOException; +import java.io.OutputStream; import java.net.URI; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import javax.annotation.Nullable; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.Mockito; @@ -81,7 +87,8 @@ void testInternalTelemetry(StandardComponentId.ExporterType exporterType) { InternalTelemetryVersion.LATEST, id, () -> meterProvider, - URI.create("http://testing:1234")); + URI.create("http://testing:1234"), + GrpcExporterBuilder.DEFAULT_MAX_REQUEST_MESSAGE_SIZE); doAnswer( invoc -> { @@ -206,6 +213,41 @@ void testInternalTelemetry(StandardComponentId.ExporterType exporterType) { } } + @Test + @SuppressLogger(GrpcExporter.class) + void export_requestMessageTooLargeFailsBeforeSend() { + GrpcSender mockSender = Mockito.mock(GrpcSender.class); + GrpcExporter exporter = + new GrpcExporter( + mockSender, + InternalTelemetryVersion.LATEST, + ComponentId.generateLazy(StandardComponentId.ExporterType.OTLP_GRPC_SPAN_EXPORTER), + MeterProvider::noop, + URI.create("http://testing:1234"), + 1); + + Marshaler mockMarshaller = Mockito.mock(Marshaler.class); + MessageWriter messageWriter = + new MessageWriter() { + @Override + public void writeMessage(OutputStream output) throws IOException {} + + @Override + public int getContentLength() { + return 2; + } + }; + Mockito.when(mockMarshaller.toBinaryMessageWriter()).thenReturn(messageWriter); + + io.opentelemetry.sdk.common.CompletableResultCode result = exporter.export(mockMarshaller, 1); + + assertThat(result.join(10, TimeUnit.SECONDS).isSuccess()).isFalse(); + assertThat(result.getFailureThrowable()) + .hasMessageContaining( + "Failed to export spans. Request message size 2 exceeded limit of 1 bytes"); + verifyNoInteractions(mockSender); + } + private static GrpcResponse grpcResponse(GrpcStatusCode statusCode) { return new GrpcResponse() { @Override diff --git a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/HttpExporterBuilderTest.java b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/HttpExporterBuilderTest.java index 4cbfc023be2..8e016ed5aa1 100644 --- a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/HttpExporterBuilderTest.java +++ b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/HttpExporterBuilderTest.java @@ -89,4 +89,11 @@ void compressionString_usesServiceClassLoader() { builder.setCompression("none"); assertThat(builder).extracting("compressor").isNull(); } + + @Test + void maxRequestBodySize() { + builder.setMaxRequestBodySize(1234); + + assertThat(builder).extracting("maxRequestBodySize").isEqualTo(1234L); + } } diff --git a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/HttpExporterTest.java b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/HttpExporterTest.java index f44de7f72ce..a707f03fd34 100644 --- a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/HttpExporterTest.java +++ b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/HttpExporterTest.java @@ -8,21 +8,27 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.verifyNoInteractions; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.exporter.internal.marshal.Marshaler; import io.opentelemetry.internal.testing.slf4j.SuppressLogger; import io.opentelemetry.sdk.common.InternalTelemetryVersion; import io.opentelemetry.sdk.common.export.HttpResponse; import io.opentelemetry.sdk.common.export.HttpSender; +import io.opentelemetry.sdk.common.export.MessageWriter; import io.opentelemetry.sdk.common.internal.ComponentId; import io.opentelemetry.sdk.common.internal.SemConvAttributes; import io.opentelemetry.sdk.common.internal.StandardComponentId; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; import java.io.IOException; +import java.io.OutputStream; import java.net.URI; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.Mockito; @@ -78,7 +84,8 @@ void testInternalTelemetry(StandardComponentId.ExporterType exporterType) { () -> meterProvider, InternalTelemetryVersion.LATEST, URI.create("http://testing:1234"), - false); + false, + HttpExporterBuilder.DEFAULT_MAX_REQUEST_BODY_SIZE); doAnswer( invoc -> { @@ -197,6 +204,45 @@ void testInternalTelemetry(StandardComponentId.ExporterType exporterType) { } } + @Test + @SuppressLogger(HttpExporter.class) + void export_requestBodyTooLargeFailsBeforeSend() { + HttpSender mockSender = Mockito.mock(HttpSender.class); + HttpExporter exporter = + new HttpExporter( + ComponentId.generateLazy(StandardComponentId.ExporterType.OTLP_HTTP_SPAN_EXPORTER), + mockSender, + MeterProvider::noop, + InternalTelemetryVersion.LATEST, + URI.create("http://testing:1234"), + false, + 1); + + Marshaler mockMarshaller = Mockito.mock(Marshaler.class); + MessageWriter messageWriter = + new MessageWriter() { + @Override + public void writeMessage(OutputStream output) throws IOException { + output.write(new byte[] {1, 2}); + } + + @Override + public int getContentLength() { + return 2; + } + }; + Mockito.when(mockMarshaller.toBinaryMessageWriter()).thenReturn(messageWriter); + + io.opentelemetry.sdk.common.CompletableResultCode result = exporter.export(mockMarshaller, 1); + + org.assertj.core.api.Assertions.assertThat(result.join(10, TimeUnit.SECONDS).isSuccess()) + .isFalse(); + org.assertj.core.api.Assertions.assertThat(result.getFailureThrowable()) + .hasMessageContaining( + "Failed to export spans. Request body size 2 exceeded limit of 1 bytes"); + verifyNoInteractions(mockSender); + } + private static class FakeHttpResponse implements HttpResponse { final int statusCode; diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java index 7e50aa9d274..ee5dc115641 100644 --- a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java +++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/OtlpGrpcProfilesExporterBuilder.java @@ -115,6 +115,16 @@ public OtlpGrpcProfilesExporterBuilder setConnectTimeout(Duration timeout) { return this; } + /** + * Sets the maximum OTLP gRPC request message size in bytes. If unset, defaults to 64 MiB. + */ + public OtlpGrpcProfilesExporterBuilder setMaxRequestMessageSize(long maxRequestMessageSizeBytes) { + checkArgument( + maxRequestMessageSizeBytes > 0, "maxRequestMessageSizeBytes must be positive"); + delegate.setMaxRequestMessageSize(maxRequestMessageSizeBytes); + return this; + } + /** * Sets the OTLP endpoint to connect to. If unset, defaults to {@value DEFAULT_ENDPOINT_URL}. The * endpoint must start with either http:// or https://. diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java index 365fa2ca659..a67b3493e1f 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractGrpcTelemetryExporterTest.java @@ -42,6 +42,7 @@ import io.opentelemetry.exporter.internal.TlsUtil; import io.opentelemetry.exporter.internal.marshal.Marshaler; import io.opentelemetry.exporter.otlp.internal.GrpcExporter; +import io.opentelemetry.exporter.otlp.internal.GrpcExporterBuilder; import io.opentelemetry.internal.testing.slf4j.SuppressLogger; import io.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest; import io.opentelemetry.proto.collector.logs.v1.ExportLogsServiceResponse; @@ -922,7 +923,8 @@ protected void testExport_Unimplemented() { + "s. Server responded with UNIMPLEMENTED. " + "This usually means that your collector is not configured with an otlp " + "receiver in the \"pipelines\" section of the configuration. " - + "If export is not desired and you are using OpenTelemetry autoconfiguration or the javaagent, " + + "If export is not desired and you are using OpenTelemetry autoconfiguration " + + "or the javaagent, " + "disable export by setting " + envVar + "=none. " @@ -1056,6 +1058,8 @@ void validConfig() { assertThatCode( () -> buildAndShutdown(exporterBuilder().setConnectTimeout(Duration.ofMillis(10)))) .doesNotThrowAnyException(); + assertThatCode(() -> buildAndShutdown(exporterBuilder().setMaxRequestMessageSize(1))) + .doesNotThrowAnyException(); assertThatCode(() -> exporterBuilder().setEndpoint("http://localhost:4317")) .doesNotThrowAnyException(); @@ -1166,7 +1170,32 @@ void invalidConfig() { assertThatThrownBy(() -> exporterBuilder().setCompression("foo")) .isInstanceOf(IllegalArgumentException.class) .hasMessage( - "Unsupported compressionMethod. Compression method must be \"none\" or one of: [base64,gzip]"); + "Unsupported compressionMethod. Compression method must be \"none\" or one of:" + + " [base64,gzip]"); + assertThatThrownBy(() -> exporterBuilder().setMaxRequestMessageSize(0)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("maxRequestMessageSizeBytes must be positive"); + assertThatThrownBy(() -> exporterBuilder().setMaxRequestMessageSize(-1)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("maxRequestMessageSizeBytes must be positive"); + } + + @Test + void requestMessageSizeLimit() { + try (TelemetryExporter exporter = + exporterBuilder() + .setEndpoint(server.httpUri().toString()) + .setMaxRequestMessageSize(1) + .build()) { + CompletableResultCode result = + exporter.export(Collections.singletonList(generateFakeTelemetry())); + + assertThat(result.join(10, TimeUnit.SECONDS).isSuccess()).isFalse(); + assertThat(result.getFailureThrowable()) + .hasMessageContaining("Failed to export") + .hasMessageContaining("Request message size") + .hasMessageContaining("exceeded limit of 1 bytes"); + } } @Test @@ -1242,6 +1271,8 @@ void stringRepresentation() throws IOException, CertificateEncodingException { + ", " + "compressorEncoding=null, " + "headers=Headers\\{User-Agent=OBFUSCATED\\}" + + ".*maxRequestMessageSize=" + + GrpcExporterBuilder.DEFAULT_MAX_REQUEST_MESSAGE_SIZE + ".*" // Maybe additional grpcChannel field, signal specific fields + "\\}"); } @@ -1278,7 +1309,11 @@ void stringRepresentation() throws IOException, CertificateEncodingException { + ", " + "compressorEncoding=gzip, " + "headers=Headers\\{.*foo=OBFUSCATED.*\\}, " - + "retryPolicy=RetryPolicy\\{maxAttempts=2, initialBackoff=PT0\\.05S, maxBackoff=PT3S, backoffMultiplier=1\\.3, retryExceptionPredicate=null\\}" + + "retryPolicy=RetryPolicy\\{maxAttempts=2, initialBackoff=PT0\\.05S, " + + "maxBackoff=PT3S, backoffMultiplier=1\\.3, " + + "retryExceptionPredicate=null\\}" + + ".*maxRequestMessageSize=" + + GrpcExporterBuilder.DEFAULT_MAX_REQUEST_MESSAGE_SIZE + ".*" // Maybe additional grpcChannel field, signal specific fields + "\\}"); } diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractHttpTelemetryExporterTest.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractHttpTelemetryExporterTest.java index 9b21a1c206a..4510413405f 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractHttpTelemetryExporterTest.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/AbstractHttpTelemetryExporterTest.java @@ -35,6 +35,7 @@ import io.opentelemetry.exporter.internal.TlsUtil; import io.opentelemetry.exporter.internal.marshal.Marshaler; import io.opentelemetry.exporter.otlp.internal.HttpExporter; +import io.opentelemetry.exporter.otlp.internal.HttpExporterBuilder; import io.opentelemetry.internal.testing.slf4j.SuppressLogger; import io.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest; import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest; @@ -832,6 +833,8 @@ void validConfig() { assertThatCode( () -> buildAndShutdown(exporterBuilder().setConnectTimeout(Duration.ofMillis(10)))) .doesNotThrowAnyException(); + assertThatCode(() -> buildAndShutdown(exporterBuilder().setMaxRequestBodySize(1))) + .doesNotThrowAnyException(); assertThatCode(() -> exporterBuilder().setEndpoint("http://localhost:4318")) .doesNotThrowAnyException(); @@ -911,7 +914,29 @@ void invalidConfig() { assertThatThrownBy(() -> exporterBuilder().setCompression("foo")) .isInstanceOf(IllegalArgumentException.class) .hasMessage( - "Unsupported compressionMethod. Compression method must be \"none\" or one of: [base64,gzip]"); + "Unsupported compressionMethod. Compression method must be \"none\" or one of:" + + " [base64,gzip]"); + assertThatThrownBy(() -> exporterBuilder().setMaxRequestBodySize(0)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("maxRequestBodySizeBytes must be positive"); + assertThatThrownBy(() -> exporterBuilder().setMaxRequestBodySize(-1)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("maxRequestBodySizeBytes must be positive"); + } + + @Test + void requestBodySizeLimit() { + try (TelemetryExporter exporter = + exporterBuilder().setEndpoint(server.httpUri() + path).setMaxRequestBodySize(1).build()) { + CompletableResultCode result = + exporter.export(Collections.singletonList(generateFakeTelemetry())); + + assertThat(result.join(10, TimeUnit.SECONDS).isSuccess()).isFalse(); + assertThat(result.getFailureThrowable()) + .hasMessageContaining("Failed to export") + .hasMessageContaining("Request body size") + .hasMessageContaining("exceeded limit of 1 bytes"); + } } @Test @@ -1020,6 +1045,8 @@ void stringRepresentation() throws IOException, CertificateEncodingException { + ", " + "exportAsJson=false, " + "headers=Headers\\{User-Agent=OBFUSCATED\\}" + + ".*maxRequestBodySize=" + + HttpExporterBuilder.DEFAULT_MAX_REQUEST_BODY_SIZE + ".*" // Maybe additional signal specific fields + "\\}"); } @@ -1057,7 +1084,11 @@ void stringRepresentation() throws IOException, CertificateEncodingException { + ", " + "exportAsJson=false, " + "headers=Headers\\{.*foo=OBFUSCATED.*\\}, " - + "retryPolicy=RetryPolicy\\{maxAttempts=2, initialBackoff=PT0\\.05S, maxBackoff=PT3S, backoffMultiplier=1\\.3, retryExceptionPredicate=null\\}" + + "retryPolicy=RetryPolicy\\{maxAttempts=2, initialBackoff=PT0\\.05S, " + + "maxBackoff=PT3S, backoffMultiplier=1\\.3, " + + "retryExceptionPredicate=null\\}" + + ".*maxRequestBodySize=" + + HttpExporterBuilder.DEFAULT_MAX_REQUEST_BODY_SIZE + ".*" // Maybe additional signal specific fields + "\\}"); } diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcLogRecordExporterBuilderWrapper.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcLogRecordExporterBuilderWrapper.java index 87165e2467d..03e3b20da5f 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcLogRecordExporterBuilderWrapper.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcLogRecordExporterBuilderWrapper.java @@ -59,6 +59,18 @@ public TelemetryExporterBuilder setConnectTimeout(Duration timeou return this; } + @Override + public TelemetryExporterBuilder setMaxRequestBodySize(long maxRequestBodySize) { + throw new UnsupportedOperationException("Request body size is not supported for gRPC"); + } + + @Override + public TelemetryExporterBuilder setMaxRequestMessageSize( + long maxRequestMessageSize) { + builder.setMaxRequestMessageSize(maxRequestMessageSize); + return this; + } + @Override public TelemetryExporterBuilder setCompression(String compression) { builder.setCompression(compression); diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcMetricExporterBuilderWrapper.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcMetricExporterBuilderWrapper.java index f0bda1c9ac4..313614f69af 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcMetricExporterBuilderWrapper.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcMetricExporterBuilderWrapper.java @@ -59,6 +59,17 @@ public TelemetryExporterBuilder setConnectTimeout(Duration timeout) return this; } + @Override + public TelemetryExporterBuilder setMaxRequestBodySize(long maxRequestBodySize) { + throw new UnsupportedOperationException("Request body size is not supported for gRPC"); + } + + @Override + public TelemetryExporterBuilder setMaxRequestMessageSize(long maxRequestMessageSize) { + builder.setMaxRequestMessageSize(maxRequestMessageSize); + return this; + } + @Override public TelemetryExporterBuilder setCompression(String compression) { builder.setCompression(compression); diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcProfilesExporterBuilderWrapper.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcProfilesExporterBuilderWrapper.java index ac34a9504e2..3c0986f5798 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcProfilesExporterBuilderWrapper.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcProfilesExporterBuilderWrapper.java @@ -59,6 +59,18 @@ public TelemetryExporterBuilder setConnectTimeout(Duration timeout) return this; } + @Override + public TelemetryExporterBuilder setMaxRequestBodySize(long maxRequestBodySize) { + throw new UnsupportedOperationException("Request body size is not supported for gRPC"); + } + + @Override + public TelemetryExporterBuilder setMaxRequestMessageSize( + long maxRequestMessageSize) { + builder.setMaxRequestMessageSize(maxRequestMessageSize); + return this; + } + @Override public TelemetryExporterBuilder setCompression(String compression) { builder.setCompression(compression); diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcSpanExporterBuilderWrapper.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcSpanExporterBuilderWrapper.java index 06eb21c5850..76fc9596137 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcSpanExporterBuilderWrapper.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/GrpcSpanExporterBuilderWrapper.java @@ -60,6 +60,17 @@ public TelemetryExporterBuilder setConnectTimeout(Duration timeout) { return this; } + @Override + public TelemetryExporterBuilder setMaxRequestBodySize(long maxRequestBodySize) { + throw new UnsupportedOperationException("Request body size is not supported for gRPC"); + } + + @Override + public TelemetryExporterBuilder setMaxRequestMessageSize(long maxRequestMessageSize) { + builder.setMaxRequestMessageSize(maxRequestMessageSize); + return this; + } + @Override public TelemetryExporterBuilder setCompression(String compression) { builder.setCompression(compression); diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpLogRecordExporterBuilderWrapper.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpLogRecordExporterBuilderWrapper.java index 8963b2c21b0..466ddf9caab 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpLogRecordExporterBuilderWrapper.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpLogRecordExporterBuilderWrapper.java @@ -60,6 +60,18 @@ public TelemetryExporterBuilder setConnectTimeout(Duration timeou return this; } + @Override + public TelemetryExporterBuilder setMaxRequestBodySize(long maxRequestBodySize) { + builder.setMaxRequestBodySize(maxRequestBodySize); + return this; + } + + @Override + public TelemetryExporterBuilder setMaxRequestMessageSize( + long maxRequestMessageSize) { + throw new UnsupportedOperationException("Request message size is not supported for HTTP"); + } + @Override public TelemetryExporterBuilder setCompression(String compression) { builder.setCompression(compression); diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpMetricExporterBuilderWrapper.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpMetricExporterBuilderWrapper.java index e9152cfac0c..f38e44274e0 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpMetricExporterBuilderWrapper.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpMetricExporterBuilderWrapper.java @@ -59,6 +59,17 @@ public TelemetryExporterBuilder setConnectTimeout(Duration timeout) return this; } + @Override + public TelemetryExporterBuilder setMaxRequestBodySize(long maxRequestBodySize) { + builder.setMaxRequestBodySize(maxRequestBodySize); + return this; + } + + @Override + public TelemetryExporterBuilder setMaxRequestMessageSize(long maxRequestMessageSize) { + throw new UnsupportedOperationException("Request message size is not supported for HTTP"); + } + @Override public TelemetryExporterBuilder setCompression(String compression) { builder.setCompression(compression); diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpSpanExporterBuilderWrapper.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpSpanExporterBuilderWrapper.java index d3a51130ff6..4eebc551d25 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpSpanExporterBuilderWrapper.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/HttpSpanExporterBuilderWrapper.java @@ -59,6 +59,17 @@ public TelemetryExporterBuilder setConnectTimeout(Duration timeout) { return this; } + @Override + public TelemetryExporterBuilder setMaxRequestBodySize(long maxRequestBodySize) { + builder.setMaxRequestBodySize(maxRequestBodySize); + return this; + } + + @Override + public TelemetryExporterBuilder setMaxRequestMessageSize(long maxRequestMessageSize) { + throw new UnsupportedOperationException("Request message size is not supported for HTTP"); + } + @Override public TelemetryExporterBuilder setCompression(String compression) { builder.setCompression(compression); diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java index 55d20c4bd0d..76b4610c412 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/ManagedChannelTelemetryExporterBuilder.java @@ -103,6 +103,17 @@ public TelemetryExporterBuilder setConnectTimeout(Duration timeout) { return this; } + @Override + public TelemetryExporterBuilder setMaxRequestBodySize(long maxRequestBodySize) { + throw new UnsupportedOperationException("Request body size is not supported for gRPC"); + } + + @Override + public TelemetryExporterBuilder setMaxRequestMessageSize(long maxRequestMessageSize) { + delegate.setMaxRequestMessageSize(maxRequestMessageSize); + return this; + } + @Override public TelemetryExporterBuilder setCompression(String compression) { delegate.setCompression(compression); diff --git a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/TelemetryExporterBuilder.java b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/TelemetryExporterBuilder.java index 779cc63905e..0bd5b9cd2ac 100644 --- a/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/TelemetryExporterBuilder.java +++ b/exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/TelemetryExporterBuilder.java @@ -55,6 +55,10 @@ static TelemetryExporterBuilder wrap(OtlpGrpcProfilesExporterBuilde TelemetryExporterBuilder setConnectTimeout(Duration timeout); + TelemetryExporterBuilder setMaxRequestBodySize(long maxRequestBodySize); + + TelemetryExporterBuilder setMaxRequestMessageSize(long maxRequestMessageSize); + TelemetryExporterBuilder setCompression(String compression); TelemetryExporterBuilder addHeader(String key, String value);