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

commit 746f42cf6d1211532fd848fdb30f8f9e8e99ba85
Author: wujimin <[email protected]>
AuthorDate: Thu Nov 22 09:12:35 2018 +0800

    [SCB-1034][WIP] invocation meters switch to new mechanism
---
 .../metrics/core/InvocationMetersInitializer.java  |   9 +-
 .../meter/invocation/AbstractInvocationMeter.java  |  88 +++++--
 .../meter/invocation/AbstractInvocationMeters.java |  10 +-
 .../meter/invocation/ConsumerInvocationMeter.java  |  82 +++---
 .../meter/invocation/ConsumerInvocationMeters.java |   7 +-
 .../core/meter/invocation/EdgeInvocationMeter.java |  52 ++--
 .../meter/invocation/EdgeInvocationMeters.java     |   7 +-
 .../meter/invocation/MeterInvocationConst.java     |  49 ++--
 .../meter/invocation/ProducerInvocationMeter.java  |  58 ++---
 .../meter/invocation/ProducerInvocationMeters.java |   7 +-
 .../core/TestInvocationMetersInitializer.java      | 187 ++++++++------
 .../publish/TestInvocationPublishModelFactory.java | 281 +++++++++++++++++++--
 12 files changed, 557 insertions(+), 280 deletions(-)

diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/InvocationMetersInitializer.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/InvocationMetersInitializer.java
index 72a05ef..d265434 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/InvocationMetersInitializer.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/InvocationMetersInitializer.java
@@ -19,9 +19,9 @@ package org.apache.servicecomb.metrics.core;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.InvocationStartEvent;
-import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
+import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.apache.servicecomb.metrics.core.meter.ConsumerMeters;
 import org.apache.servicecomb.metrics.core.meter.EdgeMeters;
 import org.apache.servicecomb.metrics.core.meter.ProducerMeters;
@@ -30,7 +30,6 @@ import 
org.apache.servicecomb.metrics.core.meter.invocation.AbstractInvocationMe
 import com.google.common.eventbus.AllowConcurrentEvents;
 import com.google.common.eventbus.EventBus;
 import com.google.common.eventbus.Subscribe;
-import com.netflix.spectator.api.CompositeRegistry;
 import com.netflix.spectator.api.Registry;
 
 public class InvocationMetersInitializer implements MetricsInitializer {
@@ -41,10 +40,8 @@ public class InvocationMetersInitializer implements 
MetricsInitializer {
   private EdgeMeters edgeMeters;
 
   @Override
-  public void init(CompositeRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
-    DefaultRegistryInitializer defaultRegistryInitializer =
-        SPIServiceUtils.getTargetService(MetricsInitializer.class, 
DefaultRegistryInitializer.class);
-    Registry registry = defaultRegistryInitializer.getRegistry();
+  public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+    Registry registry = globalRegistry.getDefaultRegistry();
 
     consumerMeters = new ConsumerMeters(registry);
     producerMeters = new ProducerMeters(registry);
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java
index dd0851e..3023602 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java
@@ -16,52 +16,84 @@
  */
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import java.util.concurrent.TimeUnit;
+import java.util.ArrayList;
+import java.util.List;
 
-import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
-import org.apache.servicecomb.swagger.invocation.Response;
+import org.apache.servicecomb.core.invocation.InvocationStageTrace;
+import org.apache.servicecomb.foundation.metrics.meter.AbstractPeriodMeter;
+import org.apache.servicecomb.foundation.metrics.meter.SimpleTimer;
 
 import com.netflix.spectator.api.Id;
+import com.netflix.spectator.api.Measurement;
 import com.netflix.spectator.api.Registry;
-import com.netflix.spectator.api.Timer;
 
-public abstract class AbstractInvocationMeter {
+public abstract class AbstractInvocationMeter extends AbstractPeriodMeter {
+  private final Registry registry;
+
   //total time
-  private Timer totalTimer;
+  private SimpleTimer totalTimer;
 
   // prepare time
-  private Timer prepareTimer;
+  private SimpleTimer prepareTimer;
 
   // handler request
-  private Timer handlersRequestTimer;
+  private SimpleTimer handlersRequestTimer;
 
   // handler response
-  private Timer handlersResponseTimer;
+  private SimpleTimer handlersResponseTimer;
+
+  private long lastUpdated;
+
+  public AbstractInvocationMeter(Registry registry, Id id) {
+    this.registry = registry;
+    this.id = id;
+
+    totalTimer = creatStageTimer(MeterInvocationConst.STAGE_TOTAL);
+    prepareTimer = creatStageTimer(MeterInvocationConst.STAGE_PREPARE);
+    handlersRequestTimer = 
creatStageTimer(MeterInvocationConst.STAGE_HANDLERS_REQUEST);
+    handlersResponseTimer = 
creatStageTimer(MeterInvocationConst.STAGE_HANDLERS_RESPONSE);
+  }
+
+  protected SimpleTimer creatStageTimer(String stageValue) {
+    return createTimer(id.withTag(MeterInvocationConst.TAG_STAGE, stageValue));
+  }
 
-  public AbstractInvocationMeter(Registry registry, Id id, Invocation 
invocation, Response response) {
+  protected SimpleTimer createTimer(String tagKey, String tagValue) {
+    return createTimer(id.withTag(tagKey, tagValue));
+  }
 
-    totalTimer = registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_TOTAL));
-    prepareTimer = registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_PREPARE));
-    handlersRequestTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_HANDLERS_REQUEST));
-    handlersResponseTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_HANDLERS_RESPONSE));
+  protected SimpleTimer createTimer(Id timerId) {
+    return new SimpleTimer(timerId);
   }
 
   public void onInvocationFinish(InvocationFinishEvent event) {
+    lastUpdated = registry.clock().wallTime();
+
+    InvocationStageTrace stageTrace = 
event.getInvocation().getInvocationStageTrace();
+    totalTimer.record((long) stageTrace.calcTotalTime());
+    handlersRequestTimer.record((long) stageTrace.calcHandlersRequestTime());
+    handlersResponseTimer.record((long) stageTrace.calcHandlersResponseTime());
+    prepareTimer.record((long) stageTrace.calcInvocationPrepareTime());
+  }
+
+  @Override
+  public void calcMeasurements(long msNow, long secondInterval) {
+    List<Measurement> measurements = new ArrayList<>(3);
+    calcMeasurements(measurements, msNow, secondInterval);
+    allMeasurements = measurements;
+  }
+
+  @Override
+  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
+    totalTimer.calcMeasurements(measurements, msNow, secondInterval);
+    handlersRequestTimer.calcMeasurements(measurements, msNow, secondInterval);
+    handlersResponseTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    prepareTimer.calcMeasurements(measurements, msNow, secondInterval);
+  }
 
