Skip to content

Commit 10bca8b

Browse files
authored
Enable reusuable_data memory mode by default (#6799)
1 parent 5ec1e86 commit 10bca8b

File tree

15 files changed

+66
-44
lines changed

15 files changed

+66
-44
lines changed

exporters/common/src/main/java/io/opentelemetry/exporter/internal/ExporterBuilderUtil.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.net.URISyntaxException;
2222
import java.util.Locale;
2323
import java.util.function.Consumer;
24+
import java.util.logging.Logger;
2425

2526
/**
2627
* Utilities for exporter builders.
@@ -30,6 +31,8 @@
3031
*/
3132
public final class ExporterBuilderUtil {
3233

34+
private static final Logger logger = Logger.getLogger(ExporterBuilderUtil.class.getName());
35+
3336
/** Validate OTLP endpoint. */
3437
public static URI validateEndpoint(String endpoint) {
3538
URI uri;
@@ -50,7 +53,14 @@ public static URI validateEndpoint(String endpoint) {
5053
/** Invoke the {@code memoryModeConsumer} with the configured {@link MemoryMode}. */
5154
public static void configureExporterMemoryMode(
5255
ConfigProperties config, Consumer<MemoryMode> memoryModeConsumer) {
53-
String memoryModeStr = config.getString("otel.java.experimental.exporter.memory_mode");
56+
String memoryModeStr = config.getString("otel.java.exporter.memory_mode");
57+
if (memoryModeStr == null) {
58+
memoryModeStr = config.getString("otel.java.experimental.exporter.memory_mode");
59+
if (memoryModeStr != null) {
60+
logger.warning(
61+
"otel.java.experimental.exporter.memory_mode was set but has been replaced with otel.java.exporter.memory_mode and will be removed in a future release");
62+
}
63+
}
5464
if (memoryModeStr == null) {
5565
return;
5666
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
public final class OtlpHttpLogRecordExporterBuilder {
3636

3737
private static final String DEFAULT_ENDPOINT = "http://localhost:4318/v1/logs";
38-
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.IMMUTABLE_DATA;
38+
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.REUSABLE_DATA;
3939

4040
private final HttpExporterBuilder<Marshaler> delegate;
4141
private MemoryMode memoryMode;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public final class OtlpHttpMetricExporterBuilder {
4343

4444
private static final AggregationTemporalitySelector DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR =
4545
AggregationTemporalitySelector.alwaysCumulative();
46-
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.IMMUTABLE_DATA;
46+
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.REUSABLE_DATA;
4747

4848
private final HttpExporterBuilder<Marshaler> delegate;
4949
private AggregationTemporalitySelector aggregationTemporalitySelector =

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
public final class OtlpHttpSpanExporterBuilder {
3636

3737
private static final String DEFAULT_ENDPOINT = "http://localhost:4318/v1/traces";
38-
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.IMMUTABLE_DATA;
38+
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.REUSABLE_DATA;
3939

4040
private final HttpExporterBuilder<Marshaler> delegate;
4141
private MemoryMode memoryMode;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public final class OtlpGrpcLogRecordExporterBuilder {
4343
private static final String DEFAULT_ENDPOINT_URL = "http://localhost:4317";
4444
private static final URI DEFAULT_ENDPOINT = URI.create(DEFAULT_ENDPOINT_URL);
4545
private static final long DEFAULT_TIMEOUT_SECS = 10;
46-
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.IMMUTABLE_DATA;
46+
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.REUSABLE_DATA;
4747

4848
// Visible for testing
4949
final GrpcExporterBuilder<Marshaler> delegate;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public final class OtlpGrpcMetricExporterBuilder {
5050
private static final long DEFAULT_TIMEOUT_SECS = 10;
5151
private static final AggregationTemporalitySelector DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR =
5252
AggregationTemporalitySelector.alwaysCumulative();
53-
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.IMMUTABLE_DATA;
53+
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.REUSABLE_DATA;
5454

5555
// Visible for testing
5656
final GrpcExporterBuilder<Marshaler> delegate;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public final class OtlpGrpcSpanExporterBuilder {
3939
private static final String DEFAULT_ENDPOINT_URL = "http://localhost:4317";
4040
private static final URI DEFAULT_ENDPOINT = URI.create(DEFAULT_ENDPOINT_URL);
4141
private static final long DEFAULT_TIMEOUT_SECS = 10;
42-
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.IMMUTABLE_DATA;
42+
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.REUSABLE_DATA;
4343

4444
// Visible for testing
4545
final GrpcExporterBuilder<Marshaler> delegate;

exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpLogRecordExporterProviderTest.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ void createExporter_GrpcDefaults() {
129129
verify(grpcBuilder, never()).setTrustedCertificates(any());
130130
verify(grpcBuilder, never()).setClientTls(any(), any());
131131
assertThat(grpcBuilder).extracting("delegate").extracting("retryPolicy").isNotNull();
132-
getMemoryMode(exporter).isEqualTo(MemoryMode.IMMUTABLE_DATA);
132+
getMemoryMode(exporter).isEqualTo(MemoryMode.REUSABLE_DATA);
133133
}
134134
Mockito.verifyNoInteractions(httpBuilder);
135135
}
@@ -183,7 +183,7 @@ void createExporter_GrpcWithSignalConfiguration() throws CertificateEncodingExce
183183
config.put("otel.exporter.otlp.logs.compression", "gzip");
184184
config.put("otel.exporter.otlp.timeout", "1s");
185185
config.put("otel.exporter.otlp.logs.timeout", "15s");
186-
config.put("otel.java.experimental.exporter.memory_mode", "reusable_data");
186+
config.put("otel.java.exporter.memory_mode", "immutable_data");
187187

188188
try (LogRecordExporter exporter =
189189
provider.createExporter(DefaultConfigProperties.createFromMap(config))) {
@@ -196,7 +196,7 @@ void createExporter_GrpcWithSignalConfiguration() throws CertificateEncodingExce
196196
verify(grpcBuilder).setTrustedCertificates(serverTls.certificate().getEncoded());
197197
verify(grpcBuilder)
198198
.setClientTls(clientTls.privateKey().getEncoded(), clientTls.certificate().getEncoded());
199-
getMemoryMode(exporter).isEqualTo(MemoryMode.REUSABLE_DATA);
199+
getMemoryMode(exporter).isEqualTo(MemoryMode.IMMUTABLE_DATA);
200200
}
201201
Mockito.verifyNoInteractions(httpBuilder);
202202
}
@@ -216,7 +216,7 @@ void createExporter_HttpDefaults() {
216216
verify(httpBuilder, never()).setTrustedCertificates(any());
217217
verify(httpBuilder, never()).setClientTls(any(), any());
218218
assertThat(httpBuilder).extracting("delegate").extracting("retryPolicy").isNotNull();
219-
getMemoryMode(exporter).isEqualTo(MemoryMode.IMMUTABLE_DATA);
219+
getMemoryMode(exporter).isEqualTo(MemoryMode.REUSABLE_DATA);
220220
}
221221
Mockito.verifyNoInteractions(grpcBuilder);
222222
}
@@ -269,7 +269,7 @@ void createExporter_HttpWithSignalConfiguration() throws CertificateEncodingExce
269269
config.put("otel.exporter.otlp.logs.compression", "gzip");
270270
config.put("otel.exporter.otlp.timeout", "1s");
271271
config.put("otel.exporter.otlp.logs.timeout", "15s");
272-
config.put("otel.java.experimental.exporter.memory_mode", "reusable_data");
272+
config.put("otel.java.exporter.memory_mode", "immutable_data");
273273

274274
try (LogRecordExporter exporter =
275275
provider.createExporter(DefaultConfigProperties.createFromMap(config))) {
@@ -282,7 +282,7 @@ void createExporter_HttpWithSignalConfiguration() throws CertificateEncodingExce
282282
verify(httpBuilder).setTrustedCertificates(serverTls.certificate().getEncoded());
283283
verify(httpBuilder)
284284
.setClientTls(clientTls.privateKey().getEncoded(), clientTls.certificate().getEncoded());
285-
getMemoryMode(exporter).isEqualTo(MemoryMode.REUSABLE_DATA);
285+
getMemoryMode(exporter).isEqualTo(MemoryMode.IMMUTABLE_DATA);
286286
}
287287
Mockito.verifyNoInteractions(grpcBuilder);
288288
}

exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpMetricExporterProviderTest.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ void createExporter_GrpcDefaults() {
128128
verify(grpcBuilder, never()).setTrustedCertificates(any());
129129
verify(grpcBuilder, never()).setClientTls(any(), any());
130130
assertThat(grpcBuilder).extracting("delegate").extracting("retryPolicy").isNotNull();
131-
assertThat(exporter.getMemoryMode()).isEqualTo(MemoryMode.IMMUTABLE_DATA);
131+
assertThat(exporter.getMemoryMode()).isEqualTo(MemoryMode.REUSABLE_DATA);
132132
}
133133
Mockito.verifyNoInteractions(httpBuilder);
134134
}
@@ -178,7 +178,7 @@ void createExporter_GrpcWithSignalConfiguration() throws CertificateEncodingExce
178178
config.put("otel.exporter.otlp.metrics.compression", "gzip");
179179
config.put("otel.exporter.otlp.timeout", "1s");
180180
config.put("otel.exporter.otlp.metrics.timeout", "15s");
181-
config.put("otel.java.experimental.exporter.memory_mode", "reusable_data");
181+
config.put("otel.java.exporter.memory_mode", "immutable_data");
182182

183183
try (MetricExporter exporter =
184184
provider.createExporter(DefaultConfigProperties.createFromMap(config))) {
@@ -191,7 +191,7 @@ void createExporter_GrpcWithSignalConfiguration() throws CertificateEncodingExce
191191
verify(grpcBuilder).setTrustedCertificates(serverTls.certificate().getEncoded());
192192
verify(grpcBuilder)
193193
.setClientTls(clientTls.privateKey().getEncoded(), clientTls.certificate().getEncoded());
194-
assertThat(exporter.getMemoryMode()).isEqualTo(MemoryMode.REUSABLE_DATA);
194+
assertThat(exporter.getMemoryMode()).isEqualTo(MemoryMode.IMMUTABLE_DATA);
195195
}
196196
Mockito.verifyNoInteractions(httpBuilder);
197197
}
@@ -212,7 +212,7 @@ void createExporter_HttpDefaults() {
212212
verify(httpBuilder, never()).setTrustedCertificates(any());
213213
verify(httpBuilder, never()).setClientTls(any(), any());
214214
assertThat(httpBuilder).extracting("delegate").extracting("retryPolicy").isNotNull();
215-
assertThat(exporter.getMemoryMode()).isEqualTo(MemoryMode.IMMUTABLE_DATA);
215+
assertThat(exporter.getMemoryMode()).isEqualTo(MemoryMode.REUSABLE_DATA);
216216
}
217217
Mockito.verifyNoInteractions(grpcBuilder);
218218
}
@@ -265,7 +265,7 @@ void createExporter_HttpWithSignalConfiguration() throws CertificateEncodingExce
265265
config.put("otel.exporter.otlp.metrics.compression", "gzip");
266266
config.put("otel.exporter.otlp.timeout", "1s");
267267
config.put("otel.exporter.otlp.metrics.timeout", "15s");
268-
config.put("otel.java.experimental.exporter.memory_mode", "reusable_data");
268+
config.put("otel.java.exporter.memory_mode", "immutable_data");
269269

270270
try (MetricExporter exporter =
271271
provider.createExporter(DefaultConfigProperties.createFromMap(config))) {
@@ -278,7 +278,7 @@ void createExporter_HttpWithSignalConfiguration() throws CertificateEncodingExce
278278
verify(httpBuilder).setTrustedCertificates(serverTls.certificate().getEncoded());
279279
verify(httpBuilder)
280280
.setClientTls(clientTls.privateKey().getEncoded(), clientTls.certificate().getEncoded());
281-
assertThat(exporter.getMemoryMode()).isEqualTo(MemoryMode.REUSABLE_DATA);
281+
assertThat(exporter.getMemoryMode()).isEqualTo(MemoryMode.IMMUTABLE_DATA);
282282
}
283283
Mockito.verifyNoInteractions(grpcBuilder);
284284
}

exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/internal/OtlpSpanExporterProviderTest.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ void createExporter_GrpcDefaults() {
130130
verify(grpcBuilder, never()).setTrustedCertificates(any());
131131
verify(grpcBuilder, never()).setClientTls(any(), any());
132132
assertThat(grpcBuilder).extracting("delegate").extracting("retryPolicy").isNotNull();
133-
getMemoryMode(exporter).isEqualTo(MemoryMode.IMMUTABLE_DATA);
133+
getMemoryMode(exporter).isEqualTo(MemoryMode.REUSABLE_DATA);
134134
}
135135
Mockito.verifyNoInteractions(httpBuilder);
136136
}
@@ -184,7 +184,7 @@ void createExporter_GrpcWithSignalConfiguration() throws CertificateEncodingExce
184184
config.put("otel.exporter.otlp.traces.compression", "gzip");
185185
config.put("otel.exporter.otlp.timeout", "1s");
186186
config.put("otel.exporter.otlp.traces.timeout", "15s");
187-
config.put("otel.java.experimental.exporter.memory_mode", "reusable_data");
187+
config.put("otel.java.exporter.memory_mode", "immutable_data");
188188

189189
try (SpanExporter exporter =
190190
provider.createExporter(DefaultConfigProperties.createFromMap(config))) {
@@ -197,7 +197,7 @@ void createExporter_GrpcWithSignalConfiguration() throws CertificateEncodingExce
197197
verify(grpcBuilder).setTrustedCertificates(serverTls.certificate().getEncoded());
198198
verify(grpcBuilder)
199199
.setClientTls(clientTls.privateKey().getEncoded(), clientTls.certificate().getEncoded());
200-
getMemoryMode(exporter).isEqualTo(MemoryMode.REUSABLE_DATA);
200+
getMemoryMode(exporter).isEqualTo(MemoryMode.IMMUTABLE_DATA);
201201
}
202202
Mockito.verifyNoInteractions(httpBuilder);
203203
}
@@ -217,7 +217,7 @@ void createExporter_HttpDefaults() {
217217
verify(httpBuilder, never()).setTrustedCertificates(any());
218218
verify(httpBuilder, never()).setClientTls(any(), any());
219219
assertThat(httpBuilder).extracting("delegate").extracting("retryPolicy").isNotNull();
220-
getMemoryMode(exporter).isEqualTo(MemoryMode.IMMUTABLE_DATA);
220+
getMemoryMode(exporter).isEqualTo(MemoryMode.REUSABLE_DATA);
221221
}
222222
Mockito.verifyNoInteractions(grpcBuilder);
223223
}
@@ -249,7 +249,7 @@ void createExporter_HttpWithGeneralConfiguration() throws CertificateEncodingExc
249249
verify(httpBuilder)
250250
.setClientTls(clientTls.privateKey().getEncoded(), clientTls.certificate().getEncoded());
251251
assertThat(httpBuilder).extracting("delegate").extracting("retryPolicy").isNull();
252-
getMemoryMode(exporter).isEqualTo(MemoryMode.IMMUTABLE_DATA);
252+
getMemoryMode(exporter).isEqualTo(MemoryMode.REUSABLE_DATA);
253253
}
254254
Mockito.verifyNoInteractions(grpcBuilder);
255255
}
@@ -273,7 +273,7 @@ void createExporter_HttpWithSignalConfiguration() throws CertificateEncodingExce
273273
config.put("otel.exporter.otlp.traces.compression", "gzip");
274274
config.put("otel.exporter.otlp.timeout", "1s");
275275
config.put("otel.exporter.otlp.traces.timeout", "15s");
276-
config.put("otel.java.experimental.exporter.memory_mode", "reusable_data");
276+
config.put("otel.java.exporter.memory_mode", "immutable_data");
277277

