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 =