-    totalTimer.record((long) 
event.getInvocation().getInvocationStageTrace().calcTotalTime(),
-        TimeUnit.NANOSECONDS);
-
-    handlersRequestTimer
-        .record((long) 
event.getInvocation().getInvocationStageTrace().calcHandlersRequestTime(),
-            TimeUnit.NANOSECONDS);
-    handlersResponseTimer
-        .record((long) 
event.getInvocation().getInvocationStageTrace().calcHandlersResponseTime(),
-            TimeUnit.NANOSECONDS);
-    prepareTimer
-        .record((long) 
event.getInvocation().getInvocationStageTrace().calcInvocationPrepareTime(),
-            TimeUnit.NANOSECONDS);
+  @Override
+  public boolean hasExpired() {
+    return super.hasExpired();
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java
index 179cd5a..e911480 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java
@@ -26,6 +26,7 @@ import org.apache.servicecomb.swagger.invocation.Response;
 
 import com.netflix.spectator.api.Id;
 import com.netflix.spectator.api.Registry;
+import com.netflix.spectator.api.SpectatorUtils;
 
 public abstract class AbstractInvocationMeters {
   protected Registry registry;
@@ -70,14 +71,13 @@ public abstract class AbstractInvocationMeters {
           MeterInvocationConst.TAG_STATUS,
           String.valueOf(response.getStatusCode()));
 
-      return createMeter(id, invocation, response);
+      AbstractInvocationMeter meter = createMeter(id);
+      SpectatorUtils.registerMeter(registry, meter);
+      return meter;
     });
   }
 
-
-
-  protected abstract AbstractInvocationMeter createMeter(Id id, Invocation 
invocation,
-      Response response);
+  protected abstract AbstractInvocationMeter createMeter(Id id);
 
   public void onInvocationStart(InvocationStartEvent event) {
   }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java
index e8e0d38..a82624f 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java
@@ -16,70 +16,66 @@
  */
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import java.util.concurrent.TimeUnit;
+import java.util.List;
 
-import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
-import org.apache.servicecomb.swagger.invocation.Response;
+import org.apache.servicecomb.foundation.metrics.meter.SimpleTimer;
 
 import com.netflix.spectator.api.Id;
+import com.netflix.spectator.api.Measurement;
 import com.netflix.spectator.api.Registry;
-import com.netflix.spectator.api.Timer;
 
 public class ConsumerInvocationMeter extends AbstractInvocationMeter {
+  private SimpleTimer clientFiltersRequestTimer;
 
-  private Timer clientFiltersRequestTimer;
+  private SimpleTimer consumerSendRequestTimer;
 
-  private Timer consumerSendRequestTimer;
+  private SimpleTimer consumerGetConnectionTimer;
 
-  private Timer consumerGetConnectionTimer;
+  private SimpleTimer consumerWriteToBufTimer;
 
-  private Timer consumerWriteToBufTimer;
+  private SimpleTimer consumerWaitResponseTimer;
 
-  private Timer consumerWaitResponseTimer;
+  private SimpleTimer consumerWakeConsumerTimer;
 
-  private Timer consumerWakeConsumerTimer;
+  private SimpleTimer clientFiltersResponseTimer;
 
-  private Timer clientFiltersResponseTimer;
-
-
-  public ConsumerInvocationMeter(Registry registry, Id id, Invocation 
invocation, Response response) {
-    super(registry, id, invocation, response);
-    clientFiltersRequestTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_CLIENT_FILTERS_REQUEST));
-    consumerSendRequestTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_CONSUMER_SEND_REQUEST));
-    consumerGetConnectionTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_CONSUMER_GET_CONNECTION));
-    consumerWriteToBufTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_CONSUMER_WRITE_TO_BUF));
-    consumerWakeConsumerTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_CONSUMER_WAKE_CONSUMER));
-    clientFiltersResponseTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_CLIENT_FILTERS_RESPONSE));
-    consumerWaitResponseTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_CONSUMER_WAIT_RESPONSE));
+  public ConsumerInvocationMeter(Registry registry, Id id) {
+    super(registry, id);
+    clientFiltersRequestTimer = 
creatStageTimer(MeterInvocationConst.STAGE_CLIENT_FILTERS_REQUEST);
+    consumerSendRequestTimer = 
creatStageTimer(MeterInvocationConst.STAGE_CONSUMER_SEND_REQUEST);
+    consumerGetConnectionTimer = 
creatStageTimer(MeterInvocationConst.STAGE_CONSUMER_GET_CONNECTION);
+    consumerWriteToBufTimer = 
creatStageTimer(MeterInvocationConst.STAGE_CONSUMER_WRITE_TO_BUF);
+    consumerWakeConsumerTimer = 
creatStageTimer(MeterInvocationConst.STAGE_CONSUMER_WAKE_CONSUMER);
+    clientFiltersResponseTimer = 
creatStageTimer(MeterInvocationConst.STAGE_CLIENT_FILTERS_RESPONSE);
+    consumerWaitResponseTimer = 
creatStageTimer(MeterInvocationConst.STAGE_CONSUMER_WAIT_RESPONSE);
   }
 
   @Override
   public void onInvocationFinish(InvocationFinishEvent event) {
     super.onInvocationFinish(event);
+
     InvocationStageTrace invocationStageTrace = 
event.getInvocation().getInvocationStageTrace();
+    clientFiltersRequestTimer.record((long) 
invocationStageTrace.calcClientFiltersRequestTime());
+    consumerSendRequestTimer.record((long) 
invocationStageTrace.calcSendRequestTime());
+    consumerGetConnectionTimer.record((long) 
invocationStageTrace.calcGetConnectionTime());
+    consumerWriteToBufTimer.record((long) 
invocationStageTrace.calcWriteToBufferTime());
+    consumerWaitResponseTimer.record((long) 
invocationStageTrace.calcReceiveResponseTime());
+    consumerWakeConsumerTimer.record((long) 
invocationStageTrace.calcWakeConsumer());
+    clientFiltersResponseTimer.record((long) 
invocationStageTrace.calcClientFiltersResponseTime());
+  }
+
+  @Override
+  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
+    super.calcMeasurements(measurements, msNow, secondInterval);
 
