From 84d83bb121205a07fe47cf58166aa0a45096f9cb Mon Sep 17 00:00:00 2001 From: Hugo Cura Date: Wed, 11 Mar 2026 08:04:54 +0000 Subject: [PATCH 1/3] create metrics with actual server port --- .../io/vertx/core/net/impl/NetServerImpl.java | 6 +- .../fakemetrics/FakeHttpServerMetrics.java | 9 +++ .../test/fakemetrics/FakeVertxMetrics.java | 2 +- .../vertx/tests/metrics/MetricsPortTest.java | 57 +++++++++++++++++++ 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java diff --git a/vertx-core/src/main/java/io/vertx/core/net/impl/NetServerImpl.java b/vertx-core/src/main/java/io/vertx/core/net/impl/NetServerImpl.java index e4f10b4b84e..8461abbba4b 100644 --- a/vertx-core/src/main/java/io/vertx/core/net/impl/NetServerImpl.java +++ b/vertx-core/src/main/java/io/vertx/core/net/impl/NetServerImpl.java @@ -555,11 +555,13 @@ private void bind( } }); } - // Update port to actual port when it is not a domain socket as wildcard port 0 might have been used + // Update port and address to actual values when it is not a domain socket as wildcard port 0 might have been used + var actualLocalAddress = localAddress; if (bindAddress.isInetSocket()) { actualPort = ((InetSocketAddress)ch.localAddress()).getPort(); + actualLocalAddress = SocketAddress.inetSocketAddress(actualPort, localAddress.host()); } - metrics = createMetrics(localAddress); + metrics = createMetrics(actualLocalAddress); promise.complete(ch); } else { promise.fail(res.cause()); diff --git a/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java b/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java index dc9e19e9375..6511efb57d5 100644 --- a/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java +++ b/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java @@ -31,6 +31,11 @@ public class FakeHttpServerMetrics extends FakeTCPMetrics implements HttpServerM private final ConcurrentMap webSockets = new ConcurrentHashMap<>(); private final Set requests = ConcurrentHashMap.newKeySet(); + private final SocketAddress socketAddress; + + public FakeHttpServerMetrics(SocketAddress socketAddress) { + this.socketAddress = socketAddress; + } public WebSocketMetric getWebSocketMetric(ServerWebSocket ws) { return webSockets.get(ws.path()); @@ -44,6 +49,10 @@ public HttpServerMetric getResponseMetric(String uri) { return requests.stream().filter(m -> m.uri.equals(uri)).findFirst().orElse(null); } + public SocketAddress getSocketAddress() { + return socketAddress; + } + @Override public HttpServerMetric requestBegin(SocketMetric socketMetric, HttpRequest request) { HttpServerMetric metric = new HttpServerMetric(request, socketMetric); diff --git a/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeVertxMetrics.java b/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeVertxMetrics.java index 802d15d5245..94e1733ab36 100644 --- a/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeVertxMetrics.java +++ b/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeVertxMetrics.java @@ -55,7 +55,7 @@ public EventBusMetrics createEventBusMetrics() { } public HttpServerMetrics createHttpServerMetrics(HttpServerOptions options, SocketAddress localAddress) { - return new FakeHttpServerMetrics(); + return new FakeHttpServerMetrics(localAddress); } public HttpClientMetrics createHttpClientMetrics(HttpClientOptions options) { diff --git a/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java b/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java new file mode 100644 index 00000000000..8e80b6bba4e --- /dev/null +++ b/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java @@ -0,0 +1,57 @@ +package io.vertx.tests.metrics; + +import io.vertx.core.Vertx; +import io.vertx.core.VertxOptions; +import io.vertx.core.http.HttpClientRequest; +import io.vertx.core.http.HttpServerOptions; +import io.vertx.core.http.RequestOptions; +import io.vertx.core.metrics.MetricsOptions; +import io.vertx.test.core.TestUtils; +import io.vertx.test.fakemetrics.FakeHttpServerMetrics; +import io.vertx.test.fakemetrics.FakeMetricsBase; +import io.vertx.test.fakemetrics.FakeMetricsFactory; +import io.vertx.test.http.HttpTestBase; +import org.junit.Test; + +public class MetricsPortTest extends HttpTestBase { + + @Override + protected HttpServerOptions createBaseServerOptions() { + return new HttpServerOptions().setPort(0).setHost(DEFAULT_HTTP_HOST); + } + + @Override + protected VertxOptions getOptions() { + VertxOptions options = super.getOptions(); + options.setMetricsOptions(new MetricsOptions().setEnabled(true)); + return options; + } + + @Override + protected Vertx createVertx(VertxOptions options) { + return Vertx.builder().with(options) + .withMetrics(new FakeMetricsFactory()) + .build(); + } + + @Test + public void actualPortInMetricsWhenDynamicPortIsUsed() throws Exception { + server.requestHandler(req -> { + FakeHttpServerMetrics metrics = FakeMetricsBase.getMetrics(server); + + assertEquals(server.actualPort(), metrics.getSocketAddress().port()); + + req.response().end(); + testComplete(); + }); + + startServer(); + + var requestOptions = new RequestOptions() + .setPort(server.actualPort()); + + client.request(new RequestOptions(requestOptions).setURI(TestUtils.randomAlphaString(16))).onComplete(onSuccess(HttpClientRequest::send)); + await(); + } + +} From 26224ae6722b38813c3c6a9834334ccd92e5ea74 Mon Sep 17 00:00:00 2001 From: Hugo Cura Date: Tue, 17 Mar 2026 07:18:47 +0000 Subject: [PATCH 2/3] renamed field --- .../vertx/test/fakemetrics/FakeHttpServerMetrics.java | 11 +++++------ .../java/io/vertx/tests/metrics/MetricsPortTest.java | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java b/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java index 6511efb57d5..66a47900de7 100644 --- a/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java +++ b/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java @@ -14,7 +14,6 @@ import io.vertx.core.http.HttpMethod; import io.vertx.core.http.HttpServerRequest; import io.vertx.core.http.ServerWebSocket; -import io.vertx.core.http.WebSocketBase; import io.vertx.core.net.SocketAddress; import io.vertx.core.spi.metrics.HttpServerMetrics; import io.vertx.core.spi.observability.HttpRequest; @@ -31,10 +30,10 @@ public class FakeHttpServerMetrics extends FakeTCPMetrics implements HttpServerM private final ConcurrentMap webSockets = new ConcurrentHashMap<>(); private final Set requests = ConcurrentHashMap.newKeySet(); - private final SocketAddress socketAddress; + private final SocketAddress serverAddress; - public FakeHttpServerMetrics(SocketAddress socketAddress) { - this.socketAddress = socketAddress; + public FakeHttpServerMetrics(SocketAddress serverAddress) { + this.serverAddress = serverAddress; } public WebSocketMetric getWebSocketMetric(ServerWebSocket ws) { @@ -49,8 +48,8 @@ public HttpServerMetric getResponseMetric(String uri) { return requests.stream().filter(m -> m.uri.equals(uri)).findFirst().orElse(null); } - public SocketAddress getSocketAddress() { - return socketAddress; + public SocketAddress getServerAddress() { + return serverAddress; } @Override diff --git a/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java b/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java index 8e80b6bba4e..2faf17eafde 100644 --- a/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java +++ b/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java @@ -39,7 +39,7 @@ public void actualPortInMetricsWhenDynamicPortIsUsed() throws Exception { server.requestHandler(req -> { FakeHttpServerMetrics metrics = FakeMetricsBase.getMetrics(server); - assertEquals(server.actualPort(), metrics.getSocketAddress().port()); + assertEquals(server.actualPort(), metrics.getServerAddress().port()); req.response().end(); testComplete(); From f95c7826349de5109a2e744312fc2201d530d572 Mon Sep 17 00:00:00 2001 From: Hugo Cura Date: Wed, 18 Mar 2026 10:29:17 +0000 Subject: [PATCH 3/3] pr comments --- .../vertx/test/fakemetrics/FakeHttpServerMetrics.java | 10 +++++----- .../java/io/vertx/tests/metrics/MetricsPortTest.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java b/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java index 66a47900de7..684065d8aa2 100644 --- a/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java +++ b/vertx-core/src/test/java/io/vertx/test/fakemetrics/FakeHttpServerMetrics.java @@ -30,10 +30,10 @@ public class FakeHttpServerMetrics extends FakeTCPMetrics implements HttpServerM private final ConcurrentMap webSockets = new ConcurrentHashMap<>(); private final Set requests = ConcurrentHashMap.newKeySet(); - private final SocketAddress serverAddress; + private final SocketAddress socketAddress; - public FakeHttpServerMetrics(SocketAddress serverAddress) { - this.serverAddress = serverAddress; + public FakeHttpServerMetrics(SocketAddress socketAddress) { + this.socketAddress = socketAddress; } public WebSocketMetric getWebSocketMetric(ServerWebSocket ws) { @@ -48,8 +48,8 @@ public HttpServerMetric getResponseMetric(String uri) { return requests.stream().filter(m -> m.uri.equals(uri)).findFirst().orElse(null); } - public SocketAddress getServerAddress() { - return serverAddress; + public SocketAddress socketAddress() { + return socketAddress; } @Override diff --git a/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java b/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java index 2faf17eafde..9d4adc76746 100644 --- a/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java +++ b/vertx-core/src/test/java/io/vertx/tests/metrics/MetricsPortTest.java @@ -39,7 +39,7 @@ public void actualPortInMetricsWhenDynamicPortIsUsed() throws Exception { server.requestHandler(req -> { FakeHttpServerMetrics metrics = FakeMetricsBase.getMetrics(server); - assertEquals(server.actualPort(), metrics.getServerAddress().port()); + assertEquals(server.actualPort(), metrics.socketAddress().port()); req.response().end(); testComplete();