Skip to content

Commit f579061

Browse files
authored
Make OTLP exporter memory mode API public (#6469)
1 parent 7da7037 commit f579061

16 files changed

+164
-193
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,19 @@
11
Comparing source compatibility of against
2-
No changes.
2+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder (not serializable)
3+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
4+
*** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode)
5+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder (not serializable)
6+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
7+
*** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode)
8+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder (not serializable)
9+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
10+
*** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode)
11+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder (not serializable)
12+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
13+
*** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode)
14+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder (not serializable)
15+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
16+
*** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode)
17+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder (not serializable)
18+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
19+
*** MODIFIED METHOD: PUBLIC (<- PACKAGE_PROTECTED) io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder setMemoryMode(io.opentelemetry.sdk.common.export.MemoryMode)

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogRecordExporterBuilder.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,13 @@ public OtlpHttpLogRecordExporterBuilder setMeterProvider(
210210
return this;
211211
}
212212

213-
/** Set the {@link MemoryMode}. */
214-
OtlpHttpLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) {
213+
/**
214+
* Set the {@link MemoryMode}. If unset, defaults to {@link #DEFAULT_MEMORY_MODE}.
215+
*
216+
* <p>>When memory mode is {@link MemoryMode#REUSABLE_DATA}, serialization is optimized to reduce
217+
* memory allocation.
218+
*/
219+
public OtlpHttpLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) {
215220
requireNonNull(memoryMode, "memoryMode");
216221
this.memoryMode = memoryMode;
217222
return this;

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
import io.opentelemetry.sdk.common.export.ProxyOptions;
2020
import io.opentelemetry.sdk.common.export.RetryPolicy;
2121
import io.opentelemetry.sdk.metrics.InstrumentType;
22+
import io.opentelemetry.sdk.metrics.data.MetricData;
2223
import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector;
2324
import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector;
2425
import io.opentelemetry.sdk.metrics.export.MetricExporter;
2526
import java.time.Duration;
27+
import java.util.Collection;
2628
import java.util.Map;
2729
import java.util.concurrent.TimeUnit;
2830
import java.util.function.Supplier;
@@ -231,8 +233,18 @@ public OtlpHttpMetricExporterBuilder setProxyOptions(ProxyOptions proxyOptions)
231233
return this;
232234
}
233235