-    clientFiltersRequestTimer.record((long) 
invocationStageTrace.calcClientFiltersRequestTime(),
-        TimeUnit.NANOSECONDS);
-    consumerSendRequestTimer.record((long) 
invocationStageTrace.calcSendRequestTime(),
-        TimeUnit.NANOSECONDS);
-    consumerGetConnectionTimer.record((long) 
invocationStageTrace.calcGetConnectionTime(),
-        TimeUnit.NANOSECONDS);
-    consumerWriteToBufTimer.record((long) 
invocationStageTrace.calcWriteToBufferTime(),
-        TimeUnit.NANOSECONDS);
-    consumerWaitResponseTimer.record((long) 
invocationStageTrace.calcReceiveResponseTime(),
-        TimeUnit.NANOSECONDS);
-    consumerWakeConsumerTimer.record((long) 
invocationStageTrace.calcWakeConsumer(),
-        TimeUnit.NANOSECONDS);
-    clientFiltersResponseTimer.record((long) 
invocationStageTrace.calcClientFiltersResponseTime(),
-        TimeUnit.NANOSECONDS);
+    clientFiltersRequestTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    consumerSendRequestTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    consumerGetConnectionTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    consumerWriteToBufTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    consumerWaitResponseTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    consumerWakeConsumerTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    clientFiltersResponseTimer.calcMeasurements(measurements, msNow, 
secondInterval);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java
index dd24ecb..5543c9f 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java
@@ -16,9 +16,6 @@
  */
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import org.apache.servicecomb.core.Invocation;
-import org.apache.servicecomb.swagger.invocation.Response;
-
 import com.netflix.spectator.api.Id;
 import com.netflix.spectator.api.Registry;
 
@@ -28,7 +25,7 @@ public class ConsumerInvocationMeters extends 
AbstractInvocationMeters {
   }
 
   @Override
-  protected AbstractInvocationMeter createMeter(Id id, Invocation invocation, 
Response response) {
-    return new ConsumerInvocationMeter(registry, id, invocation, response);
+  protected AbstractInvocationMeter createMeter(Id id) {
+    return new ConsumerInvocationMeter(registry, id);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java
index ac97167..ca41a2f 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java
@@ -17,38 +17,31 @@
 
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import java.util.concurrent.TimeUnit;
+import java.util.List;
 
-import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
-import org.apache.servicecomb.swagger.invocation.Response;
+import org.apache.servicecomb.foundation.metrics.meter.SimpleTimer;
 
 import com.netflix.spectator.api.Id;
+import com.netflix.spectator.api.Measurement;
 import com.netflix.spectator.api.Registry;
-import com.netflix.spectator.api.Timer;
 
 public class EdgeInvocationMeter extends ConsumerInvocationMeter {
+  private SimpleTimer executorQueueTimer;
 
-  private Timer executorQueueTimer;
+  private SimpleTimer serverFiltersRequestTimer;
 
-  private Timer serverFiltersRequestTimer;
+  private SimpleTimer serverFiltersResponseTimer;
 
-  private Timer serverFiltersResponseTimer;
+  private SimpleTimer sendResponseTimer;
 
-  private Timer sendResponseTimer;
-
-  public EdgeInvocationMeter(Registry registry, Id id, Invocation invocation, 
Response response) {
-    super(registry, id, invocation, response);
-    executorQueueTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_EXECUTOR_QUEUE));
-
-    serverFiltersRequestTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_SERVER_FILTERS_REQUEST));
-    serverFiltersResponseTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_SERVER_FILTERS_RESPONSE));
-    sendResponseTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_PRODUCER_SEND_RESPONSE));
+  public EdgeInvocationMeter(Registry registry, Id id) {
+    super(registry, id);
+    executorQueueTimer = 
creatStageTimer(MeterInvocationConst.STAGE_EXECUTOR_QUEUE);
+    serverFiltersRequestTimer = 
creatStageTimer(MeterInvocationConst.STAGE_SERVER_FILTERS_REQUEST);
+    serverFiltersResponseTimer = 
creatStageTimer(MeterInvocationConst.STAGE_SERVER_FILTERS_RESPONSE);
+    sendResponseTimer = 
creatStageTimer(MeterInvocationConst.STAGE_PRODUCER_SEND_RESPONSE);
   }
 
   @Override
@@ -56,12 +49,19 @@ public class EdgeInvocationMeter extends 
ConsumerInvocationMeter {
     super.onInvocationFinish(event);
     InvocationStageTrace invocationStageTrace = 
event.getInvocation().getInvocationStageTrace();
 
-    executorQueueTimer.record((long) 
invocationStageTrace.calcThreadPoolQueueTime(),
-        TimeUnit.NANOSECONDS);
+    executorQueueTimer.record((long) 
invocationStageTrace.calcThreadPoolQueueTime());
+    serverFiltersRequestTimer.record((long) 
invocationStageTrace.calcServerFiltersRequestTime());
+    serverFiltersResponseTimer.record((long) 
invocationStageTrace.calcServerFiltersResponseTime());
+    sendResponseTimer.record((long) 
invocationStageTrace.calcSendResponseTime());
+  }
+
+  @Override
+  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
+    super.calcMeasurements(measurements, msNow, secondInterval);
 
