From df3a644ad715c3ef42a77e181638481e88a123f0 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Sun, 21 Dec 2025 00:14:10 +0100 Subject: [PATCH 01/16] update prom exporter settings --- .../prometheus/PrometheusHttpServer.java | 11 +++++++++- .../PrometheusHttpServerBuilder.java | 21 +++++++++++++++---- .../prometheus/PrometheusMetricReader.java | 2 +- .../internal/PrometheusComponentProvider.java | 9 ++++++++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java index caecae015d3..9e11d3c0a44 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java @@ -42,6 +42,8 @@ public final class PrometheusHttpServer implements MetricReader { private final String host; private final int port; + private final boolean otelScopeLabelsEnabled; + private final boolean otelTargetInfoMetricEnabled; @Nullable private final Predicate allowedResourceAttributesFilter; private final MemoryMode memoryMode; private final DefaultAggregationSelector defaultAggregationSelector; @@ -71,6 +73,8 @@ public static PrometheusHttpServerBuilder builder() { int port, @Nullable ExecutorService executor, PrometheusRegistry prometheusRegistry, + boolean otelScopeLabelsEnabled, + boolean otelTargetInfoMetricEnabled, @Nullable Predicate allowedResourceAttributesFilter, MemoryMode memoryMode, @Nullable HttpHandler defaultHandler, @@ -78,11 +82,14 @@ public static PrometheusHttpServerBuilder builder() { @Nullable Authenticator authenticator) { this.host = host; this.port = port; + this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; + this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; this.allowedResourceAttributesFilter = allowedResourceAttributesFilter; this.memoryMode = memoryMode; this.defaultAggregationSelector = defaultAggregationSelector; this.builder = builder; - this.prometheusMetricReader = new PrometheusMetricReader(allowedResourceAttributesFilter); + this.prometheusMetricReader = + new PrometheusMetricReader(otelScopeLabelsEnabled, otelTargetInfoMetricEnabled, allowedResourceAttributesFilter); this.prometheusRegistry = prometheusRegistry; prometheusRegistry.register(prometheusMetricReader); // When memory mode is REUSABLE_DATA, concurrent reads lead to data corruption. To prevent this, @@ -167,6 +174,8 @@ public String toString() { StringJoiner joiner = new StringJoiner(",", "PrometheusHttpServer{", "}"); joiner.add("host=" + host); joiner.add("port=" + port); + joiner.add("otelScopeLabelsEnabled=" + otelScopeLabelsEnabled); + joiner.add("otelTargetInfoMetricEnabled=" + otelTargetInfoMetricEnabled); joiner.add("allowedResourceAttributesFilter=" + allowedResourceAttributesFilter); joiner.add("memoryMode=" + memoryMode); joiner.add( diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java index defe4091c73..1760d517df8 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java @@ -30,6 +30,8 @@ public final class PrometheusHttpServerBuilder { private String host = DEFAULT_HOST; private int port = DEFAULT_PORT; private PrometheusRegistry prometheusRegistry = new PrometheusRegistry(); + private boolean otelScopeLabelsEnabled = true; + private boolean otelTargetInfoMetricEnabled = true; @Nullable private Predicate allowedResourceAttributesFilter; @Nullable private ExecutorService executor; private MemoryMode memoryMode = DEFAULT_MEMORY_MODE; @@ -44,6 +46,8 @@ public final class PrometheusHttpServerBuilder { this.host = builder.host; this.port = builder.port; this.prometheusRegistry = builder.prometheusRegistry; + this.otelScopeLabelsEnabled = builder.otelScopeLabelsEnabled; + this.otelTargetInfoMetricEnabled = builder.otelTargetInfoMetricEnabled; this.allowedResourceAttributesFilter = builder.allowedResourceAttributesFilter; this.executor = builder.executor; this.memoryMode = builder.memoryMode; @@ -83,12 +87,19 @@ public PrometheusHttpServerBuilder setPrometheusRegistry(PrometheusRegistry prom /** * Set if the {@code otel_scope_*} attributes are generated. Default is {@code true}. - * - * @deprecated {@code otel_scope_*} attributes are always generated. */ @SuppressWarnings("UnusedReturnValue") - @Deprecated - public PrometheusHttpServerBuilder setOtelScopeEnabled(boolean otelScopeEnabled) { + public PrometheusHttpServerBuilder setOtelScopeLabelsEnabled(boolean otelScopeLabelsEnabled) { + this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; + return this; + } + + /** + * Set if the {@code otel_target_info} metric is generated. Default is {@code true}. + */ + @SuppressWarnings("UnusedReturnValue") + public PrometheusHttpServerBuilder setOtelTargetInfoMetricEnabled(boolean otelTargetInfoMetricEnabled) { + this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; return this; } @@ -178,6 +189,8 @@ public PrometheusHttpServer build() { port, executor, prometheusRegistry, + otelScopeLabelsEnabled, + otelTargetInfoMetricEnabled, allowedResourceAttributesFilter, memoryMode, defaultHandler, diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java index ad607390023..a3b2468a8f8 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java @@ -36,7 +36,7 @@ public class PrometheusMetricReader implements MetricReader, MultiCollector { @Deprecated @SuppressWarnings({"unused", "InconsistentOverloads"}) public PrometheusMetricReader( - boolean otelScopeEnabled, @Nullable Predicate allowedResourceAttributesFilter) { + boolean otelScopeLabelsEnabled, @Nullable Predicate allowedResourceAttributesFilter) { this.converter = new Otel2PrometheusConverter(allowedResourceAttributesFilter); } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java index 9968c279536..28bfc274247 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java @@ -45,6 +45,15 @@ public MetricReader create(DeclarativeConfigProperties config) { prometheusBuilder.setHost(host); } + Boolean withoutTargetInfo = config.getBoolean("without_target_info"); + if (withoutTargetInfo != null) { + prometheusBuilder.setOtelTargetInfoMetricEnabled(!withoutTargetInfo); + } + Boolean withoutScopeInfo = config.getBoolean("without_scope_info"); + if (withoutScopeInfo != null) { + prometheusBuilder.setOtelScopeLabelsEnabled(!withoutScopeInfo); + } + DeclarativeConfigProperties withResourceConstantLabels = config.getStructured("with_resource_constant_labels"); if (withResourceConstantLabels != null) { From 2936c8be49b677b5c068fcf9d71388987684226e Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Sun, 21 Dec 2025 00:33:19 +0100 Subject: [PATCH 02/16] update prom exporter settings --- .../prometheus/Otel2PrometheusConverter.java | 18 +++-- .../prometheus/PrometheusHttpServer.java | 6 +- .../PrometheusHttpServerBuilder.java | 11 ++- .../prometheus/PrometheusMetricReader.java | 62 ++++++++++++++-- .../PrometheusMetricReaderBuilder.java | 70 +++++++++++++++++++ .../Otel2PrometheusConverterTest.java | 15 +++- .../PrometheusMetricReaderTest.java | 17 +++-- 7 files changed, 172 insertions(+), 27 deletions(-) create mode 100644 exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java index 1e952b36a09..8de81b8e0ee 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java @@ -80,6 +80,8 @@ final class Otel2PrometheusConverter { private static final long NANOS_PER_MILLISECOND = TimeUnit.MILLISECONDS.toNanos(1); static final int MAX_CACHE_SIZE = 10; + private final boolean otelScopeLabelsEnabled; + private final boolean otelTargetInfoMetricEnabled; @Nullable private final Predicate allowedResourceAttributesFilter; /** @@ -89,12 +91,20 @@ final class Otel2PrometheusConverter { private final Map>> resourceAttributesToAllowedKeysCache; /** - * Constructor with feature flag parameter. + * Constructor with feature flag parameters. * + * @param otelScopeLabelsEnabled whether to add OpenTelemetry scope labels to exported metrics + * @param otelTargetInfoMetricEnabled whether to export the target_info metric with resource + * attributes * @param allowedResourceAttributesFilter if not {@code null}, resource attributes with keys * matching this predicate will be added as labels on each exported metric */ - Otel2PrometheusConverter(@Nullable Predicate allowedResourceAttributesFilter) { + Otel2PrometheusConverter( + boolean otelScopeLabelsEnabled, + boolean otelTargetInfoMetricEnabled, + @Nullable Predicate allowedResourceAttributesFilter) { + this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; + this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; this.allowedResourceAttributesFilter = allowedResourceAttributesFilter; this.resourceAttributesToAllowedKeysCache = allowedResourceAttributesFilter != null @@ -118,7 +128,7 @@ MetricSnapshots convert(@Nullable Collection metricDataCollection) { resource = metricData.getResource(); } } - if (resource != null) { + if (resource != null && otelTargetInfoMetricEnabled) { putOrMerge(snapshotsByName, makeTargetInfo(resource)); } return new MetricSnapshots(snapshotsByName.values()); @@ -457,7 +467,7 @@ private Labels convertAttributes( requireNonNull(additionalAttributes[i]), additionalAttributes[i + 1]); } - if (scope != null) { + if (scope != null && otelScopeLabelsEnabled) { labelNameToValue.putIfAbsent(OTEL_SCOPE_NAME, scope.getName()); if (scope.getVersion() != null) { labelNameToValue.putIfAbsent(OTEL_SCOPE_VERSION, scope.getVersion()); diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java index 9e11d3c0a44..1e8d486e3f4 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java @@ -89,7 +89,11 @@ public static PrometheusHttpServerBuilder builder() { this.defaultAggregationSelector = defaultAggregationSelector; this.builder = builder; this.prometheusMetricReader = - new PrometheusMetricReader(otelScopeLabelsEnabled, otelTargetInfoMetricEnabled, allowedResourceAttributesFilter); + PrometheusMetricReader.builder() + .setOtelScopeLabelsEnabled(otelScopeLabelsEnabled) + .setOtelTargetInfoMetricEnabled(otelTargetInfoMetricEnabled) + .setAllowedResourceAttributesFilter(allowedResourceAttributesFilter) + .build(); this.prometheusRegistry = prometheusRegistry; prometheusRegistry.register(prometheusMetricReader); // When memory mode is REUSABLE_DATA, concurrent reads lead to data corruption. To prevent this, diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java index 1760d517df8..eeb30f33a68 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java @@ -85,20 +85,17 @@ public PrometheusHttpServerBuilder setPrometheusRegistry(PrometheusRegistry prom return this; } - /** - * Set if the {@code otel_scope_*} attributes are generated. Default is {@code true}. - */ + /** Set if the {@code otel_scope_*} attributes are generated. Default is {@code true}. */ @SuppressWarnings("UnusedReturnValue") public PrometheusHttpServerBuilder setOtelScopeLabelsEnabled(boolean otelScopeLabelsEnabled) { this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; return this; } - /** - * Set if the {@code otel_target_info} metric is generated. Default is {@code true}. - */ + /** Set if the {@code otel_target_info} metric is generated. Default is {@code true}. */ @SuppressWarnings("UnusedReturnValue") - public PrometheusHttpServerBuilder setOtelTargetInfoMetricEnabled(boolean otelTargetInfoMetricEnabled) { + public PrometheusHttpServerBuilder setOtelTargetInfoMetricEnabled( + boolean otelTargetInfoMetricEnabled) { this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; return this; } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java index a3b2468a8f8..c7ba0d2ad3d 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java @@ -27,22 +27,66 @@ public class PrometheusMetricReader implements MetricReader, MultiCollector { private volatile CollectionRegistration collectionRegistration = CollectionRegistration.noop(); private final Otel2PrometheusConverter converter; + private final PrometheusMetricReaderBuilder builder; + + /** Returns a new {@link PrometheusMetricReader} with default configuration. */ + public static PrometheusMetricReader create() { + return builder().build(); + } + + /** Returns a new {@link PrometheusMetricReaderBuilder}. */ + public static PrometheusMetricReaderBuilder builder() { + return new PrometheusMetricReaderBuilder(); + } /** - * Deprecated. Use {@link #PrometheusMetricReader(Predicate)}. + * Deprecated. Use {@link #builder()}. * - * @deprecated use {@link #PrometheusMetricReader(Predicate)}. + * @deprecated use {@link #builder()}. */ @Deprecated @SuppressWarnings({"unused", "InconsistentOverloads"}) public PrometheusMetricReader( boolean otelScopeLabelsEnabled, @Nullable Predicate allowedResourceAttributesFilter) { - this.converter = new Otel2PrometheusConverter(allowedResourceAttributesFilter); + this.builder = + new PrometheusMetricReaderBuilder() + .setOtelScopeLabelsEnabled(otelScopeLabelsEnabled) + .setAllowedResourceAttributesFilter(allowedResourceAttributesFilter); + this.converter = + new Otel2PrometheusConverter( + otelScopeLabelsEnabled, + /* otelTargetInfoMetricEnabled= */ true, + allowedResourceAttributesFilter); } - // TODO: refactor to public static create or builder pattern to align with project style + /** + * Deprecated. Use {@link #builder()}. + * + * @deprecated use {@link #builder()}. + */ + @Deprecated public PrometheusMetricReader(@Nullable Predicate allowedResourceAttributesFilter) { - this.converter = new Otel2PrometheusConverter(allowedResourceAttributesFilter); + this.builder = + new PrometheusMetricReaderBuilder() + .setAllowedResourceAttributesFilter(allowedResourceAttributesFilter); + this.converter = + new Otel2PrometheusConverter( + /* otelScopeLabelsEnabled= */ true, + /* otelTargetInfoMetricEnabled= */ true, + allowedResourceAttributesFilter); + } + + // Package-private constructor used by builder + @SuppressWarnings("InconsistentOverloads") + PrometheusMetricReader( + @Nullable Predicate allowedResourceAttributesFilter, + PrometheusMetricReaderBuilder builder, + boolean otelScopeLabelsEnabled, + boolean otelTargetInfoMetricEnabled) { + this.builder = builder; + this.converter = + new Otel2PrometheusConverter( + otelScopeLabelsEnabled, otelTargetInfoMetricEnabled, allowedResourceAttributesFilter); } @Override @@ -69,4 +113,12 @@ public CompletableResultCode shutdown() { public MetricSnapshots collect() { return converter.convert(collectionRegistration.collectAllMetrics()); } + + /** + * Returns a new {@link PrometheusMetricReaderBuilder} with the same configuration as this + * instance. + */ + public PrometheusMetricReaderBuilder toBuilder() { + return new PrometheusMetricReaderBuilder(builder); + } } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java new file mode 100644 index 00000000000..173ad18ed0d --- /dev/null +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java @@ -0,0 +1,70 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.exporter.prometheus; + +import java.util.function.Predicate; +import javax.annotation.Nullable; + +/** Builder for {@link PrometheusMetricReader}. */ +public final class PrometheusMetricReaderBuilder { + + private boolean otelScopeLabelsEnabled = true; + private boolean otelTargetInfoMetricEnabled = true; + @Nullable private Predicate allowedResourceAttributesFilter; + + PrometheusMetricReaderBuilder() {} + + // Copy constructor for toBuilder() + PrometheusMetricReaderBuilder(PrometheusMetricReaderBuilder builder) { + this.otelScopeLabelsEnabled = builder.otelScopeLabelsEnabled; + this.otelTargetInfoMetricEnabled = builder.otelTargetInfoMetricEnabled; + this.allowedResourceAttributesFilter = builder.allowedResourceAttributesFilter; + } + + /** + * Sets whether to add OpenTelemetry scope labels (otel_scope_name, otel_scope_version, etc.) to + * exported metrics. Default is {@code true}. + * + * @param otelScopeLabelsEnabled whether to add scope labels + * @return this builder + */ + public PrometheusMetricReaderBuilder setOtelScopeLabelsEnabled(boolean otelScopeLabelsEnabled) { + this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; + return this; + } + + /** + * Sets whether to export the target_info metric with resource attributes. Default is {@code + * true}. + * + * @param otelTargetInfoMetricEnabled whether to export target_info metric + * @return this builder + */ + public PrometheusMetricReaderBuilder setOtelTargetInfoMetricEnabled( + boolean otelTargetInfoMetricEnabled) { + this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; + return this; + } + + /** + * Sets a filter to control which resource attributes are added as labels on each exported metric. + * If {@code null}, no resource attributes will be added as labels. Default is {@code null}. + * + * @param allowedResourceAttributesFilter predicate to filter resource attributes, or {@code null} + * @return this builder + */ + public PrometheusMetricReaderBuilder setAllowedResourceAttributesFilter( + @Nullable Predicate allowedResourceAttributesFilter) { + this.allowedResourceAttributesFilter = allowedResourceAttributesFilter; + return this; + } + + /** Builds a new {@link PrometheusMetricReader}. */ + public PrometheusMetricReader build() { + return new PrometheusMetricReader( + allowedResourceAttributesFilter, this, otelScopeLabelsEnabled, otelTargetInfoMetricEnabled); + } +} diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java index 4660d8d1ee8..7967345a572 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java @@ -71,7 +71,10 @@ class Otel2PrometheusConverterTest { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private final Otel2PrometheusConverter converter = - new Otel2PrometheusConverter(/* allowedResourceAttributesFilter= */ null); + new Otel2PrometheusConverter( + /* otelScopeLabelsEnabled= */ true, + /* otelTargetInfoMetricEnabled= */ true, + /* allowedResourceAttributesFilter= */ null); @ParameterizedTest @MethodSource("metricMetadataArgs") @@ -201,7 +204,10 @@ void resourceAttributesAddition( throws IOException { Otel2PrometheusConverter converter = - new Otel2PrometheusConverter(allowedResourceAttributesFilter); + new Otel2PrometheusConverter( + /* otelScopeLabelsEnabled= */ true, + /* otelTargetInfoMetricEnabled= */ true, + allowedResourceAttributesFilter); ByteArrayOutputStream out = new ByteArrayOutputStream(); MetricSnapshots snapshots = converter.convert(Collections.singletonList(metricData)); @@ -501,7 +507,10 @@ void validateCacheIsBounded() { }; Otel2PrometheusConverter otel2PrometheusConverter = - new Otel2PrometheusConverter(/* allowedResourceAttributesFilter= */ countPredicate); + new Otel2PrometheusConverter( + /* otelScopeLabelsEnabled= */ true, + /* otelTargetInfoMetricEnabled= */ true, + /* allowedResourceAttributesFilter= */ countPredicate); // Create 20 different metric data objects with 2 different resource attributes; Resource resource1 = Resource.builder().put("cluster", "cluster1").build(); diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java index 12bfad8d7bc..916dbc3e688 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java @@ -61,7 +61,7 @@ class PrometheusMetricReaderTest { void setUp() { this.testClock.setTime(Instant.ofEpochMilli((System.currentTimeMillis() / 100) * 100)); this.createdTimestamp = convertTimestamp(testClock.now()); - this.reader = new PrometheusMetricReader(/* allowedResourceAttributesFilter= */ null); + this.reader = PrometheusMetricReader.create(); this.meter = SdkMeterProvider.builder() .setClock(testClock) @@ -775,8 +775,7 @@ void exponentialHistogramBucketConversion() { for (int i = 0; i < 100_000; i++) { int otelScale = random.nextInt(24) - 4; int prometheusScale = Math.min(otelScale, 8); - PrometheusMetricReader reader = - new PrometheusMetricReader(/* allowedResourceAttributesFilter= */ null); + PrometheusMetricReader reader = PrometheusMetricReader.create(); Meter meter = SdkMeterProvider.builder() .registerMetricReader(reader) @@ -1028,8 +1027,7 @@ void otelScopeComplete() throws IOException { @Test void otelScopeLabelsOnly() throws IOException { - PrometheusMetricReader reader = - new PrometheusMetricReader(/* allowedResourceAttributesFilter= */ null); + PrometheusMetricReader reader = PrometheusMetricReader.create(); Meter meter = SdkMeterProvider.builder() .setClock(testClock) @@ -1059,7 +1057,9 @@ void otelScopeLabelsOnly() throws IOException { @Test void addResourceAttributesWorks() throws IOException { PrometheusMetricReader reader = - new PrometheusMetricReader(/* allowedResourceAttributesFilter= */ Predicates.is("cluster")); + PrometheusMetricReader.builder() + .setAllowedResourceAttributesFilter(Predicates.is("cluster")) + .build(); Meter meter = SdkMeterProvider.builder() .setClock(testClock) @@ -1093,8 +1093,11 @@ void addResourceAttributesWorks() throws IOException { @SuppressWarnings("deprecation") // test deprecated constructor @Test void deprecatedConstructor() { - assertThat(new PrometheusMetricReader(false, null)) + // The 2-arg deprecated constructor should behave the same as the 1-arg constructor + // when otelScopeLabelsEnabled=true (which is also the default for the builder) + assertThat(new PrometheusMetricReader(/* otelScopeLabelsEnabled= */ true, null)) .usingRecursiveComparison() + .ignoringFields("builder") .isEqualTo(new PrometheusMetricReader(null)); } From dbfdb1003c9bdd98416bc7e7f8588d7190f1f9ca Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Sun, 21 Dec 2025 09:34:25 +0100 Subject: [PATCH 03/16] update prom exporter settings --- .../prometheus/PrometheusMetricReader.java | 36 +++++-------------- .../PrometheusMetricReaderBuilder.java | 2 +- .../prometheus/PrometheusHttpServerTest.java | 2 ++ 3 files changed, 11 insertions(+), 29 deletions(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java index c7ba0d2ad3d..e9524c2626d 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java @@ -27,7 +27,6 @@ public class PrometheusMetricReader implements MetricReader, MultiCollector { private volatile CollectionRegistration collectionRegistration = CollectionRegistration.noop(); private final Otel2PrometheusConverter converter; - private final PrometheusMetricReaderBuilder builder; /** Returns a new {@link PrometheusMetricReader} with default configuration. */ public static PrometheusMetricReader create() { @@ -48,15 +47,10 @@ public static PrometheusMetricReaderBuilder builder() { @SuppressWarnings({"unused", "InconsistentOverloads"}) public PrometheusMetricReader( boolean otelScopeLabelsEnabled, @Nullable Predicate allowedResourceAttributesFilter) { - this.builder = - new PrometheusMetricReaderBuilder() - .setOtelScopeLabelsEnabled(otelScopeLabelsEnabled) - .setAllowedResourceAttributesFilter(allowedResourceAttributesFilter); - this.converter = - new Otel2PrometheusConverter( - otelScopeLabelsEnabled, - /* otelTargetInfoMetricEnabled= */ true, - allowedResourceAttributesFilter); + this( + allowedResourceAttributesFilter, + otelScopeLabelsEnabled, + /* otelTargetInfoMetricEnabled= */ true); } /** @@ -66,24 +60,18 @@ public PrometheusMetricReader( */ @Deprecated public PrometheusMetricReader(@Nullable Predicate allowedResourceAttributesFilter) { - this.builder = - new PrometheusMetricReaderBuilder() - .setAllowedResourceAttributesFilter(allowedResourceAttributesFilter); - this.converter = - new Otel2PrometheusConverter( - /* otelScopeLabelsEnabled= */ true, - /* otelTargetInfoMetricEnabled= */ true, - allowedResourceAttributesFilter); + this( + allowedResourceAttributesFilter, + /* otelScopeLabelsEnabled= */ true, + /* otelTargetInfoMetricEnabled= */ true); } // Package-private constructor used by builder @SuppressWarnings("InconsistentOverloads") PrometheusMetricReader( @Nullable Predicate allowedResourceAttributesFilter, - PrometheusMetricReaderBuilder builder, boolean otelScopeLabelsEnabled, boolean otelTargetInfoMetricEnabled) { - this.builder = builder; this.converter = new Otel2PrometheusConverter( otelScopeLabelsEnabled, otelTargetInfoMetricEnabled, allowedResourceAttributesFilter); @@ -113,12 +101,4 @@ public CompletableResultCode shutdown() { public MetricSnapshots collect() { return converter.convert(collectionRegistration.collectAllMetrics()); } - - /** - * Returns a new {@link PrometheusMetricReaderBuilder} with the same configuration as this - * instance. - */ - public PrometheusMetricReaderBuilder toBuilder() { - return new PrometheusMetricReaderBuilder(builder); - } } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java index 173ad18ed0d..e98924b1374 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java @@ -65,6 +65,6 @@ public PrometheusMetricReaderBuilder setAllowedResourceAttributesFilter( /** Builds a new {@link PrometheusMetricReader}. */ public PrometheusMetricReader build() { return new PrometheusMetricReader( - allowedResourceAttributesFilter, this, otelScopeLabelsEnabled, otelTargetInfoMetricEnabled); + allowedResourceAttributesFilter, otelScopeLabelsEnabled, otelTargetInfoMetricEnabled); } } diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java index fc11be75c6d..7165f48099a 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java @@ -432,6 +432,8 @@ void stringRepresentation() { "PrometheusHttpServer{" + "host=localhost," + "port=0," + + "otelScopeLabelsEnabled=true," + + "otelTargetInfoMetricEnabled=true," + "allowedResourceAttributesFilter=null," + "memoryMode=REUSABLE_DATA," + "defaultAggregationSelector=DefaultAggregationSelector{COUNTER=default, UP_DOWN_COUNTER=default, HISTOGRAM=default, OBSERVABLE_COUNTER=default, OBSERVABLE_UP_DOWN_COUNTER=default, OBSERVABLE_GAUGE=default, GAUGE=default}" From dd129e170b685cf873f64aba4775dab8029d5f89 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Sun, 21 Dec 2025 09:39:30 +0100 Subject: [PATCH 04/16] update prom exporter settings --- .../exporter/prometheus/PrometheusMetricReader.java | 5 +++-- .../exporter/prometheus/PrometheusMetricReaderTest.java | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java index e9524c2626d..ed7aa59daa1 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java @@ -46,10 +46,11 @@ public static PrometheusMetricReaderBuilder builder() { @Deprecated @SuppressWarnings({"unused", "InconsistentOverloads"}) public PrometheusMetricReader( - boolean otelScopeLabelsEnabled, @Nullable Predicate allowedResourceAttributesFilter) { + boolean otelScopeEnabled, @Nullable Predicate allowedResourceAttributesFilter) { + // otelScopeEnabled parameter was used to control the scope info metric, not scope labels. this( allowedResourceAttributesFilter, - otelScopeLabelsEnabled, + /* otelScopeLabelsEnabled= */ true, /* otelTargetInfoMetricEnabled= */ true); } diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java index 916dbc3e688..d3ee50e239a 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java @@ -1095,9 +1095,12 @@ void addResourceAttributesWorks() throws IOException { void deprecatedConstructor() { // The 2-arg deprecated constructor should behave the same as the 1-arg constructor // when otelScopeLabelsEnabled=true (which is also the default for the builder) - assertThat(new PrometheusMetricReader(/* otelScopeLabelsEnabled= */ true, null)) + assertThat(new PrometheusMetricReader(/* otelScopeEnabled= */ false, null)) + .usingRecursiveComparison() + .isEqualTo(new PrometheusMetricReader(null)); + // The 3-arg constructor should behave the same as the 2-arg deprecated constructor + assertThat(new PrometheusMetricReader(null, /* otelScopeLabelsEnabled= */ true, /* otelTargetInfoMetricEnabled */ true)) .usingRecursiveComparison() - .ignoringFields("builder") .isEqualTo(new PrometheusMetricReader(null)); } From 57c492bf5c570e025e7ce5da4532392e0ee1f439 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Sun, 21 Dec 2025 09:56:22 +0100 Subject: [PATCH 05/16] update prom exporter settings --- .../PrometheusMetricReaderTest.java | 72 +++++++------------ 1 file changed, 26 insertions(+), 46 deletions(-) diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java index d3ee50e239a..93b9fe1a29e 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java @@ -23,6 +23,7 @@ import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.View; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.resources.ResourceBuilder; import io.opentelemetry.sdk.testing.time.TestClock; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.prometheus.metrics.expositionformats.OpenMetricsTextFormatWriter; @@ -997,28 +998,17 @@ void createdTimestamp() throws IOException { } @Test - void otelScopeComplete() throws IOException { - // There is currently no API for adding scope attributes. - // However, we can at least test the otel_scope_version attribute. - Meter meter = - SdkMeterProvider.builder() - .setClock(testClock) - .registerMetricReader(this.reader) - .setResource( - Resource.getDefault().toBuilder().put("telemetry.sdk.version", "1.x.x").build()) - .build() - .meterBuilder("test-scope") - .setInstrumentationVersion("a.b.c") - .build(); - LongCounter counter = meter.counterBuilder("test.count").build(); - counter.add(1); + void withoutScopeLabels() throws IOException { + PrometheusMetricReader reader = + PrometheusMetricReader.builder().setOtelScopeLabelsEnabled(false).build(); + addCounter(reader, Resource.getDefault().toBuilder()); String expected = "" + "# TYPE target info\n" + "target_info{service_name=\"unknown_service:java\",telemetry_sdk_language=\"java\",telemetry_sdk_name=\"opentelemetry\",telemetry_sdk_version=\"1.x.x\"} 1\n" + "# TYPE test_count counter\n" - + "test_count_total{otel_scope_name=\"test-scope\",otel_scope_version=\"a.b.c\"} 1.0\n" - + "test_count_created{otel_scope_name=\"test-scope\",otel_scope_version=\"a.b.c\"} " + + "test_count_total 1.0\n" + + "test_count_created " + createdTimestamp + "\n" + "# EOF\n"; @@ -1026,24 +1016,12 @@ void otelScopeComplete() throws IOException { } @Test - void otelScopeLabelsOnly() throws IOException { - PrometheusMetricReader reader = PrometheusMetricReader.create(); - Meter meter = - SdkMeterProvider.builder() - .setClock(testClock) - .registerMetricReader(reader) - .setResource( - Resource.getDefault().toBuilder().put("telemetry.sdk.version", "1.x.x").build()) - .build() - .meterBuilder("test-scope") - .setInstrumentationVersion("a.b.c") - .build(); - LongCounter counter = meter.counterBuilder("test.count").build(); - counter.add(1); + void withoutTargetInfoMetric() throws IOException { + PrometheusMetricReader reader = + PrometheusMetricReader.builder().setOtelTargetInfoMetricEnabled(false).build(); + addCounter(reader, Resource.getDefault().toBuilder()); String expected = "" - + "# TYPE target info\n" - + "target_info{service_name=\"unknown_service:java\",telemetry_sdk_language=\"java\",telemetry_sdk_name=\"opentelemetry\",telemetry_sdk_version=\"1.x.x\"} 1\n" + "# TYPE test_count counter\n" + "test_count_total{otel_scope_name=\"test-scope\",otel_scope_version=\"a.b.c\"} 1.0\n" + "test_count_created{otel_scope_name=\"test-scope\",otel_scope_version=\"a.b.c\"} " @@ -1053,28 +1031,28 @@ void otelScopeLabelsOnly() throws IOException { assertThat(toOpenMetrics(reader.collect())).isEqualTo(expected); } - @SuppressWarnings("resource") - @Test - void addResourceAttributesWorks() throws IOException { - PrometheusMetricReader reader = - PrometheusMetricReader.builder() - .setAllowedResourceAttributesFilter(Predicates.is("cluster")) - .build(); + private void addCounter(PrometheusMetricReader reader, ResourceBuilder builder) { Meter meter = SdkMeterProvider.builder() .setClock(testClock) .registerMetricReader(reader) - .setResource( - Resource.getDefault().toBuilder() - .put("cluster", "my.cluster") - .put("telemetry.sdk.version", "1.x.x") - .build()) + .setResource(builder.put("telemetry.sdk.version", "1.x.x").build()) .build() .meterBuilder("test-scope") .setInstrumentationVersion("a.b.c") .build(); LongCounter counter = meter.counterBuilder("test.count").build(); counter.add(1); + } + + @SuppressWarnings("resource") + @Test + void addResourceAttributesWorks() throws IOException { + PrometheusMetricReader reader = + PrometheusMetricReader.builder() + .setAllowedResourceAttributesFilter(Predicates.is("cluster")) + .build(); + addCounter(reader, Resource.getDefault().toBuilder().put("cluster", "my.cluster")); String expected = "" + "# TYPE target info\n" @@ -1099,7 +1077,9 @@ void deprecatedConstructor() { .usingRecursiveComparison() .isEqualTo(new PrometheusMetricReader(null)); // The 3-arg constructor should behave the same as the 2-arg deprecated constructor - assertThat(new PrometheusMetricReader(null, /* otelScopeLabelsEnabled= */ true, /* otelTargetInfoMetricEnabled */ true)) + assertThat( + new PrometheusMetricReader( + null, /* otelScopeLabelsEnabled= */ true, /* otelTargetInfoMetricEnabled */ true)) .usingRecursiveComparison() .isEqualTo(new PrometheusMetricReader(null)); } From 22bc874eb335ba9f867246d10fc78b4b0fd5792c Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Sun, 21 Dec 2025 10:21:12 +0100 Subject: [PATCH 06/16] update prom exporter settings --- .../incubator/fileconfig/MetricReaderFactoryTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java index bc63ca7bdcb..1cc7fe94c81 100644 --- a/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java +++ b/sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MetricReaderFactoryTest.java @@ -189,7 +189,8 @@ void create_PullPrometheusConfigured() throws IOException { new IncludeExcludeModel() .withIncluded(singletonList("foo")) .withExcluded(singletonList("bar"))) - .withWithoutScopeInfo(true) + .withWithoutScopeInfo(false) + .withWithoutTargetInfo(false) .withTranslationStrategy( ExperimentalPrometheusMetricExporterModel .ExperimentalPrometheusTranslationStrategy From c74c1a88e803f44810292b4e95c8700f8e9afec4 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Sun, 21 Dec 2025 10:30:14 +0100 Subject: [PATCH 07/16] update prom exporter settings --- .../exporter/prometheus/PrometheusMetricReaderBuilder.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java index e98924b1374..1998f34565b 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java @@ -17,13 +17,6 @@ public final class PrometheusMetricReaderBuilder { PrometheusMetricReaderBuilder() {} - // Copy constructor for toBuilder() - PrometheusMetricReaderBuilder(PrometheusMetricReaderBuilder builder) { - this.otelScopeLabelsEnabled = builder.otelScopeLabelsEnabled; - this.otelTargetInfoMetricEnabled = builder.otelTargetInfoMetricEnabled; - this.allowedResourceAttributesFilter = builder.allowedResourceAttributesFilter; - } - /** * Sets whether to add OpenTelemetry scope labels (otel_scope_name, otel_scope_version, etc.) to * exported metrics. Default is {@code true}. From 68e620788b6e6be36f1b93fe3d8e4d52635633c2 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 5 Jan 2026 16:33:59 +0100 Subject: [PATCH 08/16] add @CanIgnoreReturnValue --- exporters/prometheus/build.gradle.kts | 1 + .../prometheus/PrometheusHttpServerBuilder.java | 15 ++++++++++++--- .../prometheus/PrometheusMetricReaderBuilder.java | 4 ++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/exporters/prometheus/build.gradle.kts b/exporters/prometheus/build.gradle.kts index 299e741425e..6587f82784d 100644 --- a/exporters/prometheus/build.gradle.kts +++ b/exporters/prometheus/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { implementation("io.prometheus:prometheus-metrics-exposition-formats-no-protobuf") compileOnly("com.google.auto.value:auto-value-annotations") + compileOnly("com.google.errorprone:error_prone_annotations") annotationProcessor("com.google.auto.value:auto-value") diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java index eeb30f33a68..2647249d83b 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java @@ -8,6 +8,7 @@ import static io.opentelemetry.api.internal.Utils.checkArgument; import static java.util.Objects.requireNonNull; +import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.sun.net.httpserver.Authenticator; import com.sun.net.httpserver.HttpHandler; import io.opentelemetry.sdk.common.export.MemoryMode; @@ -56,6 +57,7 @@ public final class PrometheusHttpServerBuilder { } /** Sets the host to bind to. If unset, defaults to {@value #DEFAULT_HOST}. */ + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setHost(String host) { requireNonNull(host, "host"); checkArgument(!host.isEmpty(), "host must not be empty"); @@ -64,6 +66,7 @@ public PrometheusHttpServerBuilder setHost(String host) { } /** Sets the port to bind to. If unset, defaults to {@value #DEFAULT_PORT}. */ + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setPort(int port) { checkArgument(port >= 0, "port must be positive"); this.port = port; @@ -71,6 +74,7 @@ public PrometheusHttpServerBuilder setPort(int port) { } /** Sets the {@link ExecutorService} to be used for {@link PrometheusHttpServer}. */ + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setExecutor(ExecutorService executor) { requireNonNull(executor, "executor"); this.executor = executor; @@ -78,7 +82,7 @@ public PrometheusHttpServerBuilder setExecutor(ExecutorService executor) { } /** Sets the {@link PrometheusRegistry} to be used for {@link PrometheusHttpServer}. */ - @SuppressWarnings("UnusedReturnValue") + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setPrometheusRegistry(PrometheusRegistry prometheusRegistry) { requireNonNull(prometheusRegistry, "prometheusRegistry"); this.prometheusRegistry = prometheusRegistry; @@ -86,14 +90,14 @@ public PrometheusHttpServerBuilder setPrometheusRegistry(PrometheusRegistry prom } /** Set if the {@code otel_scope_*} attributes are generated. Default is {@code true}. */ - @SuppressWarnings("UnusedReturnValue") + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setOtelScopeLabelsEnabled(boolean otelScopeLabelsEnabled) { this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; return this; } /** Set if the {@code otel_target_info} metric is generated. Default is {@code true}. */ - @SuppressWarnings("UnusedReturnValue") + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setOtelTargetInfoMetricEnabled( boolean otelTargetInfoMetricEnabled) { this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; @@ -110,6 +114,7 @@ public PrometheusHttpServerBuilder setOtelTargetInfoMetricEnabled( * be added as a label on each exported metric. The predicates input is the resource attribute * key. */ + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setAllowedResourceAttributesFilter( Predicate resourceAttributesFilter) { this.allowedResourceAttributesFilter = requireNonNull(resourceAttributesFilter); @@ -123,6 +128,7 @@ public PrometheusHttpServerBuilder setAllowedResourceAttributesFilter( * accomplished by overriding {@link #setExecutor(ExecutorService)} to {@link * Executors#newSingleThreadExecutor()}. */ + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setMemoryMode(MemoryMode memoryMode) { requireNonNull(memoryMode, "memoryMode"); this.memoryMode = memoryMode; @@ -140,6 +146,7 @@ public PrometheusHttpServerBuilder setMemoryMode(MemoryMode memoryMode) { * .build() * */ + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setDefaultHandler(HttpHandler defaultHandler) { requireNonNull(defaultHandler, "defaultHandler"); this.defaultHandler = defaultHandler; @@ -152,6 +159,7 @@ public PrometheusHttpServerBuilder setDefaultHandler(HttpHandler defaultHandler) * *

If unset, defaults to {@link DefaultAggregationSelector#getDefault()}. */ + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setDefaultAggregationSelector( DefaultAggregationSelector defaultAggregationSelector) { requireNonNull(defaultAggregationSelector, "defaultAggregationSelector"); @@ -164,6 +172,7 @@ public PrometheusHttpServerBuilder setDefaultAggregationSelector( * *

If unset, no authentication will be performed. */ + @CanIgnoreReturnValue public PrometheusHttpServerBuilder setAuthenticator(Authenticator authenticator) { requireNonNull(authenticator, "authenticator"); this.authenticator = authenticator; diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java index 1998f34565b..a0fc4bd57fc 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java @@ -5,6 +5,7 @@ package io.opentelemetry.exporter.prometheus; +import com.google.errorprone.annotations.CanIgnoreReturnValue; import java.util.function.Predicate; import javax.annotation.Nullable; @@ -24,6 +25,7 @@ public final class PrometheusMetricReaderBuilder { * @param otelScopeLabelsEnabled whether to add scope labels * @return this builder */ + @CanIgnoreReturnValue public PrometheusMetricReaderBuilder setOtelScopeLabelsEnabled(boolean otelScopeLabelsEnabled) { this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; return this; @@ -36,6 +38,7 @@ public PrometheusMetricReaderBuilder setOtelScopeLabelsEnabled(boolean otelScope * @param otelTargetInfoMetricEnabled whether to export target_info metric * @return this builder */ + @CanIgnoreReturnValue public PrometheusMetricReaderBuilder setOtelTargetInfoMetricEnabled( boolean otelTargetInfoMetricEnabled) { this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; @@ -49,6 +52,7 @@ public PrometheusMetricReaderBuilder setOtelTargetInfoMetricEnabled( * @param allowedResourceAttributesFilter predicate to filter resource attributes, or {@code null} * @return this builder */ + @CanIgnoreReturnValue public PrometheusMetricReaderBuilder setAllowedResourceAttributesFilter( @Nullable Predicate allowedResourceAttributesFilter) { this.allowedResourceAttributesFilter = allowedResourceAttributesFilter; From c63772e2cb69dbb3580e1568b257924d5a7cb035 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 5 Jan 2026 16:35:33 +0100 Subject: [PATCH 09/16] rename --- .../prometheus/Otel2PrometheusConverter.java | 10 +++++----- .../exporter/prometheus/PrometheusHttpServer.java | 10 +++++----- .../prometheus/PrometheusHttpServerBuilder.java | 12 ++++++------ .../exporter/prometheus/PrometheusMetricReader.java | 8 ++++---- .../prometheus/PrometheusMetricReaderBuilder.java | 12 ++++++------ .../internal/PrometheusComponentProvider.java | 2 +- .../prometheus/Otel2PrometheusConverterTest.java | 6 +++--- .../prometheus/PrometheusHttpServerTest.java | 2 +- .../prometheus/PrometheusMetricReaderTest.java | 4 ++-- 9 files changed, 33 insertions(+), 33 deletions(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java index 8de81b8e0ee..b1aabeb2c2e 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java @@ -81,7 +81,7 @@ final class Otel2PrometheusConverter { static final int MAX_CACHE_SIZE = 10; private final boolean otelScopeLabelsEnabled; - private final boolean otelTargetInfoMetricEnabled; + private final boolean targetInfoMetricEnabled; @Nullable private final Predicate allowedResourceAttributesFilter; /** @@ -94,17 +94,17 @@ final class Otel2PrometheusConverter { * Constructor with feature flag parameters. * * @param otelScopeLabelsEnabled whether to add OpenTelemetry scope labels to exported metrics - * @param otelTargetInfoMetricEnabled whether to export the target_info metric with resource + * @param targetInfoMetricEnabled whether to export the target_info metric with resource * attributes * @param allowedResourceAttributesFilter if not {@code null}, resource attributes with keys * matching this predicate will be added as labels on each exported metric */ Otel2PrometheusConverter( boolean otelScopeLabelsEnabled, - boolean otelTargetInfoMetricEnabled, + boolean targetInfoMetricEnabled, @Nullable Predicate allowedResourceAttributesFilter) { this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; - this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; + this.targetInfoMetricEnabled = targetInfoMetricEnabled; this.allowedResourceAttributesFilter = allowedResourceAttributesFilter; this.resourceAttributesToAllowedKeysCache = allowedResourceAttributesFilter != null @@ -128,7 +128,7 @@ MetricSnapshots convert(@Nullable Collection metricDataCollection) { resource = metricData.getResource(); } } - if (resource != null && otelTargetInfoMetricEnabled) { + if (resource != null && targetInfoMetricEnabled) { putOrMerge(snapshotsByName, makeTargetInfo(resource)); } return new MetricSnapshots(snapshotsByName.values()); diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java index 1e8d486e3f4..8adbc6f38c9 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java @@ -43,7 +43,7 @@ public final class PrometheusHttpServer implements MetricReader { private final String host; private final int port; private final boolean otelScopeLabelsEnabled; - private final boolean otelTargetInfoMetricEnabled; + private final boolean targetInfoMetricEnabled; @Nullable private final Predicate allowedResourceAttributesFilter; private final MemoryMode memoryMode; private final DefaultAggregationSelector defaultAggregationSelector; @@ -74,7 +74,7 @@ public static PrometheusHttpServerBuilder builder() { @Nullable ExecutorService executor, PrometheusRegistry prometheusRegistry, boolean otelScopeLabelsEnabled, - boolean otelTargetInfoMetricEnabled, + boolean targetInfoMetricEnabled, @Nullable Predicate allowedResourceAttributesFilter, MemoryMode memoryMode, @Nullable HttpHandler defaultHandler, @@ -83,7 +83,7 @@ public static PrometheusHttpServerBuilder builder() { this.host = host; this.port = port; this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; - this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; + this.targetInfoMetricEnabled = targetInfoMetricEnabled; this.allowedResourceAttributesFilter = allowedResourceAttributesFilter; this.memoryMode = memoryMode; this.defaultAggregationSelector = defaultAggregationSelector; @@ -91,7 +91,7 @@ public static PrometheusHttpServerBuilder builder() { this.prometheusMetricReader = PrometheusMetricReader.builder() .setOtelScopeLabelsEnabled(otelScopeLabelsEnabled) - .setOtelTargetInfoMetricEnabled(otelTargetInfoMetricEnabled) + .setTargetInfoMetricEnabled(targetInfoMetricEnabled) .setAllowedResourceAttributesFilter(allowedResourceAttributesFilter) .build(); this.prometheusRegistry = prometheusRegistry; @@ -179,7 +179,7 @@ public String toString() { joiner.add("host=" + host); joiner.add("port=" + port); joiner.add("otelScopeLabelsEnabled=" + otelScopeLabelsEnabled); - joiner.add("otelTargetInfoMetricEnabled=" + otelTargetInfoMetricEnabled); + joiner.add("targetInfoMetricEnabled=" + targetInfoMetricEnabled); joiner.add("allowedResourceAttributesFilter=" + allowedResourceAttributesFilter); joiner.add("memoryMode=" + memoryMode); joiner.add( diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java index 2647249d83b..c05b0032214 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java @@ -32,7 +32,7 @@ public final class PrometheusHttpServerBuilder { private int port = DEFAULT_PORT; private PrometheusRegistry prometheusRegistry = new PrometheusRegistry(); private boolean otelScopeLabelsEnabled = true; - private boolean otelTargetInfoMetricEnabled = true; + private boolean targetInfoMetricEnabled = true; @Nullable private Predicate allowedResourceAttributesFilter; @Nullable private ExecutorService executor; private MemoryMode memoryMode = DEFAULT_MEMORY_MODE; @@ -48,7 +48,7 @@ public final class PrometheusHttpServerBuilder { this.port = builder.port; this.prometheusRegistry = builder.prometheusRegistry; this.otelScopeLabelsEnabled = builder.otelScopeLabelsEnabled; - this.otelTargetInfoMetricEnabled = builder.otelTargetInfoMetricEnabled; + this.targetInfoMetricEnabled = builder.targetInfoMetricEnabled; this.allowedResourceAttributesFilter = builder.allowedResourceAttributesFilter; this.executor = builder.executor; this.memoryMode = builder.memoryMode; @@ -98,9 +98,9 @@ public PrometheusHttpServerBuilder setOtelScopeLabelsEnabled(boolean otelScopeLa /** Set if the {@code otel_target_info} metric is generated. Default is {@code true}. */ @CanIgnoreReturnValue - public PrometheusHttpServerBuilder setOtelTargetInfoMetricEnabled( - boolean otelTargetInfoMetricEnabled) { - this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; + public PrometheusHttpServerBuilder setTargetInfoMetricEnabled( + boolean targetInfoMetricEnabled) { + this.targetInfoMetricEnabled = targetInfoMetricEnabled; return this; } @@ -196,7 +196,7 @@ public PrometheusHttpServer build() { executor, prometheusRegistry, otelScopeLabelsEnabled, - otelTargetInfoMetricEnabled, + targetInfoMetricEnabled, allowedResourceAttributesFilter, memoryMode, defaultHandler, diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java index ed7aa59daa1..58b53235975 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java @@ -51,7 +51,7 @@ public PrometheusMetricReader( this( allowedResourceAttributesFilter, /* otelScopeLabelsEnabled= */ true, - /* otelTargetInfoMetricEnabled= */ true); + /* targetInfoMetricEnabled= */ true); } /** @@ -64,7 +64,7 @@ public PrometheusMetricReader(@Nullable Predicate allowedResourceAttribu this( allowedResourceAttributesFilter, /* otelScopeLabelsEnabled= */ true, - /* otelTargetInfoMetricEnabled= */ true); + /* targetInfoMetricEnabled= */ true); } // Package-private constructor used by builder @@ -72,10 +72,10 @@ public PrometheusMetricReader(@Nullable Predicate allowedResourceAttribu PrometheusMetricReader( @Nullable Predicate allowedResourceAttributesFilter, boolean otelScopeLabelsEnabled, - boolean otelTargetInfoMetricEnabled) { + boolean targetInfoMetricEnabled) { this.converter = new Otel2PrometheusConverter( - otelScopeLabelsEnabled, otelTargetInfoMetricEnabled, allowedResourceAttributesFilter); + otelScopeLabelsEnabled, targetInfoMetricEnabled, allowedResourceAttributesFilter); } @Override diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java index a0fc4bd57fc..7a54f9cd43e 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java @@ -13,7 +13,7 @@ public final class PrometheusMetricReaderBuilder { private boolean otelScopeLabelsEnabled = true; - private boolean otelTargetInfoMetricEnabled = true; + private boolean targetInfoMetricEnabled = true; @Nullable private Predicate allowedResourceAttributesFilter; PrometheusMetricReaderBuilder() {} @@ -35,13 +35,13 @@ public PrometheusMetricReaderBuilder setOtelScopeLabelsEnabled(boolean otelScope * Sets whether to export the target_info metric with resource attributes. Default is {@code * true}. * - * @param otelTargetInfoMetricEnabled whether to export target_info metric + * @param targetInfoMetricEnabled whether to export target_info metric * @return this builder */ @CanIgnoreReturnValue - public PrometheusMetricReaderBuilder setOtelTargetInfoMetricEnabled( - boolean otelTargetInfoMetricEnabled) { - this.otelTargetInfoMetricEnabled = otelTargetInfoMetricEnabled; + public PrometheusMetricReaderBuilder setTargetInfoMetricEnabled( + boolean targetInfoMetricEnabled) { + this.targetInfoMetricEnabled = targetInfoMetricEnabled; return this; } @@ -62,6 +62,6 @@ public PrometheusMetricReaderBuilder setAllowedResourceAttributesFilter( /** Builds a new {@link PrometheusMetricReader}. */ public PrometheusMetricReader build() { return new PrometheusMetricReader( - allowedResourceAttributesFilter, otelScopeLabelsEnabled, otelTargetInfoMetricEnabled); + allowedResourceAttributesFilter, otelScopeLabelsEnabled, targetInfoMetricEnabled); } } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java index 28bfc274247..a74c5d873ac 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/internal/PrometheusComponentProvider.java @@ -47,7 +47,7 @@ public MetricReader create(DeclarativeConfigProperties config) { Boolean withoutTargetInfo = config.getBoolean("without_target_info"); if (withoutTargetInfo != null) { - prometheusBuilder.setOtelTargetInfoMetricEnabled(!withoutTargetInfo); + prometheusBuilder.setTargetInfoMetricEnabled(!withoutTargetInfo); } Boolean withoutScopeInfo = config.getBoolean("without_scope_info"); if (withoutScopeInfo != null) { diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java index 7967345a572..77f215504cb 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverterTest.java @@ -73,7 +73,7 @@ class Otel2PrometheusConverterTest { private final Otel2PrometheusConverter converter = new Otel2PrometheusConverter( /* otelScopeLabelsEnabled= */ true, - /* otelTargetInfoMetricEnabled= */ true, + /* targetInfoMetricEnabled= */ true, /* allowedResourceAttributesFilter= */ null); @ParameterizedTest @@ -206,7 +206,7 @@ void resourceAttributesAddition( Otel2PrometheusConverter converter = new Otel2PrometheusConverter( /* otelScopeLabelsEnabled= */ true, - /* otelTargetInfoMetricEnabled= */ true, + /* targetInfoMetricEnabled= */ true, allowedResourceAttributesFilter); ByteArrayOutputStream out = new ByteArrayOutputStream(); @@ -509,7 +509,7 @@ void validateCacheIsBounded() { Otel2PrometheusConverter otel2PrometheusConverter = new Otel2PrometheusConverter( /* otelScopeLabelsEnabled= */ true, - /* otelTargetInfoMetricEnabled= */ true, + /* targetInfoMetricEnabled= */ true, /* allowedResourceAttributesFilter= */ countPredicate); // Create 20 different metric data objects with 2 different resource attributes; diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java index 7165f48099a..03287d9dde1 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java @@ -433,7 +433,7 @@ void stringRepresentation() { + "host=localhost," + "port=0," + "otelScopeLabelsEnabled=true," - + "otelTargetInfoMetricEnabled=true," + + "targetInfoMetricEnabled=true," + "allowedResourceAttributesFilter=null," + "memoryMode=REUSABLE_DATA," + "defaultAggregationSelector=DefaultAggregationSelector{COUNTER=default, UP_DOWN_COUNTER=default, HISTOGRAM=default, OBSERVABLE_COUNTER=default, OBSERVABLE_UP_DOWN_COUNTER=default, OBSERVABLE_GAUGE=default, GAUGE=default}" diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java index 93b9fe1a29e..d641e7b60ea 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java @@ -1018,7 +1018,7 @@ void withoutScopeLabels() throws IOException { @Test void withoutTargetInfoMetric() throws IOException { PrometheusMetricReader reader = - PrometheusMetricReader.builder().setOtelTargetInfoMetricEnabled(false).build(); + PrometheusMetricReader.builder().setTargetInfoMetricEnabled(false).build(); addCounter(reader, Resource.getDefault().toBuilder()); String expected = "" @@ -1079,7 +1079,7 @@ void deprecatedConstructor() { // The 3-arg constructor should behave the same as the 2-arg deprecated constructor assertThat( new PrometheusMetricReader( - null, /* otelScopeLabelsEnabled= */ true, /* otelTargetInfoMetricEnabled */ true)) + null, /* otelScopeLabelsEnabled= */ true, /* targetInfoMetricEnabled */ true)) .usingRecursiveComparison() .isEqualTo(new PrometheusMetricReader(null)); } From b13b64d8c2d6a3b0bad3f6f112928b3f873d4cbd Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 5 Jan 2026 19:05:59 +0100 Subject: [PATCH 10/16] re-use PrometheusMetricReader --- .../prometheus/PrometheusHttpServer.java | 24 ++++--------------- .../PrometheusHttpServerBuilder.java | 22 +++++++---------- .../PrometheusMetricReaderBuilder.java | 21 ++++++++++++++-- .../prometheus/PrometheusHttpServerTest.java | 5 +++- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java index 8adbc6f38c9..2e236fa407b 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java @@ -31,7 +31,6 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.function.Predicate; import javax.annotation.Nullable; /** @@ -42,9 +41,7 @@ public final class PrometheusHttpServer implements MetricReader { private final String host; private final int port; - private final boolean otelScopeLabelsEnabled; - private final boolean targetInfoMetricEnabled; - @Nullable private final Predicate allowedResourceAttributesFilter; + private final PrometheusMetricReaderBuilder metricReaderBuilder; private final MemoryMode memoryMode; private final DefaultAggregationSelector defaultAggregationSelector; @@ -73,27 +70,18 @@ public static PrometheusHttpServerBuilder builder() { int port, @Nullable ExecutorService executor, PrometheusRegistry prometheusRegistry, - boolean otelScopeLabelsEnabled, - boolean targetInfoMetricEnabled, - @Nullable Predicate allowedResourceAttributesFilter, + PrometheusMetricReaderBuilder metricReaderBuilder, MemoryMode memoryMode, @Nullable HttpHandler defaultHandler, DefaultAggregationSelector defaultAggregationSelector, @Nullable Authenticator authenticator) { this.host = host; this.port = port; - this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; - this.targetInfoMetricEnabled = targetInfoMetricEnabled; - this.allowedResourceAttributesFilter = allowedResourceAttributesFilter; + this.metricReaderBuilder = metricReaderBuilder; this.memoryMode = memoryMode; this.defaultAggregationSelector = defaultAggregationSelector; this.builder = builder; - this.prometheusMetricReader = - PrometheusMetricReader.builder() - .setOtelScopeLabelsEnabled(otelScopeLabelsEnabled) - .setTargetInfoMetricEnabled(targetInfoMetricEnabled) - .setAllowedResourceAttributesFilter(allowedResourceAttributesFilter) - .build(); + this.prometheusMetricReader = metricReaderBuilder.build(); this.prometheusRegistry = prometheusRegistry; prometheusRegistry.register(prometheusMetricReader); // When memory mode is REUSABLE_DATA, concurrent reads lead to data corruption. To prevent this, @@ -178,9 +166,7 @@ public String toString() { StringJoiner joiner = new StringJoiner(",", "PrometheusHttpServer{", "}"); joiner.add("host=" + host); joiner.add("port=" + port); - joiner.add("otelScopeLabelsEnabled=" + otelScopeLabelsEnabled); - joiner.add("targetInfoMetricEnabled=" + targetInfoMetricEnabled); - joiner.add("allowedResourceAttributesFilter=" + allowedResourceAttributesFilter); + joiner.add("metricReader=" + metricReaderBuilder); joiner.add("memoryMode=" + memoryMode); joiner.add( "defaultAggregationSelector=" diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java index c05b0032214..6f2e871be19 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java @@ -31,9 +31,7 @@ public final class PrometheusHttpServerBuilder { private String host = DEFAULT_HOST; private int port = DEFAULT_PORT; private PrometheusRegistry prometheusRegistry = new PrometheusRegistry(); - private boolean otelScopeLabelsEnabled = true; - private boolean targetInfoMetricEnabled = true; - @Nullable private Predicate allowedResourceAttributesFilter; + private PrometheusMetricReaderBuilder metricReaderBuilder = PrometheusMetricReader.builder(); @Nullable private ExecutorService executor; private MemoryMode memoryMode = DEFAULT_MEMORY_MODE; @Nullable private HttpHandler defaultHandler; @@ -47,9 +45,7 @@ public final class PrometheusHttpServerBuilder { this.host = builder.host; this.port = builder.port; this.prometheusRegistry = builder.prometheusRegistry; - this.otelScopeLabelsEnabled = builder.otelScopeLabelsEnabled; - this.targetInfoMetricEnabled = builder.targetInfoMetricEnabled; - this.allowedResourceAttributesFilter = builder.allowedResourceAttributesFilter; + this.metricReaderBuilder = new PrometheusMetricReaderBuilder(builder.metricReaderBuilder); this.executor = builder.executor; this.memoryMode = builder.memoryMode; this.defaultAggregationSelector = builder.defaultAggregationSelector; @@ -92,15 +88,14 @@ public PrometheusHttpServerBuilder setPrometheusRegistry(PrometheusRegistry prom /** Set if the {@code otel_scope_*} attributes are generated. Default is {@code true}. */ @CanIgnoreReturnValue public PrometheusHttpServerBuilder setOtelScopeLabelsEnabled(boolean otelScopeLabelsEnabled) { - this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; + metricReaderBuilder.setOtelScopeLabelsEnabled(otelScopeLabelsEnabled); return this; } /** Set if the {@code otel_target_info} metric is generated. Default is {@code true}. */ @CanIgnoreReturnValue - public PrometheusHttpServerBuilder setTargetInfoMetricEnabled( - boolean targetInfoMetricEnabled) { - this.targetInfoMetricEnabled = targetInfoMetricEnabled; + public PrometheusHttpServerBuilder setTargetInfoMetricEnabled(boolean targetInfoMetricEnabled) { + metricReaderBuilder.setTargetInfoMetricEnabled(targetInfoMetricEnabled); return this; } @@ -117,7 +112,8 @@ public PrometheusHttpServerBuilder setTargetInfoMetricEnabled( @CanIgnoreReturnValue public PrometheusHttpServerBuilder setAllowedResourceAttributesFilter( Predicate resourceAttributesFilter) { - this.allowedResourceAttributesFilter = requireNonNull(resourceAttributesFilter); + metricReaderBuilder.setAllowedResourceAttributesFilter( + requireNonNull(resourceAttributesFilter, "resourceAttributesFilter")); return this; } @@ -195,9 +191,7 @@ public PrometheusHttpServer build() { port, executor, prometheusRegistry, - otelScopeLabelsEnabled, - targetInfoMetricEnabled, - allowedResourceAttributesFilter, + metricReaderBuilder, memoryMode, defaultHandler, defaultAggregationSelector, diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java index 7a54f9cd43e..de46cc9df22 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java @@ -18,6 +18,12 @@ public final class PrometheusMetricReaderBuilder { PrometheusMetricReaderBuilder() {} + PrometheusMetricReaderBuilder(PrometheusMetricReaderBuilder metricReaderBuilder) { + this.otelScopeLabelsEnabled = metricReaderBuilder.otelScopeLabelsEnabled; + this.targetInfoMetricEnabled = metricReaderBuilder.targetInfoMetricEnabled; + this.allowedResourceAttributesFilter = metricReaderBuilder.allowedResourceAttributesFilter; + } + /** * Sets whether to add OpenTelemetry scope labels (otel_scope_name, otel_scope_version, etc.) to * exported metrics. Default is {@code true}. @@ -39,8 +45,7 @@ public PrometheusMetricReaderBuilder setOtelScopeLabelsEnabled(boolean otelScope * @return this builder */ @CanIgnoreReturnValue - public PrometheusMetricReaderBuilder setTargetInfoMetricEnabled( - boolean targetInfoMetricEnabled) { + public PrometheusMetricReaderBuilder setTargetInfoMetricEnabled(boolean targetInfoMetricEnabled) { this.targetInfoMetricEnabled = targetInfoMetricEnabled; return this; } @@ -64,4 +69,16 @@ public PrometheusMetricReader build() { return new PrometheusMetricReader( allowedResourceAttributesFilter, otelScopeLabelsEnabled, targetInfoMetricEnabled); } + + @Override + public String toString() { + return "PrometheusMetricReaderBuilder{" + + "otelScopeLabelsEnabled=" + + otelScopeLabelsEnabled + + ", targetInfoMetricEnabled=" + + targetInfoMetricEnabled + + ", allowedResourceAttributesFilter=" + + allowedResourceAttributesFilter + + '}'; + } } diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java index 03287d9dde1..89060c8b3c3 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java @@ -574,7 +574,10 @@ public Result authenticate(HttpExchange exchange) { .isInstanceOf(PrometheusHttpServerBuilder.class) .hasFieldOrPropertyWithValue("host", "localhost") .hasFieldOrPropertyWithValue("port", 1234) - .hasFieldOrPropertyWithValue("allowedResourceAttributesFilter", resourceAttributesFilter) + .hasFieldOrPropertyWithValue( + "metricReaderBuilder", + PrometheusMetricReader.builder() + .setAllowedResourceAttributesFilter(resourceAttributesFilter)) .hasFieldOrPropertyWithValue("executor", executor) .hasFieldOrPropertyWithValue("prometheusRegistry", prometheusRegistry) .hasFieldOrPropertyWithValue("authenticator", authenticator); From 10d21a7ec4761466ca9d81150255fb965c2f1a38 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 6 Jan 2026 11:26:52 +0100 Subject: [PATCH 11/16] fix --- .../prometheus/PrometheusHttpServerTest.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java index 89060c8b3c3..8155520d15c 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java @@ -432,9 +432,7 @@ void stringRepresentation() { "PrometheusHttpServer{" + "host=localhost," + "port=0," - + "otelScopeLabelsEnabled=true," - + "targetInfoMetricEnabled=true," - + "allowedResourceAttributesFilter=null," + + "metricReader=PrometheusMetricReaderBuilder{otelScopeLabelsEnabled=true, targetInfoMetricEnabled=true, allowedResourceAttributesFilter=null}," + "memoryMode=REUSABLE_DATA," + "defaultAggregationSelector=DefaultAggregationSelector{COUNTER=default, UP_DOWN_COUNTER=default, HISTOGRAM=default, OBSERVABLE_COUNTER=default, OBSERVABLE_UP_DOWN_COUNTER=default, OBSERVABLE_GAUGE=default, GAUGE=default}" + "}"); @@ -574,13 +572,14 @@ public Result authenticate(HttpExchange exchange) { .isInstanceOf(PrometheusHttpServerBuilder.class) .hasFieldOrPropertyWithValue("host", "localhost") .hasFieldOrPropertyWithValue("port", 1234) - .hasFieldOrPropertyWithValue( - "metricReaderBuilder", - PrometheusMetricReader.builder() - .setAllowedResourceAttributesFilter(resourceAttributesFilter)) .hasFieldOrPropertyWithValue("executor", executor) .hasFieldOrPropertyWithValue("prometheusRegistry", prometheusRegistry) - .hasFieldOrPropertyWithValue("authenticator", authenticator); + .hasFieldOrPropertyWithValue("authenticator", authenticator) + .extracting("metricReaderBuilder") + .usingRecursiveComparison() + .isEqualTo( + PrometheusMetricReader.builder() + .setAllowedResourceAttributesFilter(resourceAttributesFilter)); } /** From 9cff6a4c3f9bc6a9a8150cbe9693bb87814ee2d6 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Tue, 6 Jan 2026 11:30:33 +0100 Subject: [PATCH 12/16] fix --- .../exporter/prometheus/PrometheusMetricReaderTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java index d641e7b60ea..ad4dd1398a5 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderTest.java @@ -57,7 +57,6 @@ class PrometheusMetricReaderTest { private Meter meter; private Tracer tracer; - @SuppressWarnings("resource") @BeforeEach void setUp() { this.testClock.setTime(Instant.ofEpochMilli((System.currentTimeMillis() / 100) * 100)); @@ -1045,7 +1044,6 @@ private void addCounter(PrometheusMetricReader reader, ResourceBuilder builder) counter.add(1); } - @SuppressWarnings("resource") @Test void addResourceAttributesWorks() throws IOException { PrometheusMetricReader reader = From c90bc2bef76e42c70e15294ca65f4c773df5fc42 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 7 Jan 2026 16:46:15 +0100 Subject: [PATCH 13/16] remove @CanIgnoreReturnValue --- .../prometheus/PrometheusHttpServerBuilder.java | 12 ------------ .../prometheus/PrometheusMetricReaderBuilder.java | 4 ---- 2 files changed, 16 deletions(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java index 6f2e871be19..a050f2cb0bc 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java @@ -8,7 +8,6 @@ import static io.opentelemetry.api.internal.Utils.checkArgument; import static java.util.Objects.requireNonNull; -import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.sun.net.httpserver.Authenticator; import com.sun.net.httpserver.HttpHandler; import io.opentelemetry.sdk.common.export.MemoryMode; @@ -53,7 +52,6 @@ public final class PrometheusHttpServerBuilder { } /** Sets the host to bind to. If unset, defaults to {@value #DEFAULT_HOST}. */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setHost(String host) { requireNonNull(host, "host"); checkArgument(!host.isEmpty(), "host must not be empty"); @@ -62,7 +60,6 @@ public PrometheusHttpServerBuilder setHost(String host) { } /** Sets the port to bind to. If unset, defaults to {@value #DEFAULT_PORT}. */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setPort(int port) { checkArgument(port >= 0, "port must be positive"); this.port = port; @@ -70,7 +67,6 @@ public PrometheusHttpServerBuilder setPort(int port) { } /** Sets the {@link ExecutorService} to be used for {@link PrometheusHttpServer}. */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setExecutor(ExecutorService executor) { requireNonNull(executor, "executor"); this.executor = executor; @@ -78,7 +74,6 @@ public PrometheusHttpServerBuilder setExecutor(ExecutorService executor) { } /** Sets the {@link PrometheusRegistry} to be used for {@link PrometheusHttpServer}. */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setPrometheusRegistry(PrometheusRegistry prometheusRegistry) { requireNonNull(prometheusRegistry, "prometheusRegistry"); this.prometheusRegistry = prometheusRegistry; @@ -86,14 +81,12 @@ public PrometheusHttpServerBuilder setPrometheusRegistry(PrometheusRegistry prom } /** Set if the {@code otel_scope_*} attributes are generated. Default is {@code true}. */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setOtelScopeLabelsEnabled(boolean otelScopeLabelsEnabled) { metricReaderBuilder.setOtelScopeLabelsEnabled(otelScopeLabelsEnabled); return this; } /** Set if the {@code otel_target_info} metric is generated. Default is {@code true}. */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setTargetInfoMetricEnabled(boolean targetInfoMetricEnabled) { metricReaderBuilder.setTargetInfoMetricEnabled(targetInfoMetricEnabled); return this; @@ -109,7 +102,6 @@ public PrometheusHttpServerBuilder setTargetInfoMetricEnabled(boolean targetInfo * be added as a label on each exported metric. The predicates input is the resource attribute * key. */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setAllowedResourceAttributesFilter( Predicate resourceAttributesFilter) { metricReaderBuilder.setAllowedResourceAttributesFilter( @@ -124,7 +116,6 @@ public PrometheusHttpServerBuilder setAllowedResourceAttributesFilter( * accomplished by overriding {@link #setExecutor(ExecutorService)} to {@link * Executors#newSingleThreadExecutor()}. */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setMemoryMode(MemoryMode memoryMode) { requireNonNull(memoryMode, "memoryMode"); this.memoryMode = memoryMode; @@ -142,7 +133,6 @@ public PrometheusHttpServerBuilder setMemoryMode(MemoryMode memoryMode) { * .build() * */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setDefaultHandler(HttpHandler defaultHandler) { requireNonNull(defaultHandler, "defaultHandler"); this.defaultHandler = defaultHandler; @@ -155,7 +145,6 @@ public PrometheusHttpServerBuilder setDefaultHandler(HttpHandler defaultHandler) * *

If unset, defaults to {@link DefaultAggregationSelector#getDefault()}. */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setDefaultAggregationSelector( DefaultAggregationSelector defaultAggregationSelector) { requireNonNull(defaultAggregationSelector, "defaultAggregationSelector"); @@ -168,7 +157,6 @@ public PrometheusHttpServerBuilder setDefaultAggregationSelector( * *

If unset, no authentication will be performed. */ - @CanIgnoreReturnValue public PrometheusHttpServerBuilder setAuthenticator(Authenticator authenticator) { requireNonNull(authenticator, "authenticator"); this.authenticator = authenticator; diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java index de46cc9df22..ffbcd337beb 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java @@ -5,7 +5,6 @@ package io.opentelemetry.exporter.prometheus; -import com.google.errorprone.annotations.CanIgnoreReturnValue; import java.util.function.Predicate; import javax.annotation.Nullable; @@ -31,7 +30,6 @@ public final class PrometheusMetricReaderBuilder { * @param otelScopeLabelsEnabled whether to add scope labels * @return this builder */ - @CanIgnoreReturnValue public PrometheusMetricReaderBuilder setOtelScopeLabelsEnabled(boolean otelScopeLabelsEnabled) { this.otelScopeLabelsEnabled = otelScopeLabelsEnabled; return this; @@ -44,7 +42,6 @@ public PrometheusMetricReaderBuilder setOtelScopeLabelsEnabled(boolean otelScope * @param targetInfoMetricEnabled whether to export target_info metric * @return this builder */ - @CanIgnoreReturnValue public PrometheusMetricReaderBuilder setTargetInfoMetricEnabled(boolean targetInfoMetricEnabled) { this.targetInfoMetricEnabled = targetInfoMetricEnabled; return this; @@ -57,7 +54,6 @@ public PrometheusMetricReaderBuilder setTargetInfoMetricEnabled(boolean targetIn * @param allowedResourceAttributesFilter predicate to filter resource attributes, or {@code null} * @return this builder */ - @CanIgnoreReturnValue public PrometheusMetricReaderBuilder setAllowedResourceAttributesFilter( @Nullable Predicate allowedResourceAttributesFilter) { this.allowedResourceAttributesFilter = allowedResourceAttributesFilter; From a4e8fdfcb91cceb5361d67e860d6078131da3850 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 7 Jan 2026 16:50:38 +0100 Subject: [PATCH 14/16] pr review --- .../exporter/prometheus/PrometheusHttpServerBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java index a050f2cb0bc..9735c5d7425 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java @@ -104,8 +104,8 @@ public PrometheusHttpServerBuilder setTargetInfoMetricEnabled(boolean targetInfo */ public PrometheusHttpServerBuilder setAllowedResourceAttributesFilter( Predicate resourceAttributesFilter) { - metricReaderBuilder.setAllowedResourceAttributesFilter( - requireNonNull(resourceAttributesFilter, "resourceAttributesFilter")); + requireNonNull(resourceAttributesFilter, "resourceAttributesFilter"); + metricReaderBuilder.setAllowedResourceAttributesFilter(resourceAttributesFilter); return this; } From e78dc7e9e2da4f4f99dcff1c27eef17d52635887 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Wed, 7 Jan 2026 17:03:03 +0100 Subject: [PATCH 15/16] pr review --- .../prometheus/Otel2PrometheusConverter.java | 13 +++++++++++++ .../exporter/prometheus/PrometheusHttpServer.java | 10 ++++------ .../prometheus/PrometheusHttpServerBuilder.java | 4 ++-- .../exporter/prometheus/PrometheusMetricReader.java | 10 ++++++++++ .../prometheus/PrometheusMetricReaderBuilder.java | 12 ------------ .../prometheus/PrometheusHttpServerTest.java | 2 +- 6 files changed, 30 insertions(+), 21 deletions(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java index b1aabeb2c2e..5fb32f4f291 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java @@ -112,6 +112,19 @@ final class Otel2PrometheusConverter { : Collections.emptyMap(); } + public boolean isOtelScopeLabelsEnabled() { + return otelScopeLabelsEnabled; + } + + public boolean isTargetInfoMetricEnabled() { + return targetInfoMetricEnabled; + } + + @Nullable + public Predicate getAllowedResourceAttributesFilter() { + return allowedResourceAttributesFilter; + } + MetricSnapshots convert(@Nullable Collection metricDataCollection) { if (metricDataCollection == null || metricDataCollection.isEmpty()) { return MetricSnapshots.of(); diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java index 2e236fa407b..f3dde0775b4 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServer.java @@ -41,7 +41,6 @@ public final class PrometheusHttpServer implements MetricReader { private final String host; private final int port; - private final PrometheusMetricReaderBuilder metricReaderBuilder; private final MemoryMode memoryMode; private final DefaultAggregationSelector defaultAggregationSelector; @@ -70,18 +69,17 @@ public static PrometheusHttpServerBuilder builder() { int port, @Nullable ExecutorService executor, PrometheusRegistry prometheusRegistry, - PrometheusMetricReaderBuilder metricReaderBuilder, MemoryMode memoryMode, @Nullable HttpHandler defaultHandler, DefaultAggregationSelector defaultAggregationSelector, - @Nullable Authenticator authenticator) { + @Nullable Authenticator authenticator, + PrometheusMetricReader prometheusMetricReader) { this.host = host; this.port = port; - this.metricReaderBuilder = metricReaderBuilder; this.memoryMode = memoryMode; this.defaultAggregationSelector = defaultAggregationSelector; this.builder = builder; - this.prometheusMetricReader = metricReaderBuilder.build(); + this.prometheusMetricReader = prometheusMetricReader; this.prometheusRegistry = prometheusRegistry; prometheusRegistry.register(prometheusMetricReader); // When memory mode is REUSABLE_DATA, concurrent reads lead to data corruption. To prevent this, @@ -166,7 +164,7 @@ public String toString() { StringJoiner joiner = new StringJoiner(",", "PrometheusHttpServer{", "}"); joiner.add("host=" + host); joiner.add("port=" + port); - joiner.add("metricReader=" + metricReaderBuilder); + joiner.add("metricReader=" + prometheusMetricReader.toString()); joiner.add("memoryMode=" + memoryMode); joiner.add( "defaultAggregationSelector=" diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java index 9735c5d7425..1b62011e42c 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerBuilder.java @@ -179,10 +179,10 @@ public PrometheusHttpServer build() { port, executor, prometheusRegistry, - metricReaderBuilder, memoryMode, defaultHandler, defaultAggregationSelector, - authenticator); + authenticator, + metricReaderBuilder.build()); } } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java index 58b53235975..821a7d37cb6 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReader.java @@ -12,6 +12,7 @@ import io.opentelemetry.sdk.metrics.export.MetricReader; import io.prometheus.metrics.model.registry.MultiCollector; import io.prometheus.metrics.model.snapshots.MetricSnapshots; +import java.util.StringJoiner; import java.util.function.Predicate; import javax.annotation.Nullable; @@ -102,4 +103,13 @@ public CompletableResultCode shutdown() { public MetricSnapshots collect() { return converter.convert(collectionRegistration.collectAllMetrics()); } + + @Override + public String toString() { + StringJoiner joiner = new StringJoiner(",", "PrometheusMetricReader{", "}"); + joiner.add("otelScopeLabelsEnabled=" + converter.isOtelScopeLabelsEnabled()); + joiner.add("targetInfoMetricEnabled=" + converter.isTargetInfoMetricEnabled()); + joiner.add("allowedResourceAttributesFilter=" + converter.getAllowedResourceAttributesFilter()); + return joiner.toString(); + } } diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java index ffbcd337beb..2d6101df416 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/PrometheusMetricReaderBuilder.java @@ -65,16 +65,4 @@ public PrometheusMetricReader build() { return new PrometheusMetricReader( allowedResourceAttributesFilter, otelScopeLabelsEnabled, targetInfoMetricEnabled); } - - @Override - public String toString() { - return "PrometheusMetricReaderBuilder{" - + "otelScopeLabelsEnabled=" - + otelScopeLabelsEnabled - + ", targetInfoMetricEnabled=" - + targetInfoMetricEnabled - + ", allowedResourceAttributesFilter=" - + allowedResourceAttributesFilter - + '}'; - } } diff --git a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java index 8155520d15c..16c39efc31b 100644 --- a/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java +++ b/exporters/prometheus/src/test/java/io/opentelemetry/exporter/prometheus/PrometheusHttpServerTest.java @@ -432,7 +432,7 @@ void stringRepresentation() { "PrometheusHttpServer{" + "host=localhost," + "port=0," - + "metricReader=PrometheusMetricReaderBuilder{otelScopeLabelsEnabled=true, targetInfoMetricEnabled=true, allowedResourceAttributesFilter=null}," + + "metricReader=PrometheusMetricReader{otelScopeLabelsEnabled=true,targetInfoMetricEnabled=true,allowedResourceAttributesFilter=null}," + "memoryMode=REUSABLE_DATA," + "defaultAggregationSelector=DefaultAggregationSelector{COUNTER=default, UP_DOWN_COUNTER=default, HISTOGRAM=default, OBSERVABLE_COUNTER=default, OBSERVABLE_UP_DOWN_COUNTER=default, OBSERVABLE_GAUGE=default, GAUGE=default}" + "}"); From 20309443695671383c9a04e8985dedf3ecab9f69 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Thu, 8 Jan 2026 13:45:27 -0600 Subject: [PATCH 16/16] make getter package private --- .../exporter/prometheus/Otel2PrometheusConverter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java index 5fb32f4f291..5209f91e47b 100644 --- a/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java +++ b/exporters/prometheus/src/main/java/io/opentelemetry/exporter/prometheus/Otel2PrometheusConverter.java @@ -112,16 +112,16 @@ final class Otel2PrometheusConverter { : Collections.emptyMap(); } - public boolean isOtelScopeLabelsEnabled() { + boolean isOtelScopeLabelsEnabled() { return otelScopeLabelsEnabled; } - public boolean isTargetInfoMetricEnabled() { + boolean isTargetInfoMetricEnabled() { return targetInfoMetricEnabled; } @Nullable - public Predicate getAllowedResourceAttributesFilter() { + Predicate getAllowedResourceAttributesFilter() { return allowedResourceAttributesFilter; }