From ffc71b1c8e4711f574af5d71745e39285097eb5a Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Mon, 12 Oct 2026 20:05:23 +0000 Subject: [PATCH 1/2] Support configuring PeriodicMetricReader maxExportBatchSize in autoconfigure --- .../MetricExporterConfiguration.java | 12 +++-- .../MetricExporterConfigurationTest.java | 49 +++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java index e1f1c1398e7..5fdaa994a71 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java @@ -15,6 +15,7 @@ import io.opentelemetry.sdk.metrics.export.MetricExporter; import io.opentelemetry.sdk.metrics.export.MetricReader; import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReaderBuilder; import java.io.Closeable; import java.time.Duration; import java.util.HashMap; @@ -84,11 +85,16 @@ static MetricReader configureReader( closeables.add(customizedMetricExporter); } InternalTelemetryVersion telemetryVersion = InternalTelemetryConfiguration.getVersion(config); - MetricReader reader = + PeriodicMetricReaderBuilder readerBuilder = PeriodicMetricReader.builder(customizedMetricExporter) .setInternalTelemetryVersion(telemetryVersion) - .setInterval(config.getDuration("otel.metric.export.interval", DEFAULT_EXPORT_INTERVAL)) - .build(); + .setInterval( + config.getDuration("otel.metric.export.interval", DEFAULT_EXPORT_INTERVAL)); + Integer maxExportBatchSize = config.getInt("otel.experimental.metric.export.max.batch.size"); + if (maxExportBatchSize != null) { + readerBuilder.setMaxExportBatchSize(maxExportBatchSize); + } + MetricReader reader = readerBuilder.build(); closeables.add(reader); MetricReader customizedMetricReader = metricReaderCustomizer.apply(reader, config); if (customizedMetricReader != reader) { diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java index 7a3e9518784..893d9cd2b03 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java @@ -104,6 +104,55 @@ void configureReader_customizeReader_otlp() { .isEqualTo(Duration.ofSeconds(123).toNanos()); } + @Test + void configureReader_periodicMetricReader_defaults() { + List closeables = new ArrayList<>(); + + MetricReader reader = + MetricExporterConfiguration.configureReader( + "otlp", CONFIG_PROPERTIES, spiHelper, (a, b) -> a, (a, b) -> a, closeables); + cleanup.addCloseables(closeables); + + assertThat(reader).isInstanceOf(PeriodicMetricReader.class); + assertThat(reader).extracting("intervalNanos").isEqualTo(Duration.ofMinutes(1).toNanos()); + assertThat(reader).extracting("maxExportBatchSize").isEqualTo(0); + } + + @Test + void configureReader_periodicMetricReader_configured() { + List closeables = new ArrayList<>(); + ConfigProperties config = + DefaultConfigProperties.createFromMap( + ImmutableMap.of( + "otel.metric.export.interval", "10s", + "otel.experimental.metric.export.max.batch.size", "200")); + + MetricReader reader = + MetricExporterConfiguration.configureReader( + "otlp", config, spiHelper, (a, b) -> a, (a, b) -> a, closeables); + cleanup.addCloseables(closeables); + + assertThat(reader).isInstanceOf(PeriodicMetricReader.class); + assertThat(reader).extracting("intervalNanos").isEqualTo(Duration.ofSeconds(10).toNanos()); + assertThat(reader).extracting("maxExportBatchSize").isEqualTo(200); + } + + @Test + void configureReader_periodicMetricReader_invalidMaxExportBatchSize() { + List closeables = new ArrayList<>(); + ConfigProperties config = + DefaultConfigProperties.createFromMap( + ImmutableMap.of("otel.experimental.metric.export.max.batch.size", "0")); + + assertThatThrownBy( + () -> + MetricExporterConfiguration.configureReader( + "otlp", config, spiHelper, (a, b) -> a, (a, b) -> a, closeables)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("maxExportBatchSize must be positive"); + cleanup.addCloseables(closeables); + } + @ParameterizedTest @MethodSource("knownExporters") void configureExporter_KnownSpiExportersOnClasspath( From 582ff057e59ce115cb7c6291dc553402d701bbd3 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 21 Oct 2026 16:47:49 +0000 Subject: [PATCH 2/2] Drop experimental from the autoconfigure property --- .../sdk/autoconfigure/MetricExporterConfiguration.java | 2 +- .../sdk/autoconfigure/MetricExporterConfigurationTest.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java index 5fdaa994a71..bbbf4d1b339 100644 --- a/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java +++ b/sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfiguration.java @@ -90,7 +90,7 @@ static MetricReader configureReader( .setInternalTelemetryVersion(telemetryVersion) .setInterval( config.getDuration("otel.metric.export.interval", DEFAULT_EXPORT_INTERVAL)); - Integer maxExportBatchSize = config.getInt("otel.experimental.metric.export.max.batch.size"); + Integer maxExportBatchSize = config.getInt("otel.metric.export.max.batch.size"); if (maxExportBatchSize != null) { readerBuilder.setMaxExportBatchSize(maxExportBatchSize); } diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java index 893d9cd2b03..b1c1a05b510 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/MetricExporterConfigurationTest.java @@ -124,8 +124,7 @@ void configureReader_periodicMetricReader_configured() { ConfigProperties config = DefaultConfigProperties.createFromMap( ImmutableMap.of( - "otel.metric.export.interval", "10s", - "otel.experimental.metric.export.max.batch.size", "200")); + "otel.metric.export.interval", "10s", "otel.metric.export.max.batch.size", "200")); MetricReader reader = MetricExporterConfiguration.configureReader( @@ -142,7 +141,7 @@ void configureReader_periodicMetricReader_invalidMaxExportBatchSize() { List closeables = new ArrayList<>(); ConfigProperties config = DefaultConfigProperties.createFromMap( - ImmutableMap.of("otel.experimental.metric.export.max.batch.size", "0")); + ImmutableMap.of("otel.metric.export.max.batch.size", "0")); assertThatThrownBy( () ->