-    serverFiltersRequestTimer.record((long) 
invocationStageTrace.calcServerFiltersRequestTime(), TimeUnit.NANOSECONDS);
-    serverFiltersResponseTimer
-        .record((long) invocationStageTrace.calcServerFiltersResponseTime(), 
TimeUnit.NANOSECONDS);
-    sendResponseTimer.record((long) 
invocationStageTrace.calcSendResponseTime(), TimeUnit.NANOSECONDS);
+    executorQueueTimer.calcMeasurements(measurements, msNow, secondInterval);
+    serverFiltersRequestTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    serverFiltersResponseTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    sendResponseTimer.calcMeasurements(measurements, msNow, secondInterval);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java
index 70c5c20..b7db74c 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java
@@ -17,9 +17,6 @@
 
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import org.apache.servicecomb.core.Invocation;
-import org.apache.servicecomb.swagger.invocation.Response;
-
 import com.netflix.spectator.api.Id;
 import com.netflix.spectator.api.Registry;
 
@@ -29,7 +26,7 @@ public class EdgeInvocationMeters extends 
ConsumerInvocationMeters {
   }
 
   @Override
-  protected AbstractInvocationMeter createMeter(Id id, Invocation invocation, 
Response response) {
-    return new EdgeInvocationMeter(registry, id, invocation, response);
+  protected AbstractInvocationMeter createMeter(Id id) {
+    return new EdgeInvocationMeter(registry, id);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/MeterInvocationConst.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/MeterInvocationConst.java
index b4e12d2..e09da9b 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/MeterInvocationConst.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/MeterInvocationConst.java
@@ -19,56 +19,55 @@ package 
org.apache.servicecomb.metrics.core.meter.invocation;
 import com.netflix.spectator.api.Statistic;
 
 public interface MeterInvocationConst {
-  final String INVOCATION_NAME = "servicecomb.invocation";
+  String INVOCATION_NAME = "servicecomb.invocation";
 
   // consumer or producer
-  final String TAG_ROLE = "role";
+  String TAG_ROLE = "role";
 
-  final String TAG_OPERATION = "operation";
+  String TAG_OPERATION = "operation";
 
-  final String TAG_TRANSPORT = "transport";
+  String TAG_TRANSPORT = "transport";
 
-  final String TAG_STAGE = "stage";
+  String TAG_STAGE = "stage";
 
-  final String TAG_STATUS = "status";
+  String TAG_STATUS = "status";
 
-  final String TAG_STATISTIC = Statistic.count.key();
+  String TAG_STATISTIC = Statistic.count.key();
 
-  final String STAGE_TOTAL = "total";
+  String STAGE_TOTAL = "total";
 
-  final String STAGE_PREPARE = "prepare";
+  String STAGE_PREPARE = "prepare";
 
-  final String STAGE_EXECUTOR_QUEUE = "queue";
+  String STAGE_EXECUTOR_QUEUE = "queue";
 
-  final String STAGE_EXECUTION = "execution";
+  String STAGE_EXECUTION = "execution";
 
-  final String EDGE_INVOCATION_NAME = "EDGE";
+  String EDGE_INVOCATION_NAME = "EDGE";
 
-  final String STAGE_HANDLERS_REQUEST = "handlers_request";
+  String STAGE_HANDLERS_REQUEST = "handlers_request";
 
-  final String STAGE_HANDLERS_RESPONSE = "handlers_response";
+  String STAGE_HANDLERS_RESPONSE = "handlers_response";
 
   // producer only
-  final String STAGE_SERVER_FILTERS_REQUEST = "server_filters_request";
+  String STAGE_SERVER_FILTERS_REQUEST = "server_filters_request";
 
-  final String STAGE_SERVER_FILTERS_RESPONSE = "server_filters_response";
+  String STAGE_SERVER_FILTERS_RESPONSE = "server_filters_response";
 
-  final String STAGE_PRODUCER_SEND_RESPONSE = "producer_send_response";
+  String STAGE_PRODUCER_SEND_RESPONSE = "producer_send_response";
 
   //consumer only
 
-  final String STAGE_CLIENT_FILTERS_REQUEST = "client_filters_request";
+  String STAGE_CLIENT_FILTERS_REQUEST = "client_filters_request";
 
-  final String STAGE_CONSUMER_SEND_REQUEST = "consumer_send_request";
+  String STAGE_CONSUMER_SEND_REQUEST = "consumer_send_request";
 
-  final String STAGE_CONSUMER_GET_CONNECTION = "consumer_get_connection";
+  String STAGE_CONSUMER_GET_CONNECTION = "consumer_get_connection";
 
-  final String STAGE_CONSUMER_WRITE_TO_BUF = "consumer_write_to_buf";
+  String STAGE_CONSUMER_WRITE_TO_BUF = "consumer_write_to_buf";
 
-  final String STAGE_CONSUMER_WAIT_RESPONSE = "consumer_wait_response";
+  String STAGE_CONSUMER_WAIT_RESPONSE = "consumer_wait_response";
 
-  final String STAGE_CONSUMER_WAKE_CONSUMER = "consumer_wake_consumer";
-
-  final String STAGE_CLIENT_FILTERS_RESPONSE = "client_filters_response";
+  String STAGE_CONSUMER_WAKE_CONSUMER = "consumer_wake_consumer";
 
+  String STAGE_CLIENT_FILTERS_RESPONSE = "client_filters_response";
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java
index cb525d7..79b89e5 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java
@@ -16,42 +16,35 @@
  */
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import java.util.concurrent.TimeUnit;
+import java.util.List;
 
-import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
-import org.apache.servicecomb.swagger.invocation.Response;
+import org.apache.servicecomb.foundation.metrics.meter.SimpleTimer;
 
 import com.netflix.spectator.api.Id;
+import com.netflix.spectator.api.Measurement;
 import com.netflix.spectator.api.Registry;
-import com.netflix.spectator.api.Timer;
 
 public class ProducerInvocationMeter extends AbstractInvocationMeter {
-  private Timer executorQueueTimer;
+  private SimpleTimer executorQueueTimer;
 
-  private Timer executionTimer;
+  private SimpleTimer executionTimer;
 
-  private Timer serverFiltersRequestTimer;
+  private SimpleTimer serverFiltersRequestTimer;
 
-  private Timer serverFiltersResponseTimer;
+  private SimpleTimer serverFiltersResponseTimer;
 
-  private Timer sendResponseTimer;
+  private SimpleTimer sendResponseTimer;
 
+  public ProducerInvocationMeter(Registry registry, Id id) {
+    super(registry, id);
 
-  public ProducerInvocationMeter(Registry registry, Id id, Invocation 
invocation, Response response) {
-    super(registry, id, invocation, response);
-
-    executorQueueTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_EXECUTOR_QUEUE));
-    executionTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_EXECUTION));
-    serverFiltersRequestTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_SERVER_FILTERS_REQUEST));
-    serverFiltersResponseTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_SERVER_FILTERS_RESPONSE));
-    sendResponseTimer =
-        registry.timer(id.withTag(MeterInvocationConst.TAG_STAGE, 
MeterInvocationConst.STAGE_PRODUCER_SEND_RESPONSE));
+    executorQueueTimer = 
creatStageTimer(MeterInvocationConst.STAGE_EXECUTOR_QUEUE);
+    executionTimer = creatStageTimer(MeterInvocationConst.STAGE_EXECUTION);
+    serverFiltersRequestTimer = 
creatStageTimer(MeterInvocationConst.STAGE_SERVER_FILTERS_REQUEST);
+    serverFiltersResponseTimer = 
creatStageTimer(MeterInvocationConst.STAGE_SERVER_FILTERS_RESPONSE);
+    sendResponseTimer = 
creatStageTimer(MeterInvocationConst.STAGE_PRODUCER_SEND_RESPONSE);
   }
 
   @Override
