Skip to content

Commit 2e1eff3

Browse files
committed
Propagate correctly the HTTP connection metric to the WebSocket connection metric during the server upgrade.
Motivation: During a server WebSocket upgrade, the HTTP connection metric is not correctly set to the WebSocket connection metric. This leads to calling the metric implementation with a null instance of the metric instead of the the instance it was provided. Changes: During the server WebSocket upgrade set the HTTP connection metric onto the WebSocket connection metric.
1 parent 3090061 commit 2e1eff3

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

vertx-core/src/main/java/io/vertx/core/http/impl/ServerWebSocketHandshaker.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ private ServerWebSocket acceptHandshake() {
177177
long closingTimeoutMS = options.getWebSocketClosingTimeout() >= 0 ? options.getWebSocketClosingTimeout() * 1000L : 0L;
178178
WebSocketConnectionImpl webSocketConn = new WebSocketConnectionImpl(request.context, ctx, true, closingTimeoutMS,httpConn.metrics);
179179
ServerWebSocketImpl webSocket = new ServerWebSocketImpl(
180-
(ContextInternal) request.context(),
180+
request.context(),
181181
webSocketConn,
182182
handshaker.version() != WebSocketVersion.V00,
183183
request,
@@ -187,7 +187,7 @@ private ServerWebSocket acceptHandshake() {
187187
String subprotocol = handshaker.selectedSubprotocol();
188188
webSocket.subProtocol(subprotocol);
189189
webSocketConn.webSocket(webSocket);
190-
webSocketConn.metric(webSocketConn.metric());
190+
webSocketConn.metric(httpConn.metric());
191191
return webSocketConn;
192192
});
193193
CompletableFuture<Void> latch = new CompletableFuture<>();

vertx-core/src/test/java/io/vertx/tests/metrics/MetricsTest.java

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import java.util.concurrent.TimeUnit;
4545
import java.util.concurrent.atomic.AtomicBoolean;
4646
import java.util.concurrent.atomic.AtomicInteger;
47+
import java.util.concurrent.atomic.AtomicLong;
4748
import java.util.concurrent.atomic.AtomicReference;
4849
import java.util.function.BiConsumer;
4950
import java.util.function.Consumer;
@@ -564,11 +565,17 @@ public void testServerWebSocket() throws InterruptedException {
564565
server.webSocketHandler(ws -> {
565566
wsRef.set(ws);
566567
FakeHttpServerMetrics metrics = FakeMetricsBase.getMetrics(server);
567-
WebSocketMetric metric = metrics.getWebSocketMetric(ws);
568-
assertNotNull(metric);
568+
WebSocketMetric webSocketMetric = metrics.getWebSocketMetric(ws);
569+
SocketMetric socketMetric = metrics.firstMetric(ws.remoteAddress());
570+
long bytesWritten = socketMetric.bytesRead.get();
571+
long bytesRead = socketMetric.bytesRead.get();
572+
assertNotNull(webSocketMetric);
569573
ws.handler(ws::write);
570574
ws.closeHandler(closed -> {
571-
latch.countDown();
575+
vertx.runOnContext(v -> {
576+
assertTrue(socketMetric.bytesRead.get() > bytesRead || socketMetric.bytesWritten.get() > bytesWritten);
577+
latch.countDown();
578+
});
572579
});
573580
});
574581
awaitFuture(server.listen(HttpTestBase.DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST));
@@ -589,15 +596,23 @@ public void testServerWebSocketUpgrade() throws InterruptedException {
589596
server.requestHandler(req -> {
590597
FakeHttpServerMetrics metrics = FakeMetricsBase.getMetrics(server);
591598
assertNotNull(metrics.getRequestMetric(req));
592-
req.toWebSocket().onComplete(onSuccess(ws -> {
593-
assertNull(metrics.getRequestMetric(req));
594-
WebSocketMetric metric = metrics.getWebSocketMetric(ws);
595-
assertNotNull(metric);
596-
ws.handler(ws::write);
597-
ws.closeHandler(closed -> {
598-
ref.set(ws);
599-
});
600-
}));
599+
req
600+
.toWebSocket()
601+
.onComplete(onSuccess(ws -> {
602+
assertNull(metrics.getRequestMetric(req));
603+
WebSocketMetric wsMetric = metrics.getWebSocketMetric(ws);
604+
SocketMetric socketMetric = metrics.firstMetric(ws.remoteAddress());
605+
long bytesWritten = socketMetric.bytesRead.get();
606+
long bytesRead = socketMetric.bytesRead.get();
607+
assertNotNull(wsMetric);
608+
ws.handler(ws::write);
609+
ws.closeHandler(closed -> {
610+
vertx.runOnContext(v -> {
611+
assertTrue(socketMetric.bytesRead.get() > bytesRead || socketMetric.bytesWritten.get() > bytesWritten);
612+
ref.set(ws);
613+
});
614+
});
615+
}));
601616
});
602617
awaitFuture(server.listen(HttpTestBase.DEFAULT_HTTP_PORT, HttpTestBase.DEFAULT_HTTP_HOST));
603618
wsClient = vertx.createWebSocketClient();

0 commit comments

Comments
 (0)