From 0bd9eaa28d40177f16bc9e47d16646093574eff9 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Sun, 31 May 2026 21:02:12 +0300 Subject: [PATCH 1/2] [improve][build] Upgrade OpenTelemetry to latest (java 1.62.0, instrumentation 2.28.1, semconv 1.41.1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Motivation Keep the OpenTelemetry dependencies current and consistent. PR #25779 bumped the stable `opentelemetry` BOM from 1.61.0 to 1.62.0 but did not update the `opentelemetry-alpha` version ref, leaving it at 1.61.0-alpha — a mismatch between the stable and alpha BOMs. This change aligns the alpha version number with the stable release and upgrades the remaining OpenTelemetry components to their latest releases. ### Modifications - `opentelemetry-alpha`: 1.61.0-alpha -> 1.62.0-alpha (aligns with the stable `opentelemetry` 1.62.0 that PR #25779 left it behind on) - `opentelemetry-instrumentation`: 2.27.0 -> 2.28.1 (and the matching `-alpha`) - `opentelemetry-semconv`: 1.41.0 -> 1.41.1 - `opentelemetry-gcp-resources`: 1.48.0-alpha -> 1.57.0-alpha - Updated the bundled-jar versions in the `distribution/server` and `distribution/shell` `LICENSE.bin.txt` files to match the upgraded artifacts. Assisted-by: Claude Code (Opus 4.8) --- distribution/server/src/assemble/LICENSE.bin.txt | 16 ++++++++-------- distribution/shell/src/assemble/LICENSE.bin.txt | 2 +- gradle/libs.versions.toml | 10 +++++----- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/distribution/server/src/assemble/LICENSE.bin.txt b/distribution/server/src/assemble/LICENSE.bin.txt index 5cb6438d7c810..05e9050e2e0c9 100644 --- a/distribution/server/src/assemble/LICENSE.bin.txt +++ b/distribution/server/src/assemble/LICENSE.bin.txt @@ -528,13 +528,13 @@ The Apache Software License, Version 2.0 - org.roaringbitmap-RoaringBitmap-1.6.9.jar * OpenTelemetry - io.opentelemetry-opentelemetry-api-1.62.0.jar - - io.opentelemetry-opentelemetry-api-incubator-1.61.0-alpha.jar + - io.opentelemetry-opentelemetry-api-incubator-1.62.0-alpha.jar - io.opentelemetry-opentelemetry-common-1.62.0.jar - io.opentelemetry-opentelemetry-context-1.62.0.jar - io.opentelemetry-opentelemetry-exporter-common-1.62.0.jar - io.opentelemetry-opentelemetry-exporter-otlp-1.62.0.jar - io.opentelemetry-opentelemetry-exporter-otlp-common-1.62.0.jar - - io.opentelemetry-opentelemetry-exporter-prometheus-1.61.0-alpha.jar + - io.opentelemetry-opentelemetry-exporter-prometheus-1.62.0-alpha.jar - io.opentelemetry-opentelemetry-exporter-sender-okhttp-1.62.0.jar - io.opentelemetry-opentelemetry-sdk-1.62.0.jar - io.opentelemetry-opentelemetry-sdk-common-1.62.0.jar @@ -543,13 +543,13 @@ The Apache Software License, Version 2.0 - io.opentelemetry-opentelemetry-sdk-logs-1.62.0.jar - io.opentelemetry-opentelemetry-sdk-metrics-1.62.0.jar - io.opentelemetry-opentelemetry-sdk-trace-1.62.0.jar - - io.opentelemetry.instrumentation-opentelemetry-instrumentation-api-2.27.0.jar - - io.opentelemetry.instrumentation-opentelemetry-instrumentation-api-incubator-2.27.0-alpha.jar - - io.opentelemetry.instrumentation-opentelemetry-resources-2.27.0-alpha.jar - - io.opentelemetry.instrumentation-opentelemetry-runtime-telemetry-2.27.0-alpha.jar - - io.opentelemetry.semconv-opentelemetry-semconv-1.41.0.jar + - io.opentelemetry.instrumentation-opentelemetry-instrumentation-api-2.28.1.jar + - io.opentelemetry.instrumentation-opentelemetry-instrumentation-api-incubator-2.28.1-alpha.jar + - io.opentelemetry.instrumentation-opentelemetry-resources-2.28.1-alpha.jar + - io.opentelemetry.instrumentation-opentelemetry-runtime-telemetry-2.28.1-alpha.jar + - io.opentelemetry.semconv-opentelemetry-semconv-1.41.1.jar - com.google.cloud.opentelemetry-detector-resources-support-0.36.0.jar - - io.opentelemetry.contrib-opentelemetry-gcp-resources-1.48.0-alpha.jar + - io.opentelemetry.contrib-opentelemetry-gcp-resources-1.57.0-alpha.jar * Spotify completable-futures - com.spotify-completable-futures-0.3.6.jar * JSpecify diff --git a/distribution/shell/src/assemble/LICENSE.bin.txt b/distribution/shell/src/assemble/LICENSE.bin.txt index a56e6b5f20c6a..3491eec8f8b5c 100644 --- a/distribution/shell/src/assemble/LICENSE.bin.txt +++ b/distribution/shell/src/assemble/LICENSE.bin.txt @@ -388,7 +388,7 @@ The Apache Software License, Version 2.0 - log4j-web-2.25.4.jar * OpenTelemetry - opentelemetry-api-1.62.0.jar - - opentelemetry-api-incubator-1.61.0-alpha.jar + - opentelemetry-api-incubator-1.62.0-alpha.jar - opentelemetry-common-1.62.0.jar - opentelemetry-context-1.62.0.jar * Slog diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 53bb048331037..7e3454332e623 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,10 +39,10 @@ log4j2 = "2.25.4" lombok = "1.18.42" # OpenTelemetry opentelemetry = "1.62.0" -opentelemetry-alpha = "1.61.0-alpha" -opentelemetry-instrumentation = "2.27.0" -opentelemetry-instrumentation-alpha = "2.27.0-alpha" -opentelemetry-semconv = "1.41.0" +opentelemetry-alpha = "1.62.0-alpha" +opentelemetry-instrumentation = "2.28.1" +opentelemetry-instrumentation-alpha = "2.28.1-alpha" +opentelemetry-semconv = "1.41.1" # Apache Commons commons-lang3 = "3.20.0" commons-io = "2.21.0" @@ -79,7 +79,7 @@ google-auth = "1.24.1" google-http-client = "1.41.0" j2objc-annotations = "1.3" opencensus = "0.28.0" -opentelemetry-gcp-resources = "1.48.0-alpha" +opentelemetry-gcp-resources = "1.57.0-alpha" # Data structures / Utils guava = "33.4.8-jre" caffeine = "3.2.4" From 0852ee8d9f8ea09ea7ffe9d1bf6f9f3dbba00a91 Mon Sep 17 00:00:00 2001 From: Lari Hotari Date: Mon, 1 Jun 2026 09:47:33 +0300 Subject: [PATCH 2/2] [fix][build] Preserve 0.0.0.0 default host for OpenTelemetry Prometheus exporter OpenTelemetry 1.62.0 contains a breaking change: the Prometheus exporter's default server host changed from `0.0.0.0` to `localhost`. Pulsar configures the Prometheus exporter purely through OpenTelemetry autoconfiguration and never set the host explicitly, so after upgrading the exporter it would bind to `localhost` only, making the metrics endpoint unreachable from outside the local host (e.g. another container or a remote Prometheus scraper). This surfaced as a failure of OpenTelemetrySanityTest.testOpenTelemetryMetricsPrometheusExport (Connection reset when scraping the exporter across the container boundary). Restore the previous behavior by supplying `otel.exporter.prometheus.host` with a default value of `0.0.0.0` through the SDK builder's properties supplier. As a default it is still overridden by an explicit OTEL_EXPORTER_PROMETHEUS_HOST environment variable / otel.exporter.prometheus.host system property, mirroring the existing `otel.sdk.disabled` default handling. Added OpenTelemetryServiceTest.testPrometheusExporterDefaultsToAllInterfacesHost; the existing Prometheus test connects via localhost and therefore could not catch the regression. Assisted-by: Claude Code (Opus 4.8) --- .../opentelemetry/OpenTelemetryService.java | 9 +++++++- .../OpenTelemetryServiceTest.java | 21 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/pulsar-opentelemetry/src/main/java/org/apache/pulsar/opentelemetry/OpenTelemetryService.java b/pulsar-opentelemetry/src/main/java/org/apache/pulsar/opentelemetry/OpenTelemetryService.java index 9dcc4cd02e2ad..abe9266f5d30a 100644 --- a/pulsar-opentelemetry/src/main/java/org/apache/pulsar/opentelemetry/OpenTelemetryService.java +++ b/pulsar-opentelemetry/src/main/java/org/apache/pulsar/opentelemetry/OpenTelemetryService.java @@ -47,6 +47,7 @@ public class OpenTelemetryService implements Closeable { public static final String OTEL_SDK_DISABLED_KEY = "otel.sdk.disabled"; + static final String OTEL_EXPORTER_PROMETHEUS_HOST_KEY = "otel.exporter.prometheus.host"; static final int MAX_CARDINALITY_LIMIT = 10000; private final AtomicReference openTelemetrySdkReference = new AtomicReference<>(); @@ -79,7 +80,13 @@ public OpenTelemetryService(String clusterName, // Cardinality limit includes the overflow attribute set, so we need to add 1. "otel.java.metrics.cardinality.limit", Integer.toString(MAX_CARDINALITY_LIMIT + 1), // Reduce number of allocations by using reusable data mode. - "otel.java.exporter.memory_mode", MemoryMode.REUSABLE_DATA.name() + "otel.java.exporter.memory_mode", MemoryMode.REUSABLE_DATA.name(), + // Preserve the pre-OpenTelemetry-1.62.0 behavior of binding the Prometheus exporter's HTTP server + // to all interfaces. OpenTelemetry 1.62.0 changed the default host from "0.0.0.0" to "localhost", + // which makes the metrics endpoint unreachable from outside the host (e.g. another container or a + // remote Prometheus scraper). Supplied as a default, so it is still overridden by an explicit + // OTEL_EXPORTER_PROMETHEUS_HOST environment variable / otel.exporter.prometheus.host system property. + OTEL_EXPORTER_PROMETHEUS_HOST_KEY, "0.0.0.0" )); sdkBuilder.addResourceCustomizer( diff --git a/pulsar-opentelemetry/src/test/java/org/apache/pulsar/opentelemetry/OpenTelemetryServiceTest.java b/pulsar-opentelemetry/src/test/java/org/apache/pulsar/opentelemetry/OpenTelemetryServiceTest.java index fbf819aed7803..efb6bdecccb98 100644 --- a/pulsar-opentelemetry/src/test/java/org/apache/pulsar/opentelemetry/OpenTelemetryServiceTest.java +++ b/pulsar-opentelemetry/src/test/java/org/apache/pulsar/opentelemetry/OpenTelemetryServiceTest.java @@ -33,6 +33,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import lombok.Cleanup; import org.apache.commons.lang3.StringUtils; @@ -153,6 +154,26 @@ public void testMetricCardinalityIsSet() { }); } + @Test + public void testPrometheusExporterDefaultsToAllInterfacesHost() { + // OpenTelemetry 1.62.0 changed the Prometheus exporter's default server host from "0.0.0.0" to "localhost". + // Pulsar restores the previous "0.0.0.0" default so the metrics endpoint stays reachable from outside the + // local host (e.g. another container or a remote Prometheus scraper). The default must remain overridable + // via the standard OTEL_EXPORTER_PROMETHEUS_HOST / otel.exporter.prometheus.host configuration. + var capturedHost = new AtomicReference(); + @Cleanup + var ots = OpenTelemetryService.builder() + .builderCustomizer(getBuilderCustomizer(null, + Map.of(OpenTelemetryService.OTEL_SDK_DISABLED_KEY, "false")) + .andThen(builder -> builder.addPropertiesCustomizer(config -> { + capturedHost.set(config.getString(OpenTelemetryService.OTEL_EXPORTER_PROMETHEUS_HOST_KEY)); + return Map.of(); + }))) + .clusterName("openTelemetryServicePrometheusHostTestCluster") + .build(); + assertThat(capturedHost.get()).isEqualTo("0.0.0.0"); + } + @Test public void testLongCounter() { var longCounter = meter.counterBuilder("dummyLongCounter").build();