@@ -59,14 +52,21 @@ public class ProducerInvocationMeter extends 
AbstractInvocationMeter {
     super.onInvocationFinish(event);
 
     InvocationStageTrace invocationStageTrace = 
event.getInvocation().getInvocationStageTrace();
+    executorQueueTimer.record((long) 
invocationStageTrace.calcThreadPoolQueueTime());
+    executionTimer.record((long) invocationStageTrace.calcBusinessTime());
+    serverFiltersRequestTimer.record((long) 
invocationStageTrace.calcServerFiltersRequestTime());
+    serverFiltersResponseTimer.record((long) 
invocationStageTrace.calcServerFiltersResponseTime());
+    sendResponseTimer.record((long) 
invocationStageTrace.calcSendResponseTime());
+  }
 
-    executorQueueTimer.record((long) 
invocationStageTrace.calcThreadPoolQueueTime(),
-        TimeUnit.NANOSECONDS);
-    executionTimer.record((long) invocationStageTrace.calcBusinessTime(), 
TimeUnit.NANOSECONDS);
+  @Override
+  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
+    super.calcMeasurements(measurements, msNow, secondInterval);
 
-    serverFiltersRequestTimer.record((long) 
invocationStageTrace.calcServerFiltersRequestTime(), TimeUnit.NANOSECONDS);
-    serverFiltersResponseTimer
-        .record((long) invocationStageTrace.calcServerFiltersResponseTime(), 
TimeUnit.NANOSECONDS);
-    sendResponseTimer.record((long) 
invocationStageTrace.calcSendResponseTime(), TimeUnit.NANOSECONDS);
+    executorQueueTimer.calcMeasurements(measurements, msNow, secondInterval);
+    executionTimer.calcMeasurements(measurements, msNow, secondInterval);
+    serverFiltersRequestTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    serverFiltersResponseTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    sendResponseTimer.calcMeasurements(measurements, msNow, secondInterval);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java
index 56031d0..f8e8814 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java
@@ -16,9 +16,6 @@
  */
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import org.apache.servicecomb.core.Invocation;
-import org.apache.servicecomb.swagger.invocation.Response;
-
 import com.netflix.spectator.api.Id;
 import com.netflix.spectator.api.Registry;
 
@@ -28,7 +25,7 @@ public class ProducerInvocationMeters extends 
AbstractInvocationMeters {
   }
 
   @Override