278278
try (SpanExporter exporter =
279279
provider.createExporter(DefaultConfigProperties.createFromMap(config))) {
@@ -286,7 +286,7 @@ void createExporter_HttpWithSignalConfiguration() throws CertificateEncodingExce
286286
verify(httpBuilder).setTrustedCertificates(serverTls.certificate().getEncoded());
287287
verify(httpBuilder)
288288
.setClientTls(clientTls.privateKey().getEncoded(), clientTls.certificate().getEncoded());
289-
getMemoryMode(exporter).isEqualTo(MemoryMode.REUSABLE_DATA);
289+
getMemoryMode(exporter).isEqualTo(MemoryMode.IMMUTABLE_DATA);
290290
}
291291
Mockito.verifyNoInteractions(grpcBuilder);
292292
}

exporters/otlp/testing-internal/src/main/java/io/opentelemetry/exporter/otlp/testing/internal/FakeTelemetryUtil.java

+8-11
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,19 @@ public class FakeTelemetryUtil {
3333

3434
private static final String TRACE_ID = "00000000000000000000000000abc123";
3535
private static final String SPAN_ID = "0000000000def456";
36+
private static final InstrumentationScopeInfo SCOPE_INFO =
37+
InstrumentationScopeInfo.builder("testLib")
38+
.setVersion("1.0")
39+
.setSchemaUrl("http://url")
40+
.build();
3641

3742
/** Generate a fake {@link MetricData}. */
3843
public static MetricData generateFakeMetricData() {
3944
long startNs = TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis());
4045
long endNs = startNs + TimeUnit.MILLISECONDS.toNanos(900);
4146
return ImmutableMetricData.createLongSum(
4247
Resource.empty(),
43-
InstrumentationScopeInfo.empty(),
48+
SCOPE_INFO,
4449
"name",
4550
"description",
4651
"1",
@@ -69,23 +74,15 @@ public static SpanData generateFakeSpanData() {
6974
.setLinks(Collections.emptyList())
7075
.setTotalRecordedLinks(0)
7176
.setTotalRecordedEvents(0)
72-
.setInstrumentationScopeInfo(
73-
InstrumentationScopeInfo.builder("testLib")
74-
.setVersion("1.0")
75-
.setSchemaUrl("http://url")
76-
.build())
77+
.setInstrumentationScopeInfo(SCOPE_INFO)
7778
.build();
7879
}
7980

8081
/** Generate a fake {@link LogRecordData}. */
8182
public static LogRecordData generateFakeLogRecordData() {
8283
return TestLogRecordData.builder()
8384
.setResource(Resource.getDefault())
84-
.setInstrumentationScopeInfo(
85-
InstrumentationScopeInfo.builder("testLib")
86-
.setVersion("1.0")
87-
.setSchemaUrl("http://url")
88-
.build())
85+
.setInstrumentationScopeInfo(SCOPE_INFO)
8986
.setBody("log body")
9087
.setAttributes(Attributes.builder().put("key", "value").build())
9188
.setSeverity(Severity.INFO)

exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
import java.io.UncheckedIOException;
2727
import java.net.InetSocketAddress;
2828
import java.util.concurrent.ExecutorService;
29-
import java.util.concurrent.Executors;
29+
import java.util.concurrent.LinkedBlockingQueue;
30+
import java.util.concurrent.ThreadPoolExecutor;
3031
import java.util.concurrent.TimeUnit;
3132
import java.util.function.Predicate;
3233
import javax.annotation.Nullable;
@@ -82,7 +83,13 @@ public static PrometheusHttpServerBuilder builder() {
8283
// sequentially.
8384
if (memoryMode == MemoryMode.REUSABLE_DATA) {
8485
executor =
85-
Executors.newSingleThreadExecutor(new DaemonThreadFactory("prometheus-http-server"));
86+
new ThreadPoolExecutor(
87+
1,
88+
1,
89+
0L,
90+
TimeUnit.MILLISECONDS,
91+
new LinkedBlockingQueue<>(),
92+
new DaemonThreadFactory("prometheus-http-server"));
8693
}
8794
try {
8895
this.httpServer =

exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public final class PrometheusHttpServerBuilder {
2424

2525
static final int DEFAULT_PORT = 9464;
2626
private static final String DEFAULT_HOST = "0.0.0.0";
27-
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.IMMUTABLE_DATA;
27+
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.REUSABLE_DATA;
2828

2929
private String host = DEFAULT_HOST;
3030
private int port = DEFAULT_PORT;
@@ -46,6 +46,7 @@ public final class PrometheusHttpServerBuilder {
4646
this.otelScopeEnabled = builder.otelScopeEnabled;
4747
this.allowedResourceAttributesFilter = builder.allowedResourceAttributesFilter;
4848
this.executor = builder.executor;
49+
this.memoryMode = builder.memoryMode;
4950
this.defaultAggregationSelector = builder.defaultAggregationSelector;
5051
}
5152

@@ -150,6 +151,11 @@ public PrometheusHttpServerBuilder setDefaultAggregationSelector(
150151
* registered with a {@link io.opentelemetry.sdk.metrics.SdkMeterProvider}.
151152
*/
152153
public PrometheusHttpServer build() {
154+
if (memoryMode == MemoryMode.REUSABLE_DATA && executor != null) {
155+
throw new IllegalArgumentException(
156+
"MemoryMode REUSEABLE_DATA cannot be used with custom executor, "
157+
+ "since data may be corrupted if reading metrics concurrently");
158+
}
153159
return new PrometheusHttpServer(
154160
new PrometheusHttpServerBuilder(this), // copy to prevent modification
155161
host,

exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,8 @@ void customExecutor() throws IOException {
427427
PrometheusHttpServer.builder()
428428
.setHost("localhost")
429429
.setPort(port)
430+
// Memory mode must be IMMUTABLE_DATA to set custom executor
431+
.setMemoryMode(MemoryMode.IMMUTABLE_DATA)
430432
.setExecutor(scheduledExecutor)
431433
.build()) {
432434
assertThat(server)
@@ -520,7 +522,7 @@ void toBuilder() {
520522
builder.setAllowedResourceAttributesFilter(resourceAttributesFilter);
521523

522524
ExecutorService executor = Executors.newSingleThreadExecutor();
523-
builder.setExecutor(executor);
525+
builder.setExecutor(executor).setMemoryMode(MemoryMode.IMMUTABLE_DATA);
524526

525527
PrometheusRegistry prometheusRegistry = new PrometheusRegistry();
526528
builder.setPrometheusRegistry(prometheusRegistry);

0 commit comments

Comments
 (0)