234-
/** Set the {@link MemoryMode}. */
235-
OtlpHttpMetricExporterBuilder setMemoryMode(MemoryMode memoryMode) {
236+
/**
237+
* Set the {@link MemoryMode}. If unset, defaults to {@link #DEFAULT_MEMORY_MODE}.
238+
*
239+
* <p>>When memory mode is {@link MemoryMode#REUSABLE_DATA}, serialization is optimized to reduce
240+
* memory allocation. Additionally, the value is used for {@link MetricExporter#getMemoryMode()},
241+
* which sends a signal to the metrics SDK to reuse memory when possible. This is safe and
242+
* desirable for most use cases, but should be used with caution of wrapping and delegating to the
243+
* exporter. It is not safe for the wrapping exporter to hold onto references to {@link
244+
* MetricData} batches since the same data structures will be reused in subsequent calls to {@link
245+
* MetricExporter#export(Collection)}.
246+
*/
247+
public OtlpHttpMetricExporterBuilder setMemoryMode(MemoryMode memoryMode) {
236248
requireNonNull(memoryMode, "memoryMode");
237249
this.memoryMode = memoryMode;
238250
return this;

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/trace/OtlpHttpSpanExporterBuilder.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,13 @@ public OtlpHttpSpanExporterBuilder setMeterProvider(
211211
return this;
212212
}
213213

214-
/** Set the {@link MemoryMode}. */
215-
OtlpHttpSpanExporterBuilder setMemoryMode(MemoryMode memoryMode) {
214+
/**
215+
* Set the {@link MemoryMode}. If unset, defaults to {@link #DEFAULT_MEMORY_MODE}.
216+
*
217+
* <p>>When memory mode is {@link MemoryMode#REUSABLE_DATA}, serialization is optimized to reduce
218+
* memory allocation.
219+
*/
220+
public OtlpHttpSpanExporterBuilder setMemoryMode(MemoryMode memoryMode) {
216221
requireNonNull(memoryMode, "memoryMode");
217222
this.memoryMode = memoryMode;
218223
return this;

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpConfigUtil.java

+6-85
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,7 @@
77

88
import static io.opentelemetry.sdk.metrics.Aggregation.explicitBucketHistogram;
99

10-
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder;
11-
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder;
12-
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder;
13-
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporterBuilder;
14-
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder;
15-
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
10+
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
1611
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1712
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
1813
import io.opentelemetry.sdk.common.export.MemoryMode;
@@ -26,8 +21,6 @@
2621
import java.io.File;
2722
import java.io.IOException;
2823
import java.io.RandomAccessFile;
29-
import java.lang.reflect.InvocationTargetException;
30-
import java.lang.reflect.Method;
3124
import java.net.MalformedURLException;
3225
import java.net.URL;
3326
import java.net.URLDecoder;
@@ -62,6 +55,7 @@ public static String getOtlpProtocol(String dataType, ConfigProperties config) {
6255
}
6356

6457
/** Invoke the setters with the OTLP configuration for the {@code dataType}. */
58+
@SuppressWarnings("TooManyParameters")
6559
public static void configureOtlpExporterBuilder(
6660
String dataType,
6761
ConfigProperties config,
@@ -71,7 +65,8 @@ public static void configureOtlpExporterBuilder(
7165
Consumer<Duration> setTimeout,
7266
Consumer<byte[]> setTrustedCertificates,
7367
BiConsumer<byte[], byte[]> setClientTls,
74-
Consumer<RetryPolicy> setRetryPolicy) {
68+
Consumer<RetryPolicy> setRetryPolicy,
69+
Consumer<MemoryMode> setMemoryMode) {
7570
String protocol = getOtlpProtocol(dataType, config);
7671
boolean isHttpProtobuf = protocol.equals(PROTOCOL_HTTP_PROTOBUF);
7772
URL endpoint =
@@ -161,6 +156,8 @@ public static void configureOtlpExporterBuilder(
161156
if (retryEnabled) {
162157
setRetryPolicy.accept(RetryPolicy.getDefault());
163158
}
159+
160+
ExporterBuilderUtil.configureExporterMemoryMode(config, setMemoryMode);
164161
}
165162

166163
/**
@@ -215,82 +212,6 @@ public static void configureOtlpHistogramDefaultAggregation(
215212
}
216213
}
217214

218-
/**
219-
* Calls {@code #setMemoryMode} on the {@code Otlp{Protocol}{Signal}ExporterBuilder} with the
220-
* {@code memoryMode}.
221-
*/
222-
public static void setMemoryModeOnOtlpExporterBuilder(Object builder, MemoryMode memoryMode) {
223-
try {
224-
// Metrics
225-
if (builder instanceof OtlpGrpcMetricExporterBuilder) {
226-
// Calling getDeclaredMethod causes all private methods to be read, which causes a
227-
// ClassNotFoundException when running with the OkHttHttpProvider as the private
228-
// setManagedChanel(io.grpc.ManagedChannel) is reached and io.grpc.ManagedChannel is not on
229-
// the classpath. io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricUtil provides a layer
230-
// of indirection which avoids scanning the OtlpGrpcMetricExporterBuilder private methods.
231-
Class<?> otlpGrpcMetricUtil =
232-
Class.forName("io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricUtil");
233-
Method method =
234-
otlpGrpcMetricUtil.getDeclaredMethod(
235-
"setMemoryMode", OtlpGrpcMetricExporterBuilder.class, MemoryMode.class);
236-
method.setAccessible(true);
237-
method.invoke(null, builder, memoryMode);
238-
} else if (builder instanceof OtlpHttpMetricExporterBuilder) {
239-
Method method =
240-
OtlpHttpMetricExporterBuilder.class.getDeclaredMethod(
241-
"setMemoryMode", MemoryMode.class);
242-
method.setAccessible(true);
243-
method.invoke(builder, memoryMode);
244-
} else if (builder instanceof OtlpGrpcSpanExporterBuilder) {
245-
// Calling getDeclaredMethod causes all private methods to be read, which causes a
246-
// ClassNotFoundException when running with the OkHttHttpProvider as the private
247-
// setManagedChanel(io.grpc.ManagedChannel) is reached and io.grpc.ManagedChannel is not on
248-
// the classpath. io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanUtil provides a layer
249-
// of indirection which avoids scanning the OtlpGrpcSpanExporterBuilder private methods.
250-
Class<?> otlpGrpcMetricUtil =
251-
Class.forName("io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanUtil");
252-
Method method =
253-
otlpGrpcMetricUtil.getDeclaredMethod(
254-
"setMemoryMode", OtlpGrpcSpanExporterBuilder.class, MemoryMode.class);
255-
method.setAccessible(true);
256-
method.invoke(null, builder, memoryMode);
257-
} else if (builder instanceof OtlpHttpSpanExporterBuilder) {
258-
Method method =
259-
OtlpHttpSpanExporterBuilder.class.getDeclaredMethod("setMemoryMode", MemoryMode.class);
260-
method.setAccessible(true);
261-
method.invoke(builder, memoryMode);
262-
} else if (builder instanceof OtlpGrpcLogRecordExporterBuilder) {
263-
// Calling getDeclaredMethod causes all private methods to be read, which causes a
264-
// ClassNotFoundException when running with the OkHttHttpProvider as the private
265-
// setManagedChanel(io.grpc.ManagedChannel) is reached and io.grpc.ManagedChannel is not on
266-
// the classpath. io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogUtil provides a layer
267-
// of indirection which avoids scanning the OtlpGrpcLogRecordExporterBuilder private
268-
// methods.
269-
Class<?> otlpGrpcMetricUtil =
270-
Class.forName("io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogUtil");
271-
Method method =
272-
otlpGrpcMetricUtil.getDeclaredMethod(
273-
"setMemoryMode", OtlpGrpcLogRecordExporterBuilder.class, MemoryMode.class);
274-
method.setAccessible(true);
275-
method.invoke(null, builder, memoryMode);
276-
} else if (builder instanceof OtlpHttpLogRecordExporterBuilder) {
277-
Method method =
278-
OtlpHttpLogRecordExporterBuilder.class.getDeclaredMethod(
279-
"setMemoryMode", MemoryMode.class);
280-
method.setAccessible(true);
281-
method.invoke(builder, memoryMode);
282-
} else {
283-
throw new IllegalArgumentException(
284-
"Cannot set memory mode. Unrecognized OTLP exporter builder");
285-
}
286-
} catch (NoSuchMethodException
287-
| InvocationTargetException
288-
| IllegalAccessException
289-
| ClassNotFoundException e) {
290-
throw new IllegalStateException("Error calling setMemoryMode.", e);
291-
}
292-
}
293-
294215
private static URL createUrl(URL context, String spec) {
295216
try {
296217
return new URL(context, spec);

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterProvider.java

+4-9
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF;
1111

1212
import io.opentelemetry.api.metrics.MeterProvider;
13-
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
1413
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter;
1514
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporterBuilder;
1615
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter;
@@ -52,11 +51,9 @@ public LogRecordExporter createExporter(ConfigProperties config) {
5251
builder::setTimeout,
5352
builder::setTrustedCertificates,
5453
builder::setClientTls,
55-
builder::setRetryPolicy);
54+
builder::setRetryPolicy,
55+
builder::setMemoryMode);
5656
builder.setMeterProvider(meterProviderRef::get);
57-
ExporterBuilderUtil.configureExporterMemoryMode(
58-
config,
59-
memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode));
6057

6158
return builder.build();
6259
} else if (protocol.equals(PROTOCOL_GRPC)) {
@@ -71,11 +68,9 @@ public LogRecordExporter createExporter(ConfigProperties config) {
7168
builder::setTimeout,
7269
builder::setTrustedCertificates,
7370
builder::setClientTls,
74-
builder::setRetryPolicy);
71+
builder::setRetryPolicy,
72+
builder::setMemoryMode);
7573
builder.setMeterProvider(meterProviderRef::get);
76-
ExporterBuilderUtil.configureExporterMemoryMode(
77-
config,
78-
memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode));
7974

8075
return builder.build();
8176
}

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterProvider.java

+4-9
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_GRPC;
1010
import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF;
1111

12-
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
1312
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter;
1413
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder;
1514
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter;
@@ -44,14 +43,12 @@ public MetricExporter createExporter(ConfigProperties config) {
4443
builder::setTimeout,
4544
builder::setTrustedCertificates,
4645
builder::setClientTls,
47-
builder::setRetryPolicy);
46+
builder::setRetryPolicy,
47+
builder::setMemoryMode);
4848
OtlpConfigUtil.configureOtlpAggregationTemporality(
4949
config, builder::setAggregationTemporalitySelector);
5050
OtlpConfigUtil.configureOtlpHistogramDefaultAggregation(
5151
config, builder::setDefaultAggregationSelector);
52-
ExporterBuilderUtil.configureExporterMemoryMode(
53-
config,
54-
memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode));
5552

5653
return builder.build();
5754
} else if (protocol.equals(PROTOCOL_GRPC)) {
@@ -66,14 +63,12 @@ public MetricExporter createExporter(ConfigProperties config) {
6663
builder::setTimeout,
6764
builder::setTrustedCertificates,
6865
builder::setClientTls,
69-
builder::setRetryPolicy);
66+
builder::setRetryPolicy,
67+
builder::setMemoryMode);
7068
OtlpConfigUtil.configureOtlpAggregationTemporality(
7169
config, builder::setAggregationTemporalitySelector);
7270
OtlpConfigUtil.configureOtlpHistogramDefaultAggregation(
7371
config, builder::setDefaultAggregationSelector);
74-
ExporterBuilderUtil.configureExporterMemoryMode(
75-
config,
76-
memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode));
7772