-  protected AbstractInvocationMeter createMeter(Id id, Invocation invocation, 
Response response) {
-    return new ProducerInvocationMeter(registry, id, invocation, response);
+  protected AbstractInvocationMeter createMeter(Id id) {
+    return new ProducerInvocationMeter(registry, id);
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestInvocationMetersInitializer.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestInvocationMetersInitializer.java
index 4bc556e..6bb57ad 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestInvocationMetersInitializer.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestInvocationMetersInitializer.java
@@ -21,10 +21,9 @@ import static org.junit.Assert.assertEquals;
 import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
-import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
 import 
org.apache.servicecomb.foundation.metrics.publish.spectator.MeasurementGroupConfig;
 import 
org.apache.servicecomb.foundation.metrics.publish.spectator.MeasurementTree;
+import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst;
 import org.apache.servicecomb.swagger.invocation.InvocationType;
 import org.apache.servicecomb.swagger.invocation.Response;
@@ -42,7 +41,9 @@ import mockit.Mocked;
 public class TestInvocationMetersInitializer {
   EventBus eventBus = new EventBus();
 
-  Registry registry = new DefaultRegistry(new ManualClock());
+  GlobalRegistry globalRegistry = new GlobalRegistry(new ManualClock());
+
+  Registry registry = new DefaultRegistry(globalRegistry.getClock());
 
   InvocationMetersInitializer invocationMetersInitializer = new 
InvocationMetersInitializer();
 
@@ -52,20 +53,10 @@ public class TestInvocationMetersInitializer {
   @Mocked
   Response response;
 
-  @Mocked
-  DefaultRegistryInitializer defaultRegistryInitializer;
-
   @Before
   public void setup() {
-    new Expectations(SPIServiceUtils.class) {
-      {
-        SPIServiceUtils.getTargetService(MetricsInitializer.class, 
DefaultRegistryInitializer.class);
-        result = defaultRegistryInitializer;
-        defaultRegistryInitializer.getRegistry();
-        result = registry;
-      }
-    };
-    invocationMetersInitializer.init(null, eventBus, null);
+    globalRegistry.add(registry);
+    invocationMetersInitializer.init(globalRegistry, eventBus, null);
   }
 
   @Test
@@ -111,32 +102,44 @@ public class TestInvocationMetersInitializer {
     eventBus.post(event);
     eventBus.post(event);
 
+    globalRegistry.poll(1);
+
     MeasurementTree tree = new MeasurementTree();
     tree.from(registry.iterator(), new 
MeasurementGroupConfig(MeterInvocationConst.INVOCATION_NAME));
-    assertEquals(
-        
"[Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_wait_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_wait_response:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_write_to_buf:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_write_to_buf:statistic=totalTime:status=0:transport=rest,0,10.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=client_filters_request:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=client_filters_request:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=total:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=total:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=client_filters_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=client_filters_response:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_send_request:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_send_request:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
+    assertEquals(""
+            + 
"[Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=total:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=total:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=total:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=handlers_request:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=handlers_request:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=handlers_request:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=handlers_request:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=handlers_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=handlers_response:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_wake_consumer:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_wake_consumer:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_get_connection:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_get_connection:statistic=totalTime:status=0:transport=rest,0,8.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=handlers_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=handlers_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=prepare:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=prepare:statistic=totalTime:status=0:transport=rest,0,18.0)]"
-        ,
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=prepare:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=prepare:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=client_filters_request:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=client_filters_request:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=client_filters_request:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_send_request:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_send_request:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_send_request:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_get_connection:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_get_connection:statistic=totalTime:status=0:transport=rest,0,8.0E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_get_connection:statistic=max:status=0:transport=rest,0,4.0E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_write_to_buf:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_write_to_buf:statistic=totalTime:status=0:transport=rest,0,1.0E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_write_to_buf:statistic=max:status=0:transport=rest,0,5.0E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_wait_response:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_wait_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_wait_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_wake_consumer:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_wake_consumer:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=consumer_wake_consumer:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=client_filters_response:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=client_filters_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=CONSUMER:stage=client_filters_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9)]",
         
tree.findChild(MeterInvocationConst.INVOCATION_NAME).getMeasurements().toString());
   }
 
@@ -190,40 +193,56 @@ public class TestInvocationMetersInitializer {
     eventBus.post(event);
     eventBus.post(event);
 
+    globalRegistry.poll(1);
+
     MeasurementTree tree = new MeasurementTree();
     tree.from(registry.iterator(), new 
MeasurementGroupConfig(MeterInvocationConst.INVOCATION_NAME));
-    assertEquals(
-        
"[Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_send_request:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_send_request:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=server_filters_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=server_filters_response:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=total:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=total:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
+    assertEquals(""
+            + 
"[Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=total:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=total:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=total:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=handlers_request:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=handlers_request:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_wake_consumer:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_wake_consumer:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=client_filters_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=client_filters_response:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=producer_send_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=producer_send_response:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_write_to_buf:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_write_to_buf:statistic=totalTime:status=0:transport=rest,0,10.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=server_filters_request:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=server_filters_request:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=queue:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=queue:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=handlers_request:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=handlers_request:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=handlers_response:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=handlers_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=handlers_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=prepare:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=prepare:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=prepare:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=prepare:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=client_filters_request:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=client_filters_request:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=client_filters_request:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_send_request:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_send_request:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_send_request:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_get_connection:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_get_connection:statistic=totalTime:status=0:transport=rest,0,8.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_get_connection:statistic=totalTime:status=0:transport=rest,0,8.0E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_get_connection:statistic=max:status=0:transport=rest,0,4.0E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_write_to_buf:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_write_to_buf:statistic=totalTime:status=0:transport=rest,0,1.0E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_write_to_buf:statistic=max:status=0:transport=rest,0,5.0E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_wait_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_wait_response:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=handlers_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=handlers_response:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=client_filters_request:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=client_filters_request:statistic=totalTime:status=0:transport=rest,0,18.0)]"
-        ,
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_wait_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_wait_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_wake_consumer:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_wake_consumer:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=consumer_wake_consumer:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=client_filters_response:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=client_filters_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=client_filters_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=queue:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=queue:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=queue:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=server_filters_request:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=server_filters_request:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=server_filters_request:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=server_filters_response:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=server_filters_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=server_filters_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=producer_send_response:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=producer_send_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=EDGE:stage=producer_send_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9)]",
         
tree.findChild(MeterInvocationConst.INVOCATION_NAME).getMeasurements().toString());
   }
 
@@ -265,28 +284,38 @@ public class TestInvocationMetersInitializer {
     eventBus.post(event);
     eventBus.post(event);
 
+    globalRegistry.poll(1);
+
     MeasurementTree tree = new MeasurementTree();
     tree.from(registry.iterator(), new 
MeasurementGroupConfig(MeterInvocationConst.INVOCATION_NAME));
-    assertEquals(
-        
"[Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=execution:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=execution:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=prepare:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=prepare:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=total:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=total:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
+    assertEquals(""
+            + 
"[Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=total:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=total:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=total:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=handlers_request:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=handlers_request:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=handlers_request:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=handlers_request:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=handlers_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=handlers_response:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=producer_send_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=producer_send_response:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=handlers_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=handlers_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=prepare:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=prepare:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=prepare:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=queue:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=queue:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=queue:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=queue:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=execution:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=execution:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=execution:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=server_filters_request:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=server_filters_request:statistic=totalTime:status=0:transport=rest,0,18.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=server_filters_request:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=server_filters_request:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
             + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=server_filters_response:statistic=count:status=0:transport=rest,0,2.0),
 "
-            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=server_filters_response:statistic=totalTime:status=0:transport=rest,0,18.0)]"
-        ,
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=server_filters_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=server_filters_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=producer_send_response:statistic=count:status=0:transport=rest,0,2.0),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=producer_send_response:statistic=totalTime:status=0:transport=rest,0,1.8000000000000002E-8),
 "
