From 72f9b23b8bbc3e68d911adcb80790c4fc37156f5 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 7 Aug 2025 17:03:51 -0400 Subject: [PATCH 1/2] Update OtlpMetricExporterProvider to implement AutoConfigureListener --- .../internal/OtlpMetricExporterProvider.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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 ebfaaacf296..1715a9dd29e 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,15 +9,19 @@ import static io.opentelemetry.exporter.otlp.internal.OtlpConfigUtil.PROTOCOL_GRPC; 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.metrics.OtlpHttpMetricExporter; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporterBuilder; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder; +import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener; import io.opentelemetry.sdk.autoconfigure.spi.metrics.ConfigurableMetricExporterProvider; import io.opentelemetry.sdk.metrics.export.MetricExporter; +import java.util.concurrent.atomic.AtomicReference; /** * {@link MetricExporter} SPI implementation for {@link OtlpGrpcMetricExporter} and {@link @@ -26,7 +30,11 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class OtlpMetricExporterProvider implements ConfigurableMetricExporterProvider { +public class OtlpMetricExporterProvider implements ConfigurableMetricExporterProvider, + AutoConfigureListener { + + private final AtomicReference meterProviderRef = + new AtomicReference<>(MeterProvider.noop()); @Override public MetricExporter createExporter(ConfigProperties config) { @@ -51,6 +59,7 @@ public MetricExporter createExporter(ConfigProperties config) { config, builder::setAggregationTemporalitySelector); ExporterBuilderUtil.configureOtlpHistogramDefaultAggregation( config, builder::setDefaultAggregationSelector); + builder.setMeterProvider(meterProviderRef::get); return builder.build(); } else if (protocol.equals(PROTOCOL_GRPC)) { @@ -72,6 +81,7 @@ public MetricExporter createExporter(ConfigProperties config) { config, builder::setAggregationTemporalitySelector); ExporterBuilderUtil.configureOtlpHistogramDefaultAggregation( config, builder::setDefaultAggregationSelector); + builder.setMeterProvider(meterProviderRef::get); return builder.build(); } @@ -92,4 +102,9 @@ OtlpHttpMetricExporterBuilder httpBuilder() { OtlpGrpcMetricExporterBuilder grpcBuilder() { return OtlpGrpcMetricExporter.builder(); } + + @Override + public void afterAutoConfigure(OpenTelemetrySdk sdk) { + meterProviderRef.set(sdk.getMeterProvider()); + } } From 15dddebfb0d39d0beeced78152fe92388e4b88ca Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 7 Aug 2025 17:25:11 -0400 Subject: [PATCH 2/2] update test --- .../exporter/otlp/internal/OtlpMetricExporterProvider.java | 4 ++-- .../sdk/autoconfigure/ConfigurableMetricExporterTest.java | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) 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 1715a9dd29e..eb286b09b94 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 @@ -30,8 +30,8 @@ *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. */ -public class OtlpMetricExporterProvider implements ConfigurableMetricExporterProvider, - AutoConfigureListener { +public class OtlpMetricExporterProvider + implements ConfigurableMetricExporterProvider, AutoConfigureListener { private final AtomicReference meterProviderRef = new AtomicReference<>(MeterProvider.noop()); diff --git a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/ConfigurableMetricExporterTest.java b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/ConfigurableMetricExporterTest.java index bc32ebc84a4..e46d0bd7718 100644 --- a/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/ConfigurableMetricExporterTest.java +++ b/sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/ConfigurableMetricExporterTest.java @@ -10,6 +10,7 @@ import com.google.common.collect.ImmutableMap; import io.opentelemetry.exporter.logging.LoggingMetricExporter; +import io.opentelemetry.exporter.otlp.internal.OtlpMetricExporterProvider; import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter; import io.opentelemetry.internal.testing.CleanupExtension; import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper; @@ -52,7 +53,8 @@ void configureExporter_spiExporter() { assertThat(spiHelper.getListeners()) .satisfiesExactlyInAnyOrder( listener -> - assertThat(listener).isInstanceOf(TestConfigurableMetricExporterProvider.class)); + assertThat(listener).isInstanceOf(TestConfigurableMetricExporterProvider.class), + listener -> assertThat(listener).isInstanceOf(OtlpMetricExporterProvider.class)); } }