From b923351a071f362a5b2d572279cf55a63f83f27a Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Tue, 21 May 2024 15:15:24 -0500 Subject: [PATCH] Make OTLP exporter memory mode API public --- .../opentelemetry-exporter-otlp.txt | 19 +++- .../OtlpHttpLogRecordExporterBuilder.java | 9 +- .../OtlpHttpMetricExporterBuilder.java | 16 +++- .../trace/OtlpHttpSpanExporterBuilder.java | 9 +- .../otlp/internal/OtlpConfigUtil.java | 91 ++----------------- .../OtlpLogRecordExporterProvider.java | 13 +-- .../internal/OtlpMetricExporterProvider.java | 13 +-- .../internal/OtlpSpanExporterProvider.java | 14 +-- .../OtlpGrpcLogRecordExporterBuilder.java | 9 +- .../exporter/otlp/logs/OtlpGrpcLogUtil.java | 19 ---- .../OtlpGrpcMetricExporterBuilder.java | 16 +++- .../otlp/metrics/OtlpGrpcMetricUtil.java | 19 ---- .../trace/OtlpGrpcSpanExporterBuilder.java | 9 +- .../exporter/otlp/trace/OtlpGrpcSpanUtil.java | 19 ---- .../otlp/internal/OtlpConfigUtilTest.java | 1 + .../OtlpExporterIntegrationTest.java | 81 ++++++++++++++--- 16 files changed, 164 insertions(+), 193 deletions(-) delete mode 100644 exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogUtil.java delete mode 100644 exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricUtil.java delete mode 100644 exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanUtil.java diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt b/docs/apidiffs/current_vs_latest/opentelemetry-exporter-otlp.txt index df26146497b..35bb9f3e97e 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 against -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 + *** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode) +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + *** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode) +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + *** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode) +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + *** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode) +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + *** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode) +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + *** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode) 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 619914f26e3..a2db5890439 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 @@ -210,8 +210,13 @@ public OtlpHttpLogRecordExporterBuilder setMeterProvider( return this; } - /** Set the {@link MemoryMode}. */ - OtlpHttpLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) { + /** + * Set the {@link MemoryMode}. If unset, defaults to {@link #DEFAULT_MEMORY_MODE}. + * + *

>When memory mode is {@link MemoryMode#REUSABLE_DATA}, serialization is optimized to reduce + * memory allocation. + */ + public OtlpHttpLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) { requireNonNull(memoryMode, "memoryMode"); this.memoryMode = memoryMode; return this; 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 e3b23aa77e0..7046f65ebb1 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 @@ -19,10 +19,12 @@ import io.opentelemetry.sdk.common.export.ProxyOptions; import io.opentelemetry.sdk.common.export.RetryPolicy; import io.opentelemetry.sdk.metrics.InstrumentType; +import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector; import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.time.Duration; +import java.util.Collection; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -231,8 +233,18 @@ public OtlpHttpMetricExporterBuilder setProxyOptions(ProxyOptions proxyOptions) return this; } - /** Set the {@link MemoryMode}. */ - OtlpHttpMetricExporterBuilder setMemoryMode(MemoryMode memoryMode) { + /** + * Set the {@link MemoryMode}. If unset, defaults to {@link #DEFAULT_MEMORY_MODE}. + * + *

>When memory mode is {@link MemoryMode#REUSABLE_DATA}, serialization is optimized to reduce + * memory allocation. Additionally, the value is used for {@link MetricExporter#getMemoryMode()}, + * which sends a signal to the metrics SDK to reuse memory when possible. This is safe and + * desirable for most use cases, but should be used with caution of wrapping and delegating to the + * exporter. It is not safe for the wrapping exporter to hold onto references to {@link + * MetricData} batches since the same data structures will be reused in subsequent calls to {@link + * MetricExporter#export(Collection)}. + */ + public OtlpHttpMetricExporterBuilder setMemoryMode(MemoryMode memoryMode) { requireNonNull(memoryMode, "memoryMode"); this.memoryMode = memoryMode; return this; 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 1c735001ebf..db54626fc70 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 @@ -211,8 +211,13 @@ public OtlpHttpSpanExporterBuilder setMeterProvider( return this; } - /** Set the {@link MemoryMode}. */ - OtlpHttpSpanExporterBuilder setMemoryMode(MemoryMode memoryMode) { + /** + * Set the {@link MemoryMode}. If unset, defaults to {@link #DEFAULT_MEMORY_MODE}. + * + *

>When memory mode is {@link MemoryMode#REUSABLE_DATA}, serialization is optimized to reduce + * memory allocation. + */ + public OtlpHttpSpanExporterBuilder setMemoryMode(MemoryMode memoryMode) { requireNonNull(memoryMode, "memoryMode"); this.memoryMode = memoryMode; return this; diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java index c06d5f1f60e..2b387d06367 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java @@ -7,12 +7,7 @@ import static io.opentelemetry.sdk.metrics.Aggregation.explicitBucketHistogram; -import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder; -import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder; -import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder; -import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder; -import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder; -import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder; +import io.opentelemetry.exporter.internal.ExporterBuilderUtil; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; import io.opentelemetry.sdk.common.export.MemoryMode; @@ -26,8 +21,6 @@ import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLDecoder; @@ -62,6 +55,7 @@ public static String getOtlpProtocol(String dataType, ConfigProperties config) { } /** Invoke the setters with the OTLP configuration for the {@code dataType}. */ + @SuppressWarnings("TooManyParameters") public static void configureOtlpExporterBuilder( String dataType, ConfigProperties config, @@ -71,7 +65,8 @@ public static void configureOtlpExporterBuilder( Consumer setTimeout, Consumer setTrustedCertificates, BiConsumer setClientTls, - Consumer setRetryPolicy) { + Consumer setRetryPolicy, + Consumer setMemoryMode) { String protocol = getOtlpProtocol(dataType, config); boolean isHttpProtobuf = protocol.equals(PROTOCOL_HTTP_PROTOBUF); URL endpoint = @@ -161,6 +156,8 @@ public static void configureOtlpExporterBuilder( if (retryEnabled) { setRetryPolicy.accept(RetryPolicy.getDefault()); } + + ExporterBuilderUtil.configureExporterMemoryMode(config, setMemoryMode); } /** @@ -215,82 +212,6 @@ public static void configureOtlpHistogramDefaultAggregation( } } - /** - * Calls {@code #setMemoryMode} on the {@code Otlp{Protocol}{Signal}ExporterBuilder} with the - * {@code memoryMode}. - */ - public static void setMemoryModeOnOtlpExporterBuilder(Object builder, MemoryMode memoryMode) { - try { - // Metrics - if (builder instanceof OtlpGrpcMetricExporterBuilder) { - // Calling getDeclaredMethod causes all private methods to be read, which causes a - // ClassNotFoundException when running with the OkHttHttpProvider as the private - // setManagedChanel(io.grpc.ManagedChannel) is reached and io.grpc.ManagedChannel is not on - // the classpath. io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricUtil provides a layer - // of indirection which avoids scanning the OtlpGrpcMetricExporterBuilder private methods. - Class otlpGrpcMetricUtil = - Class.forName("io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricUtil"); - Method method = - otlpGrpcMetricUtil.getDeclaredMethod( - "setMemoryMode", OtlpGrpcMetricExporterBuilder.class, MemoryMode.class); - method.setAccessible(true); - method.invoke(null, builder, memoryMode); - } else if (builder instanceof OtlpHttpMetricExporterBuilder) { - Method method = - OtlpHttpMetricExporterBuilder.class.getDeclaredMethod( - "setMemoryMode", MemoryMode.class); - method.setAccessible(true); - method.invoke(builder, memoryMode); - } else if (builder instanceof OtlpGrpcSpanExporterBuilder) { - // Calling getDeclaredMethod causes all private methods to be read, which causes a - // ClassNotFoundException when running with the OkHttHttpProvider as the private - // setManagedChanel(io.grpc.ManagedChannel) is reached and io.grpc.ManagedChannel is not on - // the classpath. io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanUtil provides a layer - // of indirection which avoids scanning the OtlpGrpcSpanExporterBuilder private methods. - Class otlpGrpcMetricUtil = - Class.forName("io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanUtil"); - Method method = - otlpGrpcMetricUtil.getDeclaredMethod( - "setMemoryMode", OtlpGrpcSpanExporterBuilder.class, MemoryMode.class); - method.setAccessible(true); - method.invoke(null, builder, memoryMode); - } else if (builder instanceof OtlpHttpSpanExporterBuilder) { - Method method = - OtlpHttpSpanExporterBuilder.class.getDeclaredMethod("setMemoryMode", MemoryMode.class); - method.setAccessible(true); - method.invoke(builder, memoryMode); - } else if (builder instanceof OtlpGrpcLogRecordExporterBuilder) { - // Calling getDeclaredMethod causes all private methods to be read, which causes a - // ClassNotFoundException when running with the OkHttHttpProvider as the private - // setManagedChanel(io.grpc.ManagedChannel) is reached and io.grpc.ManagedChannel is not on - // the classpath. io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogUtil provides a layer - // of indirection which avoids scanning the OtlpGrpcLogRecordExporterBuilder private - // methods. - Class otlpGrpcMetricUtil = - Class.forName("io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogUtil"); - Method method = - otlpGrpcMetricUtil.getDeclaredMethod( - "setMemoryMode", OtlpGrpcLogRecordExporterBuilder.class, MemoryMode.class); - method.setAccessible(true); - method.invoke(null, builder, memoryMode); - } else if (builder instanceof OtlpHttpLogRecordExporterBuilder) { - Method method = - OtlpHttpLogRecordExporterBuilder.class.getDeclaredMethod( - "setMemoryMode", MemoryMode.class); - method.setAccessible(true); - method.invoke(builder, memoryMode); - } else { - throw new IllegalArgumentException( - "Cannot set memory mode. Unrecognized OTLP exporter builder"); - } - } catch (NoSuchMethodException - | InvocationTargetException - | IllegalAccessException - | ClassNotFoundException e) { - throw new IllegalStateException("Error calling setMemoryMode.", e); - } - } - private static URL createUrl(URL context, String spec) { try { return new URL(context, spec); diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterProvider.java index 04cf661b58b..67ed44c754a 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterProvider.java @@ -10,7 +10,6 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF; import io.opentelemetry.api.metrics.MeterProvider; -import io.opentelemetry.exporter.internal.ExporterBuilderUtil; import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter; import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder; import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; @@ -52,11 +51,9 @@ public LogRecordExporter createExporter(ConfigProperties config) { builder::setTimeout, builder::setTrustedCertificates, builder::setClientTls, - builder::setRetryPolicy); + builder::setRetryPolicy, + builder::setMemoryMode); builder.setMeterProvider(meterProviderRef::get); - ExporterBuilderUtil.configureExporterMemoryMode( - config, - memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode)); return builder.build(); } else if (protocol.equals(PROTOCOL_GRPC)) { @@ -71,11 +68,9 @@ public LogRecordExporter createExporter(ConfigProperties config) { builder::setTimeout, builder::setTrustedCertificates, builder::setClientTls, - builder::setRetryPolicy); + builder::setRetryPolicy, + builder::setMemoryMode); builder.setMeterProvider(meterProviderRef::get); - ExporterBuilderUtil.configureExporterMemoryMode( - config, - memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode)); return builder.build(); } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterProvider.java index 490f4044bea..8103e9426cf 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterProvider.java @@ -9,7 +9,6 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_GRPC; import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF; -import io.opentelemetry.exporter.internal.ExporterBuilderUtil; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; @@ -44,14 +43,12 @@ public MetricExporter createExporter(ConfigProperties config) { builder::setTimeout, builder::setTrustedCertificates, builder::setClientTls, - builder::setRetryPolicy); + builder::setRetryPolicy, + builder::setMemoryMode); OtlpConfigUtil.configureOtlpAggregationTemporality( config, builder::setAggregationTemporalitySelector); OtlpConfigUtil.configureOtlpHistogramDefaultAggregation( config, builder::setDefaultAggregationSelector); - ExporterBuilderUtil.configureExporterMemoryMode( - config, - memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode)); return builder.build(); } else if (protocol.equals(PROTOCOL_GRPC)) { @@ -66,14 +63,12 @@ public MetricExporter createExporter(ConfigProperties config) { builder::setTimeout, builder::setTrustedCertificates, builder::setClientTls, - builder::setRetryPolicy); + builder::setRetryPolicy, + builder::setMemoryMode); OtlpConfigUtil.configureOtlpAggregationTemporality( config, builder::setAggregationTemporalitySelector); OtlpConfigUtil.configureOtlpHistogramDefaultAggregation( config, builder::setDefaultAggregationSelector); - ExporterBuilderUtil.configureExporterMemoryMode( - config, - memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode)); return builder.build(); } diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterProvider.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterProvider.java index bdf9633a441..e6fad237d85 100644 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterProvider.java +++ b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterProvider.java @@ -10,7 +10,6 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF; import io.opentelemetry.api.metrics.MeterProvider; -import io.opentelemetry.exporter.internal.ExporterBuilderUtil; import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; @@ -51,11 +50,10 @@ public SpanExporter createExporter(ConfigProperties config) { builder::setTimeout, builder::setTrustedCertificates, builder::setClientTls, - builder::setRetryPolicy); + builder::setRetryPolicy, + builder::setMemoryMode); builder.setMeterProvider(meterProviderRef::get); - ExporterBuilderUtil.configureExporterMemoryMode( - config, - memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode)); + return builder.build(); } else if (protocol.equals(PROTOCOL_GRPC)) { OtlpGrpcSpanExporterBuilder builder = grpcBuilder(); @@ -69,11 +67,9 @@ public SpanExporter createExporter(ConfigProperties config) { builder::setTimeout, builder::setTrustedCertificates, builder::setClientTls, - builder::setRetryPolicy); + builder::setRetryPolicy, + builder::setMemoryMode); builder.setMeterProvider(meterProviderRef::get); - ExporterBuilderUtil.configureExporterMemoryMode( - config, - memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode)); return builder.build(); } 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 58cfc8e3c61..3131ae16ff0 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 @@ -243,8 +243,13 @@ public OtlpGrpcLogRecordExporterBuilder setMeterProvider( return this; } - /** Set the {@link MemoryMode}. */ - OtlpGrpcLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) { + /** + * Set the {@link MemoryMode}. If unset, defaults to {@link #DEFAULT_MEMORY_MODE}. + * + *

>When memory mode is {@link MemoryMode#REUSABLE_DATA}, serialization is optimized to reduce + * memory allocation. + */ + public OtlpGrpcLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) { requireNonNull(memoryMode, "memoryMode"); this.memoryMode = memoryMode; return this; diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogUtil.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogUtil.java deleted file mode 100644 index 1602514e8d5..00000000000 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogUtil.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.exporter.otlp.logs; - -import io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil; -import io.opentelemetry.sdk.common.export.MemoryMode; - -final class OtlpGrpcLogUtil { - - private OtlpGrpcLogUtil() {} - - /** See {@link OtlpConfigUtil#setMemoryModeOnOtlpExporterBuilder(Object, MemoryMode)}. */ - static void setMemoryMode(OtlpGrpcLogRecordExporterBuilder builder, MemoryMode memoryMode) { - builder.setMemoryMode(memoryMode); - } -} 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 343e2a5dd9b..34887f7f267 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 @@ -19,11 +19,13 @@ import io.opentelemetry.sdk.common.export.MemoryMode; import io.opentelemetry.sdk.common.export.RetryPolicy; import io.opentelemetry.sdk.metrics.InstrumentType; +import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector; import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.net.URI; import java.time.Duration; +import java.util.Collection; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -264,8 +266,18 @@ public OtlpGrpcMetricExporterBuilder setRetryPolicy(RetryPolicy retryPolicy) { return this; } - /** Set the {@link MemoryMode}. */ - OtlpGrpcMetricExporterBuilder setMemoryMode(MemoryMode memoryMode) { + /** + * Set the {@link MemoryMode}. If unset, defaults to {@link #DEFAULT_MEMORY_MODE}. + * + *

>When memory mode is {@link MemoryMode#REUSABLE_DATA}, serialization is optimized to reduce + * memory allocation. Additionally, the value is used for {@link MetricExporter#getMemoryMode()}, + * which sends a signal to the metrics SDK to reuse memory when possible. This is safe and + * desirable for most use cases, but should be used with caution of wrapping and delegating to the + * exporter. It is not safe for the wrapping exporter to hold onto references to {@link + * MetricData} batches since the same data structures will be reused in subsequent calls to {@link + * MetricExporter#export(Collection)}. + */ + public OtlpGrpcMetricExporterBuilder setMemoryMode(MemoryMode memoryMode) { requireNonNull(memoryMode, "memoryMode"); this.memoryMode = memoryMode; return this; diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricUtil.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricUtil.java deleted file mode 100644 index 7d4080b87ef..00000000000 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricUtil.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.exporter.otlp.metrics; - -import io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil; -import io.opentelemetry.sdk.common.export.MemoryMode; - -final class OtlpGrpcMetricUtil { - - private OtlpGrpcMetricUtil() {} - - /** See {@link OtlpConfigUtil#setMemoryModeOnOtlpExporterBuilder(Object, MemoryMode)}. */ - static void setMemoryMode(OtlpGrpcMetricExporterBuilder builder, MemoryMode memoryMode) { - builder.setMemoryMode(memoryMode); - } -} 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 20ad734da43..004c61021ad 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 @@ -240,8 +240,13 @@ public OtlpGrpcSpanExporterBuilder setMeterProvider( return this; } - /** Set the {@link MemoryMode}. */ - OtlpGrpcSpanExporterBuilder setMemoryMode(MemoryMode memoryMode) { + /** + * Set the {@link MemoryMode}. If unset, defaults to {@link #DEFAULT_MEMORY_MODE}. + * + *

>When memory mode is {@link MemoryMode#REUSABLE_DATA}, serialization is optimized to reduce + * memory allocation. + */ + public OtlpGrpcSpanExporterBuilder setMemoryMode(MemoryMode memoryMode) { requireNonNull(memoryMode, "memoryMode"); this.memoryMode = memoryMode; return this; diff --git a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanUtil.java b/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanUtil.java deleted file mode 100644 index 25955ffa265..00000000000 --- a/exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/trace/OtlpGrpcSpanUtil.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.exporter.otlp.trace; - -import io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil; -import io.opentelemetry.sdk.common.export.MemoryMode; - -final class OtlpGrpcSpanUtil { - - private OtlpGrpcSpanUtil() {} - - /** See {@link OtlpConfigUtil#setMemoryModeOnOtlpExporterBuilder(Object, MemoryMode)}. */ - static void setMemoryMode(OtlpGrpcSpanExporterBuilder builder, MemoryMode memoryMode) { - builder.setMemoryMode(memoryMode); - } -} diff --git a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtilTest.java b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtilTest.java index b3b896018ba..5c678670519 100644 --- a/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtilTest.java +++ b/exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtilTest.java @@ -325,6 +325,7 @@ private static String configureEndpoint(String dataType, Map pro value -> {}, value -> {}, (value1, value2) -> {}, + value -> {}, value -> {}); return endpoint.get(); diff --git a/integration-tests/otlp/src/main/java/io/opentelemetry/integrationtest/OtlpExporterIntegrationTest.java b/integration-tests/otlp/src/main/java/io/opentelemetry/integrationtest/OtlpExporterIntegrationTest.java index 5310162ec60..e90c9efe28f 100644 --- a/integration-tests/otlp/src/main/java/io/opentelemetry/integrationtest/OtlpExporterIntegrationTest.java +++ b/integration-tests/otlp/src/main/java/io/opentelemetry/integrationtest/OtlpExporterIntegrationTest.java @@ -38,12 +38,9 @@ import io.opentelemetry.context.Scope; import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter; -import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder; import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; -import io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil; import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; -import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder; import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; import io.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest; import io.opentelemetry.proto.collector.logs.v1.ExportLogsServiceResponse; @@ -213,6 +210,22 @@ void testOtlpGrpcTraceExport(String compression) { testTraceExport(exporter); } + @ParameterizedTest + @EnumSource(MemoryMode.class) + void testOtlpGrpcTraceExport_memoryMode(MemoryMode memoryMode) { + SpanExporter exporter = + OtlpGrpcSpanExporter.builder() + .setEndpoint( + "http://" + + collector.getHost() + + ":" + + collector.getMappedPort(COLLECTOR_OTLP_GRPC_PORT)) + .setMemoryMode(memoryMode) + .build(); + + testTraceExport(exporter); + } + @Test void testOtlpGrpcTraceExport_mtls() throws Exception { SpanExporter exporter = @@ -246,6 +259,23 @@ void testOtlpHttpTraceExport(String compression) { testTraceExport(exporter); } + @ParameterizedTest + @EnumSource(MemoryMode.class) + void testOtlpHttpTraceExport_memoryMode(MemoryMode memoryMode) { + SpanExporter exporter = + OtlpHttpSpanExporter.builder() + .setEndpoint( + "http://" + + collector.getHost() + + ":" + + collector.getMappedPort(COLLECTOR_OTLP_HTTP_PORT) + + "/v1/traces") + .setMemoryMode(memoryMode) + .build(); + + testTraceExport(exporter); + } + @Test void testOtlpHttpTraceExport_mtls() throws Exception { SpanExporter exporter = @@ -349,16 +379,14 @@ void testOtlpGrpcMetricExport(String compression) { @ParameterizedTest @EnumSource(MemoryMode.class) void testOtlpGrpcMetricExport_memoryMode(MemoryMode memoryMode) { - OtlpGrpcMetricExporterBuilder builder = OtlpGrpcMetricExporter.builder(); - OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode); - MetricExporter exporter = - builder + OtlpGrpcMetricExporter.builder() .setEndpoint( "http://" + collector.getHost() + ":" + collector.getMappedPort(COLLECTOR_OTLP_GRPC_PORT)) + .setMemoryMode(memoryMode) .build(); assertThat(exporter.getMemoryMode()).isEqualTo(memoryMode); @@ -402,17 +430,15 @@ void testOtlpHttpMetricExport(String compression) { @ParameterizedTest @EnumSource(MemoryMode.class) void testOtlpHttpMetricExport_memoryMode(MemoryMode memoryMode) { - OtlpHttpMetricExporterBuilder builder = OtlpHttpMetricExporter.builder(); - OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode); - MetricExporter exporter = - builder + OtlpHttpMetricExporter.builder() .setEndpoint( "http://" + collector.getHost() + ":" + collector.getMappedPort(COLLECTOR_OTLP_HTTP_PORT) + "/v1/metrics") + .setMemoryMode(memoryMode) .build(); assertThat(exporter.getMemoryMode()).isEqualTo(memoryMode); @@ -516,6 +542,22 @@ void testOtlpGrpcLogExport(String compression) { testLogRecordExporter(otlpGrpcLogRecordExporter); } + @ParameterizedTest + @EnumSource(MemoryMode.class) + void testOtlpGrpcLogExport_memoryMode(MemoryMode memoryMode) { + LogRecordExporter otlpGrpcLogRecordExporter = + OtlpGrpcLogRecordExporter.builder() + .setEndpoint( + "http://" + + collector.getHost() + + ":" + + collector.getMappedPort(COLLECTOR_OTLP_GRPC_PORT)) + .setMemoryMode(memoryMode) + .build(); + + testLogRecordExporter(otlpGrpcLogRecordExporter); + } + @Test void testOtlpGrpcLogExport_mtls() throws Exception { LogRecordExporter exporter = @@ -549,6 +591,23 @@ void testOtlpHttpLogExport(String compression) { testLogRecordExporter(otlpHttpLogRecordExporter); } + @ParameterizedTest + @EnumSource(MemoryMode.class) + void testOtlpHttpLogExport_memoryMode(MemoryMode memoryMode) { + LogRecordExporter otlpHttpLogRecordExporter = + OtlpHttpLogRecordExporter.builder() + .setEndpoint( + "http://" + + collector.getHost() + + ":" + + collector.getMappedPort(COLLECTOR_OTLP_HTTP_PORT) + + "/v1/logs") + .setMemoryMode(memoryMode) + .build(); + + testLogRecordExporter(otlpHttpLogRecordExporter); + } + @Test void testOtlpHttpLogExport_mtls() throws Exception { LogRecordExporter exporter =