+            + 
"Measurement(servicecomb.invocation:operation=m.s.o:role=PRODUCER:stage=producer_send_response:statistic=max:status=0:transport=rest,0,9.000000000000001E-9)]",
         
tree.findChild(MeterInvocationConst.INVOCATION_NAME).getMeasurements().toString());
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestInvocationPublishModelFactory.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestInvocationPublishModelFactory.java
index e284533..fadabdc 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestInvocationPublishModelFactory.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestInvocationPublishModelFactory.java
@@ -20,10 +20,7 @@ import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
-import org.apache.servicecomb.foundation.common.utils.JsonUtils;
-import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
-import org.apache.servicecomb.metrics.core.DefaultRegistryInitializer;
+import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.apache.servicecomb.metrics.core.InvocationMetersInitializer;
 import org.apache.servicecomb.metrics.core.publish.model.DefaultPublishModel;
 import org.apache.servicecomb.swagger.invocation.InvocationType;
@@ -31,13 +28,13 @@ import org.apache.servicecomb.swagger.invocation.Response;
 import org.junit.Assert;
 import org.junit.Test;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.google.common.collect.Lists;
 import com.google.common.eventbus.EventBus;
 import com.netflix.spectator.api.DefaultRegistry;
 import com.netflix.spectator.api.ManualClock;
 import com.netflix.spectator.api.Registry;
 
+import io.vertx.core.json.Json;
 import mockit.Deencapsulation;
 import mockit.Expectations;
 import mockit.Mock;
