You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2021/05/12 03:07:52 UTC

[servicecomb-java-chassis] branch master updated: [SCB-2268]metrics add requests and latency for endpoint (#2374)

This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new a937dc7  [SCB-2268]metrics add requests and latency for endpoint (#2374)
a937dc7 is described below

commit a937dc78ce8fb1d0a677a95ddb793bb8c6762ec8
Author: bao liu <bi...@qq.com>
AuthorDate: Wed May 12 11:07:41 2021 +0800

    [SCB-2268]metrics add requests and latency for endpoint (#2374)
---
 .../vertx/metrics/DefaultHttpClientMetrics.java    |  1 +
 .../vertx/metrics/DefaultHttpServerMetrics.java    | 17 +++++------
 .../metrics/metric/DefaultEndpointMetric.java      | 20 +++++++++++++
 .../metrics/metric/DefaultHttpSocketMetric.java    |  5 ++++
 .../metrics/TestDefaultHttpClientMetrics.java      | 18 ------------
 .../metrics/TestDefaultHttpServerMetrics.java      | 15 ----------
 .../loadbalance/LoadbalanceHandler.java            |  1 +
 .../loadbalance/SessionStickinessRule.java         |  4 +--
 .../metrics/core/meter/vertx/EndpointMeter.java    | 26 ++++++++++++++++-
 .../core/publish/ClientEndpointsLogPublisher.java  | 14 +++++++--
 .../core/publish/ServerEndpointsLogPublisher.java  | 14 +++++++--
 .../metrics/core/TestVertxMetersInitializer.java   | 33 ++++++++++++++++------
 12 files changed, 110 insertions(+), 58 deletions(-)

diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpClientMetrics.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpClientMetrics.java
index 0e0dc12..0ed3e9e 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpClientMetrics.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpClientMetrics.java
@@ -98,6 +98,7 @@ public class DefaultHttpClientMetrics implements
 
   @Override
   public void responseEnd(DefaultHttpSocketMetric requestMetric, HttpClientResponse response) {
+    requestMetric.responseEnd();
   }
 
   @Override
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpServerMetrics.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpServerMetrics.java
index 259db3b..d6bcb33 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpServerMetrics.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/DefaultHttpServerMetrics.java
@@ -29,7 +29,7 @@ import io.vertx.core.spi.metrics.HttpServerMetrics;
 /**
  * important: not singleton, every HttpServer instance relate to an HttpServerMetrics instance
  */
-public class DefaultHttpServerMetrics implements HttpServerMetrics<Object, Object, DefaultHttpSocketMetric> {
+public class DefaultHttpServerMetrics implements HttpServerMetrics<DefaultHttpSocketMetric, Object, DefaultHttpSocketMetric> {
   private final DefaultServerEndpointMetric endpointMetric;
 
   public DefaultHttpServerMetrics(DefaultServerEndpointMetric endpointMetric) {
@@ -41,28 +41,29 @@ public class DefaultHttpServerMetrics implements HttpServerMetrics<Object, Objec
   }
 
   @Override
-  public Object requestBegin(DefaultHttpSocketMetric socketMetric, HttpServerRequest request) {
-    return null;
+  public DefaultHttpSocketMetric requestBegin(DefaultHttpSocketMetric socketMetric, HttpServerRequest request) {
+    socketMetric.requestBegin();
+    return socketMetric;
   }
 
   @Override
-  public void requestReset(Object requestMetric) {
+  public void requestReset(DefaultHttpSocketMetric requestMetric) {
 
   }
 
   @Override
-  public Object responsePushed(DefaultHttpSocketMetric socketMetric, HttpMethod method, String uri,
+  public DefaultHttpSocketMetric responsePushed(DefaultHttpSocketMetric socketMetric, HttpMethod method, String uri,
       HttpServerResponse response) {
     return null;
   }
 
   @Override
-  public void responseEnd(Object requestMetric, HttpServerResponse response) {
-
+  public void responseEnd(DefaultHttpSocketMetric requestMetric, HttpServerResponse response) {
+    requestMetric.responseEnd();
   }
 
   @Override
-  public Object connected(DefaultHttpSocketMetric socketMetric, Object requestMetric, ServerWebSocket serverWebSocket) {
+  public Object connected(DefaultHttpSocketMetric socketMetric, DefaultHttpSocketMetric requestMetric, ServerWebSocket serverWebSocket) {
     return null;
   }
 
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultEndpointMetric.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultEndpointMetric.java
index 9a475fc..e30ed96 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultEndpointMetric.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultEndpointMetric.java
@@ -36,6 +36,10 @@ public class DefaultEndpointMetric {
 
   private LongAdder bytesWritten = new LongAdder();
 
+  private LongAdder requests = new LongAdder();
+
+  private LongAdder latency = new LongAdder();
+
   public DefaultEndpointMetric(String address) {
     this.address = address;
   }
@@ -79,4 +83,20 @@ public class DefaultEndpointMetric {
   public void addBytesWritten(long bytes) {
     bytesWritten.add(bytes);
   }
+
+  public void incrementRequests() {
+    requests.increment();
+  }
+
+  public long getRequests() {
+    return requests.longValue();
+  }
+
+  public void addLatency(long delta) {
+    latency.add(delta);
+  }
+
+  public long getLatency() {
+    return latency.longValue();
+  }
 }
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultHttpSocketMetric.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultHttpSocketMetric.java
index dfc5a5f..b91be92 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultHttpSocketMetric.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultHttpSocketMetric.java
@@ -45,4 +45,9 @@ public class DefaultHttpSocketMetric extends DefaultTcpSocketMetric {
   public void requestEnd() {
     this.requestEndTime = System.nanoTime();
   }
+
+  public void responseEnd() {
+    this.endpointMetric.incrementRequests();
+    this.endpointMetric.addLatency(System.nanoTime() - this.requestBeginTime);
+  }
 }
diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/metrics/TestDefaultHttpClientMetrics.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/metrics/TestDefaultHttpClientMetrics.java
index 8c1aebe..3ce6acb 100644
--- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/metrics/TestDefaultHttpClientMetrics.java
+++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/metrics/TestDefaultHttpClientMetrics.java
@@ -289,22 +289,4 @@ public class TestDefaultHttpClientMetrics {
     Assert.assertEquals(2, socketMetric.getRequestBeginTime());
     Assert.assertEquals(3, socketMetric.getRequestEndTime());
   }
-
-  @SuppressWarnings("deprecation")
-  @Test
-  public void meaningless() {
-    Assert.assertTrue(clientMetrics_a.isEnabled());
-
-    clientMetrics_a.createEndpoint(null, 0, 0);
-    clientMetrics_a.closeEndpoint(null, 0, null);
-    clientMetrics_a.endpointDisconnected(endpointMetric_a_1, null);
-    clientMetrics_a.responseBegin(null, null);
-    clientMetrics_a.responsePushed(null, null, null, null, null);
-    clientMetrics_a.requestReset(null);
-    clientMetrics_a.responseEnd(null, null);
-    clientMetrics_a.connected(null, null, null);
-    clientMetrics_a.disconnected(null);
-    clientMetrics_a.exceptionOccurred(null, null, null);
-    clientMetrics_a.close();
-  }
 }
diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/metrics/TestDefaultHttpServerMetrics.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/metrics/TestDefaultHttpServerMetrics.java
index ed69229..60f2d00 100644
--- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/metrics/TestDefaultHttpServerMetrics.java
+++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/metrics/TestDefaultHttpServerMetrics.java
@@ -187,19 +187,4 @@ public class TestDefaultHttpServerMetrics {
     Assert.assertEquals(3, endpointMetric1.getBytesWritten());
     Assert.assertEquals(12, endpointMetric2.getBytesWritten());
   }
-
-  @SuppressWarnings("deprecation")
-  @Test
-  public void meaningless() {
-    Assert.assertTrue(metrics_listen1_server1.isEnabled());
-
-    metrics_listen1_server1.requestBegin(null, null);
-    metrics_listen1_server1.requestReset(null);
-    metrics_listen1_server1.responsePushed(null, null, null, null);
-    metrics_listen1_server1.responseEnd(null, null);
-    metrics_listen1_server1.connected((DefaultHttpSocketMetric) null, null, null);
-    metrics_listen1_server1.disconnected(null);
-    metrics_listen1_server1.exceptionOccurred(null, null, null);
-    metrics_listen1_server1.close();
-  }
 }
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
index 58dd4c0..3576e3b 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java
@@ -282,6 +282,7 @@ public class LoadbalanceHandler implements Handler {
       // this stats is for WeightedResponseTimeRule
       chosenLB.getLoadBalancerStats().noteResponseTime(server, (System.currentTimeMillis() - time));
       if (isFailedResponse(resp)) {
+        // this stats is for SessionStickinessRule
         chosenLB.getLoadBalancerStats().incrementSuccessiveConnectionFailureCount(server);
         ServiceCombLoadBalancerStats.INSTANCE.markFailure(server);
       } else {
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/SessionStickinessRule.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/SessionStickinessRule.java
index a854a83..f997a97 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/SessionStickinessRule.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/SessionStickinessRule.java
@@ -106,9 +106,9 @@ public class SessionStickinessRule implements RuleExt {
 
     if (stats != null && stats.getServerStats() != null && stats.getServerStats().size() > 0) {
       ServerStats serverStats = stats.getSingleServerStat(lastServer);
-      int successiveFaildCount = serverStats.getSuccessiveConnectionFailureCount();
+      int successiveFailedCount = serverStats.getSuccessiveConnectionFailureCount();
       if (Configuration.INSTANCE.getSuccessiveFailedTimes(microserviceName) > 0
-          && successiveFaildCount >= Configuration.INSTANCE.getSuccessiveFailedTimes(microserviceName)) {
+          && successiveFailedCount >= Configuration.INSTANCE.getSuccessiveFailedTimes(microserviceName)) {
         serverStats.clearSuccessiveConnectionFailureCount();
         return true;
       }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
index 8789a61..080e442 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
@@ -17,6 +17,7 @@
 package org.apache.servicecomb.metrics.core.meter.vertx;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultEndpointMetric;
 
@@ -24,6 +25,8 @@ import com.netflix.spectator.api.Id;
 import com.netflix.spectator.api.Measurement;
 
 public class EndpointMeter {
+  private static final double SNV_MILLI_SECONDS = 1.0 / TimeUnit.MILLISECONDS.toNanos(1L);
+
   public static final String ADDRESS = "address";
 
   public static final String STATISTIC = "statistic";
@@ -38,6 +41,10 @@ public class EndpointMeter {
 
   public static final String BYTES_WRITTEN = "bytesWritten";
 
+  public static final String REQUESTS = "requests";
+
+  public static final String LATENCY = "latency";
+
   protected Id id;
 
   private Id idConnect;
@@ -50,6 +57,10 @@ public class EndpointMeter {
 
   private Id idBytesWritten;
 
+  private Id idRequests;
+
+  private Id idLatency;
+
   protected DefaultEndpointMetric metric;
 
   private long lastConnectCount;
@@ -60,14 +71,20 @@ public class EndpointMeter {
 
   private long lastBytesWritten;
 
+  private long lastRequests;
+
+  private long lastLatency;
+
   public EndpointMeter(Id id, DefaultEndpointMetric metric) {
-    id = id.withTag(ADDRESS, metric.getAddress().toString());
+    id = id.withTag(ADDRESS, metric.getAddress());
     this.id = id;
     idConnect = id.withTag(STATISTIC, CONNECT_COUNT);
     idDisconnect = id.withTag(STATISTIC, DISCONNECT_COUNT);
     idConnections = id.withTag(STATISTIC, CONNECTIONS);
     idBytesRead = id.withTag(STATISTIC, BYTES_READ);
     idBytesWritten = id.withTag(STATISTIC, BYTES_WRITTEN);
+    idRequests = id.withTag(STATISTIC, REQUESTS);
+    idLatency = id.withTag(STATISTIC, LATENCY);
     this.metric = metric;
   }
 
@@ -84,16 +101,23 @@ public class EndpointMeter {
     long disconnectCount = metric.getDisconnectCount();
     long bytesRead = metric.getBytesRead();
     long bytesWritten = metric.getBytesWritten();
+    long requests = metric.getRequests();
+    long latency = metric.getLatency();
 
     measurements.add(newMeasurement(idConnect, msNow, connectCount - lastConnectCount));
     measurements.add(newMeasurement(idDisconnect, msNow, disconnectCount - lastDisconnectCount));
     measurements.add(newMeasurement(idConnections, msNow, connectCount - disconnectCount));
     measurements.add(newMeasurement(idBytesRead, msNow, (bytesRead - lastBytesRead) / secondInterval));
     measurements.add(newMeasurement(idBytesWritten, msNow, (bytesWritten - lastBytesWritten) / secondInterval));
+    measurements.add(newMeasurement(idRequests, msNow, (requests - lastRequests) / secondInterval));
+    measurements.add(newMeasurement(idLatency, msNow,
+        requests - lastRequests == 0 ? 0 : (latency - lastLatency) / (requests - lastRequests) * SNV_MILLI_SECONDS));
 
     this.lastConnectCount = connectCount;
     this.lastDisconnectCount = disconnectCount;
     this.lastBytesRead = bytesRead;
     this.lastBytesWritten = bytesWritten;
+    this.lastRequests = requests;
+    this.lastLatency = latency;
   }
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ClientEndpointsLogPublisher.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ClientEndpointsLogPublisher.java
index 6b6b482..969dedd 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ClientEndpointsLogPublisher.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ClientEndpointsLogPublisher.java
@@ -33,12 +33,14 @@ public class ClientEndpointsLogPublisher extends AbstractMeasurementNodeLogPubli
   @Override
   public void print(boolean printDetail) {
     appendLine(sb, "    client.endpoints:");
-    appendLine(sb, "      connectCount disconnectCount queue         connections send(Bps) receive(Bps) remote");
+    appendLine(sb, "      connectCount disconnectCount queue         connections requests latency send(Bps) receive(Bps) remote");
 
     double connect = 0;
     double disconnect = 0;
     double queue = 0;
     double connections = 0;
+    double requests = 0;
+    double latency = 0;
     double readSize = 0;
     double writeSize = 0;
     for (MeasurementNode address : measurementNode.getChildren().values()) {
@@ -46,15 +48,19 @@ public class ClientEndpointsLogPublisher extends AbstractMeasurementNodeLogPubli
       disconnect += address.findChild(EndpointMeter.DISCONNECT_COUNT).summary();
       queue += address.findChild(HttpClientEndpointMeter.QUEUE_COUNT).summary();
       connections += address.findChild(EndpointMeter.CONNECTIONS).summary();
+      requests += address.findChild(EndpointMeter.REQUESTS).summary();
+      latency += address.findChild(EndpointMeter.LATENCY).summary();
       readSize += address.findChild(EndpointMeter.BYTES_READ).summary();
       writeSize += address.findChild(EndpointMeter.BYTES_WRITTEN).summary();
 
       if (printDetail) {
-        appendLine(sb, "      %-12.0f %-15.0f %-13.0f %-11.0f %-9s %-12s %s",
+        appendLine(sb, "      %-12.0f %-15.0f %-13.0f %-11.0f %-8.0f %-7.0f %-9s %-12s %s",
             address.findChild(EndpointMeter.CONNECT_COUNT).summary(),
             address.findChild(EndpointMeter.DISCONNECT_COUNT).summary(),
             address.findChild(HttpClientEndpointMeter.QUEUE_COUNT).summary(),
             address.findChild(EndpointMeter.CONNECTIONS).summary(),
+            address.findChild(EndpointMeter.REQUESTS).summary(),
+            address.findChild(EndpointMeter.LATENCY).summary(),
             NetUtils.humanReadableBytes((long) address.findChild(EndpointMeter.BYTES_WRITTEN).summary()),
             NetUtils.humanReadableBytes((long) address.findChild(EndpointMeter.BYTES_READ).summary()),
             address.getName()
@@ -62,11 +68,13 @@ public class ClientEndpointsLogPublisher extends AbstractMeasurementNodeLogPubli
       }
     }
 
-    appendLine(sb, "      %-12.0f %-15.0f %-13.0f %-11.0f %-9s %-12s %s",
+    appendLine(sb, "      %-12.0f %-15.0f %-13.0f %-11.0f %-8.0f %-7.0f %-9s %-12s %s",
         connect,
         disconnect,
         queue,
         connections,
+        requests,
+        latency,
         NetUtils.humanReadableBytes((long) writeSize),
         NetUtils.humanReadableBytes((long) readSize),
         "(summary)"
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ServerEndpointsLogPublisher.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ServerEndpointsLogPublisher.java
index bcf35dc..616c2d9 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ServerEndpointsLogPublisher.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ServerEndpointsLogPublisher.java
@@ -34,12 +34,14 @@ public class ServerEndpointsLogPublisher extends AbstractMeasurementNodeLogPubli
   public void print(boolean printDetail) {
     appendLine(sb, "    server.endpoints:");
     appendLine(sb,
-        "      connectCount disconnectCount rejectByLimit connections send(Bps) receive(Bps) listen");
+        "      connectCount disconnectCount rejectByLimit connections requests latency send(Bps) receive(Bps) listen");
 
     double connect = 0;
     double disconnect = 0;
     double reject = 0;
     double connections = 0;
+    double requests = 0;
+    double latency = 0;
     double readSize = 0;
     double writeSize = 0;
     for (MeasurementNode address : measurementNode.getChildren().values()) {
@@ -47,15 +49,19 @@ public class ServerEndpointsLogPublisher extends AbstractMeasurementNodeLogPubli
       disconnect += address.findChild(EndpointMeter.DISCONNECT_COUNT).summary();
       reject += address.findChild(ServerEndpointMeter.REJECT_BY_CONNECTION_LIMIT).summary();
       connections += address.findChild(EndpointMeter.CONNECTIONS).summary();
+      requests += address.findChild(EndpointMeter.REQUESTS).summary();
+      latency += address.findChild(EndpointMeter.LATENCY).summary();
       readSize += address.findChild(EndpointMeter.BYTES_READ).summary();
       writeSize += address.findChild(EndpointMeter.BYTES_WRITTEN).summary();
 
       if (printDetail) {
-        appendLine(sb, "      %-12.0f %-15.0f %-13.0f %-11.0f %-9s %-12s %s",
+        appendLine(sb, "      %-12.0f %-15.0f %-13.0f %-11.0f %-8.0f %-7.0f %-9s %-12s %s",
             address.findChild(EndpointMeter.CONNECT_COUNT).summary(),
             address.findChild(EndpointMeter.DISCONNECT_COUNT).summary(),
             address.findChild(ServerEndpointMeter.REJECT_BY_CONNECTION_LIMIT).summary(),
             address.findChild(EndpointMeter.CONNECTIONS).summary(),
+            address.findChild(EndpointMeter.REQUESTS).summary(),
+            address.findChild(EndpointMeter.LATENCY).summary(),
             NetUtils.humanReadableBytes((long) address.findChild(EndpointMeter.BYTES_WRITTEN).summary()),
             NetUtils.humanReadableBytes((long) address.findChild(EndpointMeter.BYTES_READ).summary()),
             address.getName()
@@ -63,11 +69,13 @@ public class ServerEndpointsLogPublisher extends AbstractMeasurementNodeLogPubli
       }
     }
 
-    appendLine(sb, "      %-12.0f %-15.0f %-13.0f %-11.0f %-9s %-12s %s",
+    appendLine(sb, "      %-12.0f %-15.0f %-13.0f %-11.0f %-8.0f %-7.0f %-9s %-12s %s",
         connect,
         disconnect,
         reject,
         connections,
+        requests,
+        latency,
         NetUtils.humanReadableBytes((long) writeSize),
         NetUtils.humanReadableBytes((long) readSize),
         "(summary)"
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java
index f10c010..daf54a7 100644
--- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java
@@ -144,6 +144,9 @@ public class TestVertxMetersInitializer {
     int idx = actual.indexOf("vertx:\n");
     actual = actual.substring(idx);
 
+    String clientLatency;
+    String serverLatency;
+
     String expect = "vertx:\n"
         + "  instances:\n"
         + "    name       eventLoopContext-created\n"
@@ -152,18 +155,32 @@ public class TestVertxMetersInitializer {
         + "    transport  0\n"
         + "  transport:\n"
         + "    client.endpoints:\n"
-        + "      connectCount disconnectCount queue         connections send(Bps) receive(Bps) remote\n";
+        + "      connectCount disconnectCount queue         connections requests latency send(Bps) receive(Bps) remote\n";
+
+    int clientLatencyIndex = actual.indexOf("1            0               0             1           1        ")
+        + "1            0               0             1           1        ".length();
+    clientLatency = actual.substring(clientLatencyIndex, actual.indexOf(" ", clientLatencyIndex));
+    int serverLatencyIndex = actual.lastIndexOf("1            0               0             1           1        ")
+        + "1            0               0             1           1        ".length();
+    serverLatency = actual.substring(serverLatencyIndex, actual.indexOf(" ", serverLatencyIndex));
+
     if (printDetail) {
-      expect += String.format(
-          "      1            0               0             1           4         21           127.0.0.1:%-5s\n",
-          port);
+      expect +=
+          "      1            0               0             1           1        %-7s 4         21           127.0.0.1:%-5s\n";
     }
     expect += ""
-        + "      1            0               0             1           4         21           (summary)\n"
+        + "      1            0               0             1           1        %-7s 4         21           (summary)\n"
         + "    server.endpoints:\n"
-        + "      connectCount disconnectCount rejectByLimit connections send(Bps) receive(Bps) listen\n"
-        + "      1            0               0             1           21        4            0.0.0.0:0\n"
-        + "      1            0               0             1           21        4            (summary)\n\n";
+        + "      connectCount disconnectCount rejectByLimit connections requests latency send(Bps) receive(Bps) listen\n"
+        + "      1            0               0             1           1        %-7s 21        4            0.0.0.0:0\n"
+        + "      1            0               0             1           1        %-7s 21        4            (summary)\n\n";
+
+    if (printDetail) {
+      expect = String.format(expect, clientLatency, port, clientLatency, serverLatency, serverLatency);
+    } else {
+      expect = String.format(expect, clientLatency, serverLatency, serverLatency);
+    }
+
     Assert.assertEquals(expect, actual);
   }
 }