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..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 @@ -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.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..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 @@ -104,6 +104,54 @@ 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.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.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(