@@ -47,10 +44,9 @@ import mockit.Mocked;
 public class TestInvocationPublishModelFactory {
   EventBus eventBus = new EventBus();
 
-  Registry registry = new DefaultRegistry(new ManualClock());
+  GlobalRegistry globalRegistry = new GlobalRegistry();
 
-  @Mocked
-  DefaultRegistryInitializer defaultRegistryInitializer;
+  Registry registry = new DefaultRegistry(new ManualClock());
 
   InvocationMetersInitializer invocationMetersInitializer = new 
InvocationMetersInitializer();
 
@@ -65,27 +61,264 @@ public class TestInvocationPublishModelFactory {
   InvocationType invocationType;
 
   @Test
-  public void createDefaultPublishModel() throws JsonProcessingException {
-    new Expectations(SPIServiceUtils.class) {
-      {
-        SPIServiceUtils.getTargetService(MetricsInitializer.class, 
DefaultRegistryInitializer.class);
-        result = defaultRegistryInitializer;
-        defaultRegistryInitializer.getRegistry();
-        result = registry;
-      }
-    };
-    invocationMetersInitializer.init(null, eventBus, null);
+  public void createDefaultPublishModel() {
+    globalRegistry.add(registry);
+    invocationMetersInitializer.init(globalRegistry, eventBus, null);
     prepareInvocation();
 
+    globalRegistry.poll(1);
     PublishModelFactory factory = new 
PublishModelFactory(Lists.newArrayList(registry.iterator()));
     DefaultPublishModel model = factory.createDefaultPublishModel();
 
-    Assert.assertEquals(
-        
"{\"operationPerfGroups\":{\"groups\":{\"rest\":{\"200\":{\"transport\":\"rest\",\"status\":\"200\",\"operationPerfs\":[{\"operation\":\"m.s.o\",\"stages\":{\"client_filters_request\":{\"tps\":1,\"msTotalTime\":1000.0,\"msMaxLatency\":0.0},\"prepare\":{\"tps\":1,\"msTotalTime\":1000.0,\"msMaxLatency\":0.0},\"consumer_send_request\":{\"tps\":1,\"msTotalTime\":2000.0,\"msMaxLatency\":0.0},\"total\":{\"tps\":1,\"msTotalTime\":14000.0,\"msMaxLatency\":0.0},\"handlers_request\":{\"tps
 [...]
-        JsonUtils.writeValueAsString(model.getConsumer()));
-    Assert.assertEquals(
-        
"{\"operationPerfGroups\":{\"groups\":{\"rest\":{\"200\":{\"transport\":\"rest\",\"status\":\"200\",\"operationPerfs\":[{\"operation\":\"m.s.o\",\"stages\":{\"server_filters_request\":{\"tps\":1,\"msTotalTime\":0.0,\"msMaxLatency\":0.0},\"prepare\":{\"tps\":1,\"msTotalTime\":5000.0,\"msMaxLatency\":0.0},\"execution\":{\"tps\":1,\"msTotalTime\":3000.0,\"msMaxLatency\":0.0},\"producer_send_response\":{\"tps\":1,\"msTotalTime\":2000.0,\"msMaxLatency\":0.0},\"total\":{\"tps\":1,\"msT
 [...]
-        JsonUtils.writeValueAsString(model.getProducer()));
+    String expect = "{\n"
+        + "  \"operationPerfGroups\" : {\n"
+        + "    \"groups\" : {\n"
+        + "      \"rest\" : {\n"
+        + "        \"200\" : {\n"
+        + "          \"transport\" : \"rest\",\n"
+        + "          \"status\" : \"200\",\n"
+        + "          \"operationPerfs\" : [ {\n"
+        + "            \"operation\" : \"m.s.o\",\n"
+        + "            \"stages\" : {\n"
+        + "              \"client_filters_request\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"prepare\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"consumer_send_request\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 2.0000000000000003E-6,\n"
+        + "                \"msMaxLatency\" : 2.0000000000000003E-6\n"
+        + "              },\n"
+        + "              \"total\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.4000000000000001E-5,\n"
+        + "                \"msMaxLatency\" : 1.4000000000000001E-5\n"
+        + "              },\n"
+        + "              \"handlers_request\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"client_filters_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"consumer_wait_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"handlers_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 3.0000000000000005E-6,\n"
+        + "                \"msMaxLatency\" : 3.0000000000000005E-6\n"
+        + "              },\n"
+        + "              \"consumer_get_connection\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"consumer_wake_consumer\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"consumer_write_to_buf\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              }\n"
+        + "            }\n"
+        + "          } ],\n"
+        + "          \"summary\" : {\n"
+        + "            \"operation\" : \"\",\n"
+        + "            \"stages\" : {\n"
+        + "              \"prepare\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"client_filters_request\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"total\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.4000000000000001E-5,\n"
+        + "                \"msMaxLatency\" : 1.4000000000000001E-5\n"
+        + "              },\n"
+        + "              \"consumer_send_request\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 2.0000000000000003E-6,\n"
+        + "                \"msMaxLatency\" : 2.0000000000000003E-6\n"
+        + "              },\n"
+        + "              \"handlers_request\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"handlers_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 3.0000000000000005E-6,\n"
+        + "                \"msMaxLatency\" : 3.0000000000000005E-6\n"
+        + "              },\n"
+        + "              \"consumer_wait_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"client_filters_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"consumer_get_connection\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"consumer_write_to_buf\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"consumer_wake_consumer\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              }\n"
+        + "            }\n"
+        + "          }\n"
+        + "        }\n"
+        + "      }\n"
+        + "    }\n"
+        + "  }\n"
+        + "}";
+    Assert.assertEquals(Json.encodePrettily(Json.decodeValue(expect, 
Object.class)),
+        Json.encodePrettily(model.getConsumer()));
+
+    expect = "{\n"
+        + "  \"operationPerfGroups\" : {\n"
+        + "    \"groups\" : {\n"
+        + "      \"rest\" : {\n"
+        + "        \"200\" : {\n"
+        + "          \"transport\" : \"rest\",\n"
+        + "          \"status\" : \"200\",\n"
+        + "          \"operationPerfs\" : [ {\n"
+        + "            \"operation\" : \"m.s.o\",\n"
+        + "            \"stages\" : {\n"
+        + "              \"server_filters_request\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 0.0,\n"
+        + "                \"msMaxLatency\" : 0.0\n"
+        + "              },\n"
+        + "              \"execution\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 3.0000000000000005E-6,\n"
+        + "                \"msMaxLatency\" : 3.0000000000000005E-6\n"
+        + "              },\n"
+        + "              \"prepare\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 5.0E-6,\n"
+        + "                \"msMaxLatency\" : 5.0E-6\n"
+        + "              },\n"
+        + "              \"producer_send_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 2.0000000000000003E-6,\n"
+        + "                \"msMaxLatency\" : 2.0000000000000003E-6\n"
+        + "              },\n"
+        + "              \"total\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.4000000000000001E-5,\n"
+        + "                \"msMaxLatency\" : 1.4000000000000001E-5\n"
+        + "              },\n"
+        + "              \"handlers_request\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 6.000000000000001E-6,\n"
+        + "                \"msMaxLatency\" : 6.000000000000001E-6\n"
+        + "              },\n"
+        + "              \"handlers_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"queue\" : {\n"
+        + "                \"tps\" : 0,\n"
+        + "                \"msTotalTime\" : 0.0,\n"
+        + "                \"msMaxLatency\" : 0.0\n"
+        + "              },\n"
+        + "              \"server_filters_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              }\n"
+        + "            }\n"
+        + "          } ],\n"
+        + "          \"summary\" : {\n"
+        + "            \"operation\" : \"\",\n"
+        + "            \"stages\" : {\n"
+        + "              \"server_filters_request\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 0.0,\n"
+        + "                \"msMaxLatency\" : 0.0\n"
+        + "              },\n"
+        + "              \"prepare\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 5.0E-6,\n"
+        + "                \"msMaxLatency\" : 5.0E-6\n"
+        + "              },\n"
+        + "              \"execution\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 3.0000000000000005E-6,\n"
+        + "                \"msMaxLatency\" : 3.0000000000000005E-6\n"
+        + "              },\n"
+        + "              \"total\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.4000000000000001E-5,\n"
+        + "                \"msMaxLatency\" : 1.4000000000000001E-5\n"
+        + "              },\n"
+        + "              \"producer_send_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 2.0000000000000003E-6,\n"
+        + "                \"msMaxLatency\" : 2.0000000000000003E-6\n"
+        + "              },\n"
+        + "              \"handlers_request\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 6.000000000000001E-6,\n"
+        + "                \"msMaxLatency\" : 6.000000000000001E-6\n"
+        + "              },\n"
+        + "              \"handlers_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              },\n"
+        + "              \"queue\" : {\n"
+        + "                \"tps\" : 0,\n"
+        + "                \"msTotalTime\" : 0.0,\n"
+        + "                \"msMaxLatency\" : 0.0\n"
+        + "              },\n"
+        + "              \"server_filters_response\" : {\n"
+        + "                \"tps\" : 1,\n"
+        + "                \"msTotalTime\" : 1.0000000000000002E-6,\n"
+        + "                \"msMaxLatency\" : 1.0000000000000002E-6\n"
+        + "              }\n"
+        + "            }\n"
+        + "          }\n"
+        + "        }\n"
+        + "      }\n"
+        + "    }\n"
+        + "  }\n"
+        + "}";
+    Assert.assertEquals(Json.encodePrettily(Json.decodeValue(expect, 
Object.class)),
+        Json.encodePrettily(model.getProducer()));
   }
 
   protected void prepareInvocation() {

Reply via email to