7873
return builder.build();
7974
}

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterProvider.java

+5-9
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_HTTP_PROTOBUF;
1111

1212
import io.opentelemetry.api.metrics.MeterProvider;
13-
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
1413
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
1514
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporterBuilder;
1615
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
@@ -51,11 +50,10 @@ public SpanExporter createExporter(ConfigProperties config) {
5150
builder::setTimeout,
5251
builder::setTrustedCertificates,
5352
builder::setClientTls,
54-
builder::setRetryPolicy);
53+
builder::setRetryPolicy,
54+
builder::setMemoryMode);
5555
builder.setMeterProvider(meterProviderRef::get);
56-
ExporterBuilderUtil.configureExporterMemoryMode(
57-
config,
58-
memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode));
56+
5957
return builder.build();
6058
} else if (protocol.equals(PROTOCOL_GRPC)) {
6159
OtlpGrpcSpanExporterBuilder builder = grpcBuilder();
@@ -69,11 +67,9 @@ public SpanExporter createExporter(ConfigProperties config) {
6967
builder::setTimeout,
7068
builder::setTrustedCertificates,
7169
builder::setClientTls,
72-
builder::setRetryPolicy);
70+
builder::setRetryPolicy,
71+
builder::setMemoryMode);
7372
builder.setMeterProvider(meterProviderRef::get);
74-
ExporterBuilderUtil.configureExporterMemoryMode(
75-
config,
76-
memoryMode -> OtlpConfigUtil.setMemoryModeOnOtlpExporterBuilder(builder, memoryMode));
7773

7874
return builder.build();
7975
}

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogRecordExporterBuilder.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,13 @@ public OtlpGrpcLogRecordExporterBuilder setMeterProvider(
243243
return this;
244244
}
245245

246-
/** Set the {@link MemoryMode}. */
247-
OtlpGrpcLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) {
246+
/**
247+
* Set the {@link MemoryMode}. If unset, defaults to {@link #DEFAULT_MEMORY_MODE}.
248+
*
249+
* <p>>When memory mode is {@link MemoryMode#REUSABLE_DATA}, serialization is optimized to reduce
250+
* memory allocation.
251+
*/
252+
public OtlpGrpcLogRecordExporterBuilder setMemoryMode(MemoryMode memoryMode) {
248253
requireNonNull(memoryMode, "memoryMode");
249254
this.memoryMode = memoryMode;
250255
return this;

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogUtil.java

-19
This file was deleted.

0 commit comments

Comments
 (0)