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 a8881743729273aca14884d107217edc68d8626e
Author: liubao <[email protected]>
AuthorDate: Fri Dec 1 14:47:20 2023 +0800

    [SCB-2838]using micrometer to replace spectator part7: use step histogram
---
 dependencies/default/pom.xml                       |   7 --
 .../metrics/publish/MeasurementTree.java           |  40 +++-----
 .../publish/spectator/TestMeasurementTree.java     |   4 +-
 .../metrics/core/MetricsCoreConfiguration.java     |   3 +-
 .../metrics/core/SimpleMeterRegistryExt.java       |  63 +++++++++++++
 ...nConst.java => StepDistributionSummaryExt.java} |  32 +++----
 .../meter/invocation/AbstractInvocationMeter.java  |  33 ++++---
 .../meter/invocation/MeterInvocationConst.java     |   2 +
 .../metrics/core/publish/PublishUtils.java         |   7 +-
 .../core/TestInvocationMetersInitializer.java      | 100 ++++++++++----------
 .../publish/TestInvocationPublishModelFactory.java | 105 +++++++++++----------
 .../metrics/core/publish/TestPublishUtils.java     |  12 +--
 .../model/invocation/TestOperationPerf.java        |   8 +-
 .../model/invocation/TestOperationPerfGroup.java   |   8 +-
 .../core/publish/model/invocation/Utils.java       |   3 +-
 15 files changed, 234 insertions(+), 193 deletions(-)

diff --git a/dependencies/default/pom.xml b/dependencies/default/pom.xml
index 74e5b9b3f..67cdfbfbd 100644
--- a/dependencies/default/pom.xml
+++ b/dependencies/default/pom.xml
@@ -89,7 +89,6 @@
     <servlet-api.version>6.0.0</servlet-api.version>
     <slf4j.version>1.7.36</slf4j.version>
     <snakeyaml.version>1.33</snakeyaml.version>
-    <spectator.version>1.7.3</spectator.version>
     <spring.version>6.0.9</spring.version>
     <spring-boot.version>3.0.7</spring-boot.version>
     <swagger.version>2.2.19</swagger.version>
@@ -189,12 +188,6 @@
         <version>${protobuf.version}</version>
       </dependency>
 
-      <dependency>
-        <groupId>com.netflix.spectator</groupId>
-        <artifactId>spectator-reg-servo</artifactId>
-        <version>${spectator.version}</version>
-      </dependency>
-
       <dependency>
         <groupId>com.squareup.okhttp3</groupId>
         <artifactId>okhttp</artifactId>
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/MeasurementTree.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/MeasurementTree.java
index 88e6eda69..a03c4739e 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/MeasurementTree.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/MeasurementTree.java
@@ -17,27 +17,21 @@
 package org.apache.servicecomb.foundation.metrics.publish;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
+import io.micrometer.core.instrument.DistributionSummary;
 import io.micrometer.core.instrument.Measurement;
 import io.micrometer.core.instrument.Meter;
 import io.micrometer.core.instrument.Meter.Id;
 import io.micrometer.core.instrument.Statistic;
 import io.micrometer.core.instrument.Tag;
-import io.micrometer.core.instrument.Timer;
 import io.micrometer.core.instrument.distribution.CountAtBucket;
 import io.micrometer.core.instrument.distribution.HistogramSnapshot;
 
 // like select * from meters group by ......
 // but output a tree not a table
 public class MeasurementTree extends MeasurementNode {
-  public static final String TAG_LATENCY_DISTRIBUTION = "latencyDistribution";
-
-  public static final String TAG_TYPE = "type";
-
   public MeasurementTree() {
     super(null, null, null);
   }
@@ -48,30 +42,18 @@ public class MeasurementTree extends MeasurementNode {
   // only id name exists in groupConfig will accept, others will be ignored
   public void from(Iterator<Meter> meters, MeasurementGroupConfig groupConfig) 
{
     meters.forEachRemaining(meter -> {
-      // This code snip is not very good design. But timer is quite special.
-      if (meter instanceof Timer timer) {
-        HistogramSnapshot snapshot = timer.takeSnapshot();
-        List<Measurement> summary = Arrays.asList(new 
Measurement(snapshot::count, Statistic.COUNT),
-            new Measurement(() -> snapshot.total(TimeUnit.MILLISECONDS), 
Statistic.TOTAL_TIME),
-            new Measurement(() -> snapshot.max(TimeUnit.MILLISECONDS), 
Statistic.MAX));
-        from(meter.getId(), summary, groupConfig);
-
+      // This code snip is not very good design. But DistributionSummary is 
quite special.
+      if (meter instanceof DistributionSummary distributionSummary) {
+        HistogramSnapshot snapshot = distributionSummary.takeSnapshot();
         CountAtBucket[] countAtBuckets = snapshot.histogramCounts();
-        if (countAtBuckets.length > 2) {
-          List<Measurement> distributions = new 
ArrayList<>(countAtBuckets.length);
-          for (int i = 0; i < countAtBuckets.length; i++) {
-            final int index = i;
-            if (index == 0) {
-              distributions.add(new Measurement(() -> 
countAtBuckets[index].count(),
-                  Statistic.COUNT));
-              continue;
-            }
-            distributions.add(new Measurement(() -> 
countAtBuckets[index].count() - countAtBuckets[index - 1].count(),
-                Statistic.COUNT));
-          }
-
-          from(meter.getId().withTag(Tag.of(TAG_TYPE, 
TAG_LATENCY_DISTRIBUTION)), distributions, groupConfig);
+        List<Measurement> distributions = new 
ArrayList<>(countAtBuckets.length);
+        for (CountAtBucket countAtBucket : countAtBuckets) {
+          final double value = countAtBucket.count();
+          distributions.add(new Measurement(() -> value,
+              Statistic.COUNT));
         }
+
+        from(meter.getId(), distributions, groupConfig);
         return;
       }
 
diff --git 
a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TestMeasurementTree.java
 
b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TestMeasurementTree.java
index 234147a1f..d21354be5 100644
--- 
a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TestMeasurementTree.java
+++ 
b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TestMeasurementTree.java
@@ -54,8 +54,8 @@ public class TestMeasurementTree {
 
   @Test
   public void from() {
-    timer.record(10, TimeUnit.MILLISECONDS);
-    timer.record(2, TimeUnit.MILLISECONDS);
+    timer.record(10, TimeUnit.SECONDS);
+    timer.record(2, TimeUnit.SECONDS);
 
     MeasurementGroupConfig config = new MeasurementGroupConfig("id", "g1", 
"g2");
     tree.from(registry.getMeters().iterator(), config);
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java
index 661fc7a1d..338b2183d 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java
@@ -31,7 +31,6 @@ import org.springframework.core.env.Environment;
 import io.micrometer.core.instrument.Clock;
 import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.simple.CountingMode;
-import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
 
 @Configuration
 public class MetricsCoreConfiguration {
@@ -43,7 +42,7 @@ public class MetricsCoreConfiguration {
   @Bean
   @ConditionalOnMissingBean
   public MeterRegistry meterRegistry(MetricsBootstrapConfig config) {
-    return new SimpleMeterRegistry(s -> {
+    return new SimpleMeterRegistryExt(s -> {
       if ("simple.step".equals(s)) {
         return Duration.ofMillis(config.getMsPollInterval()).toString();
       }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/SimpleMeterRegistryExt.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/SimpleMeterRegistryExt.java
new file mode 100644
index 000000000..592ec2af1
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/SimpleMeterRegistryExt.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicecomb.metrics.core;
+
+import io.micrometer.core.instrument.Clock;
+import io.micrometer.core.instrument.DistributionSummary;
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.cumulative.CumulativeDistributionSummary;
+import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
+import io.micrometer.core.instrument.distribution.HistogramGauges;
+import io.micrometer.core.instrument.distribution.StepBucketHistogram;
+import io.micrometer.core.instrument.simple.SimpleConfig;
+import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+
+/**
+ * Custom SimpleMeterRegistry to support StepDistributionSummary
+ */
+public class SimpleMeterRegistryExt extends SimpleMeterRegistry {
+  private final SimpleConfig config;
+
+  public SimpleMeterRegistryExt(SimpleConfig config, Clock clock) {
+    super(config, clock);
+    this.config = config;
+  }
+
+  @Override
+  protected DistributionSummary newDistributionSummary(Meter.Id id,
+      DistributionStatisticConfig distributionStatisticConfig, double scale) {
+    DistributionStatisticConfig merged = distributionStatisticConfig
+        
.merge(DistributionStatisticConfig.builder().expiry(config.step()).build());
+
+    DistributionSummary summary;
+    switch (config.mode()) {
+      case CUMULATIVE:
+        summary = new CumulativeDistributionSummary(id, clock, merged, scale, 
false);
+        break;
+      case STEP:
+      default:
+        summary = new StepDistributionSummaryExt(id, clock, merged, scale, 
config.step().toMillis(),
+            new StepBucketHistogram(clock, config.step().toMillis(), 
distributionStatisticConfig,
+                false, false));
+        break;
+    }
+
+    HistogramGauges.registerWithCommonFormat(summary, this);
+
+    return summary;
+  }
+}
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/StepDistributionSummaryExt.java
similarity index 55%
copy from 
metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/MeterInvocationConst.java
copy to 
metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/StepDistributionSummaryExt.java
index fac87d55e..519f903a7 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/StepDistributionSummaryExt.java
@@ -14,23 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.servicecomb.metrics.core.meter.invocation;
-
-public interface MeterInvocationConst {
-  String INVOCATION_NAME = "servicecomb.invocation";
-
-  // consumer or producer
-  String TAG_ROLE = "role";
-
-  String TAG_OPERATION = "operation";
-
-  String TAG_TRANSPORT = "transport";
-
-  String TAG_TYPE = "type";
-
-  String TAG_STAGE = "stage";
-
-  String TAG_STATUS = "status";
-
-  String EDGE_INVOCATION_NAME = "EDGE";
+package org.apache.servicecomb.metrics.core;
+
+import io.micrometer.core.instrument.Clock;
+import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
+import io.micrometer.core.instrument.distribution.Histogram;
+import io.micrometer.core.instrument.step.StepDistributionSummary;
+
+public class StepDistributionSummaryExt extends StepDistributionSummary {
+  public StepDistributionSummaryExt(Id id, Clock clock,
+      DistributionStatisticConfig distributionStatisticConfig, double scale, 
long stepMillis,
+      Histogram histogram) {
+    super(id, clock, distributionStatisticConfig, scale, stepMillis, 
histogram);
+  }
 }
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 1ced47feb..e0bb9d549 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
@@ -25,11 +25,15 @@ import 
org.apache.servicecomb.core.invocation.InvocationStageTrace;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import 
org.apache.servicecomb.foundation.metrics.meter.LatencyDistributionConfig;
 
+import io.micrometer.core.instrument.DistributionSummary;
 import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.Tags;
 import io.micrometer.core.instrument.Timer;
 
 public abstract class AbstractInvocationMeter {
+  // total time distribution
+  private final DistributionSummary totalSummary;
+
   //total time
   private final Timer totalTimer;
 
@@ -42,22 +46,24 @@ public abstract class AbstractInvocationMeter {
       MetricsBootstrapConfig metricsBootstrapConfig) {
     this.metricsBootstrapConfig = metricsBootstrapConfig;
 
-    Timer.Builder totalBuilder = Timer.builder(name)
-        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
-            MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_TOTAL));
     if (!StringUtils.isEmpty(metricsBootstrapConfig.getLatencyDistribution())) 
{
-      
totalBuilder.sla(toDuration(metricsBootstrapConfig.getLatencyDistribution()))
-          
.distributionStatisticExpiry(Duration.ofMillis(metricsBootstrapConfig.getMsPollInterval()));
+      totalSummary = DistributionSummary.builder(name)
+          .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_DISTRIBUTION))
+          
.distributionStatisticExpiry(Duration.ofMillis(metricsBootstrapConfig.getMsPollInterval()))
+          
.serviceLevelObjectives(toSla(metricsBootstrapConfig.getLatencyDistribution())).register(meterRegistry);
+    } else {
+      totalSummary = null;
     }
-    this.totalTimer = totalBuilder.register(meterRegistry);
+    this.totalTimer = 
Timer.builder(name).tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE
+        , MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_TOTAL)).register(meterRegistry);
     this.prepareTimer = 
Timer.builder(name).tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE
         , MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_PREPARE)).register(meterRegistry);
   }
 
-  protected static Duration[] toDuration(String config) {
+  protected static double[] toSla(String config) {
     config = config.trim() + "," + LatencyDistributionConfig.MAX_LATENCY;
     String[] array = config.split("\\s*,+\\s*");
-    Duration[] result = new Duration[array.length];
+    double[] result = new double[array.length];
 
     for (int idx = 0; idx < array.length - 1; idx++) {
       long msMin = Long.parseLong(array[idx]);
@@ -67,12 +73,12 @@ public abstract class AbstractInvocationMeter {
         throw new IllegalStateException(msg);
       }
 
-      result[idx] = Duration.ofMillis(msMin);
+      result[idx] = msMin;
     }
-    result[array.length - 1] = 
Duration.ofMillis(LatencyDistributionConfig.MAX_LATENCY);
+    result[array.length - 1] = LatencyDistributionConfig.MAX_LATENCY;
 
-    if (result[0].toMillis() == 0) {
-      Duration[] target = new Duration[result.length - 1];
+    if (Double.compare(0, result[0]) == 0) {
+      double[] target = new double[result.length - 1];
       System.arraycopy(result, 1, target, 0, target.length);
       return target;
     }
@@ -84,5 +90,8 @@ public abstract class AbstractInvocationMeter {
     InvocationStageTrace stageTrace = 
event.getInvocation().getInvocationStageTrace();
     totalTimer.record(stageTrace.calcTotal(), TimeUnit.NANOSECONDS);
     prepareTimer.record(stageTrace.calcPrepare(), TimeUnit.NANOSECONDS);
+    if (totalSummary != null) {
+      
totalSummary.record(TimeUnit.NANOSECONDS.toMillis(stageTrace.calcTotal()));
+    }
   }
 }
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 fac87d55e..2a377e432 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
@@ -30,6 +30,8 @@ public interface MeterInvocationConst {
 
   String TAG_STAGE = "stage";
 
+  String TAG_DISTRIBUTION = "distribution";
+
   String TAG_STATUS = "status";
 
   String EDGE_INVOCATION_NAME = "EDGE";
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java
index 9bf2cb6f9..9c761aaa5 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java
@@ -20,7 +20,6 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.servicecomb.foundation.metrics.publish.MeasurementNode;
-import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst;
 import 
org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerf;
 import 
org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroup;
@@ -36,8 +35,8 @@ public final class PublishUtils {
   public static PerfInfo createPerfInfo(MeasurementNode stageNode) {
     PerfInfo perfInfo = new PerfInfo();
     
perfInfo.setTotalRequests(stageNode.findChild(Statistic.COUNT.name()).summary());
-    
perfInfo.setMsTotalTime(stageNode.findChild(Statistic.TOTAL_TIME.name()).summary());
-    
perfInfo.setMsMaxLatency(stageNode.findChild(Statistic.MAX.name()).summary());
+    
perfInfo.setMsTotalTime(stageNode.findChild(Statistic.TOTAL_TIME.name()).summary()
 * 1000);
+    
perfInfo.setMsMaxLatency(stageNode.findChild(Statistic.MAX.name()).summary() * 
1000);
     return perfInfo;
   }
 
@@ -51,7 +50,7 @@ public final class PublishUtils {
       operationPerf.getStages().put(mNode.getName(), perfInfo);
     });
 
-    MeasurementNode latencyNode = 
statusNode.findChild(MeasurementTree.TAG_LATENCY_DISTRIBUTION);
+    MeasurementNode latencyNode = 
statusNode.findChild(MeterInvocationConst.TAG_DISTRIBUTION);
     if (latencyNode != null && latencyNode.getMeasurements() != null) {
       
operationPerf.setLatencyDistribution(latencyNode.getMeasurements().stream()
           .map(m -> (int) m.getValue())
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 09963b4e4..8705f89d1 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
@@ -110,9 +110,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"prepare")
         .getMeasurements();
@@ -120,9 +120,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"consumer-send")
         .getMeasurements();
@@ -130,9 +130,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.0E-5");
+        "statistic='TOTAL_TIME', value=1.0E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=5.0E-6");
+        "statistic='MAX', value=5.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"connection")
         .getMeasurements();
@@ -140,9 +140,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"consumer-encode")
         .getMeasurements();
@@ -151,9 +151,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=8.0E-6");
+        "statistic='TOTAL_TIME', value=8.0E-9");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=4.0E-6");
+        "statistic='MAX', value=4.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"connection")
         .getMeasurements();
@@ -161,9 +161,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "wait")
         .getMeasurements();
@@ -171,9 +171,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"consumer-decode")
         .getMeasurements();
@@ -181,9 +181,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
   }
 
   @Test
@@ -236,9 +236,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"prepare")
         .getMeasurements();
@@ -246,9 +246,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"consumer-send")
         .getMeasurements();
@@ -256,9 +256,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.0E-5");
+        "statistic='TOTAL_TIME', value=1.0E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=5.0E-6");
+        "statistic='MAX', value=5.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"connection")
         .getMeasurements();
@@ -266,9 +266,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"consumer-encode")
         .getMeasurements();
@@ -276,9 +276,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=8.0E-6");
+        "statistic='TOTAL_TIME', value=8.0E-9");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=4.0E-6");
+        "statistic='MAX', value=4.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "wait")
         .getMeasurements();
@@ -286,9 +286,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"consumer-decode")
         .getMeasurements();
@@ -296,9 +296,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.6E-5");
+        "statistic='TOTAL_TIME', value=1.6E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=8.0E-6");
+        "statistic='MAX', value=8.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"provider-decode")
         .getMeasurements();
@@ -306,9 +306,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"provider-encode")
         .getMeasurements();
@@ -316,9 +316,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"provider-send")
         .getMeasurements();
@@ -326,9 +326,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
   }
 
   @Test
@@ -375,9 +375,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"prepare")
         .getMeasurements();
@@ -385,9 +385,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"queue")
         .getMeasurements();
@@ -395,9 +395,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"execute")
         .getMeasurements();
@@ -405,9 +405,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"provider-decode")
         .getMeasurements();
@@ -415,9 +415,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"provider-encode")
         .getMeasurements();
@@ -425,9 +425,9 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
 
     measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, 
"provider-send")
         .getMeasurements();
@@ -435,8 +435,8 @@ public class TestInvocationMetersInitializer {
     AssertUtil.assertMeasure(measurements, 0,
         "statistic='COUNT', value=2.0");
     AssertUtil.assertMeasure(measurements, 1,
-        "statistic='TOTAL_TIME', value=1.8E-5");
+        "statistic='TOTAL_TIME', value=1.8E-8");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-6");
+        "statistic='MAX', value=9.0E-9");
   }
 }
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 d0310e48c..8473f0434 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
@@ -44,6 +44,7 @@ import io.vertx.core.json.Json;
 public class TestInvocationPublishModelFactory {
   EventBus eventBus = new EventBus();
 
+  // not step mode.
   MeterRegistry meterRegistry = new SimpleMeterRegistry();
 
   InvocationMetersInitializer invocationMetersInitializer = new 
InvocationMetersInitializer();
@@ -86,18 +87,18 @@ public class TestInvocationPublishModelFactory {
                       "stages" : {
                         "consumer-encode" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         },
                         "prepare" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         },
                         "wait" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         },
                         "total" : {
                           "totalRequests" : 1.0,
@@ -106,34 +107,34 @@ public class TestInvocationPublishModelFactory {
                         },
                         "consumer-send" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         },
                         "connection" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         },
                         "consumer-decode" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         }
                       },
-                      "latencyDistribution" : [ 1, 0, 0 ]
+                      "latencyDistribution" : [ 1, 1, 1 ]
                     } ],
                     "summary" : {
                       "operation" : "",
                       "stages" : {
                         "consumer-encode" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         },
                         "prepare" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         },
                         "total" : {
                           "totalRequests" : 1.0,
@@ -142,26 +143,26 @@ public class TestInvocationPublishModelFactory {
                         },
                         "wait" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         },
                         "consumer-send" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         },
                         "connection" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         },
                         "consumer-decode" : {
                           "totalRequests" : 1.0,
-                          "msTotalTime" : 1.0E-6,
-                          "msMaxLatency" : 1.0E-6
+                          "msTotalTime" : 1.0000000000000002E-6,
+                          "msMaxLatency" : 1.0000000000000002E-6
                         }
                       },
-                      "latencyDistribution" : [ 1, 0, 0 ]
+                      "latencyDistribution" : [ 1, 1, 1 ]
                     }
                   }
                 }
@@ -185,18 +186,18 @@ public class TestInvocationPublishModelFactory {
                     "stages" : {
                       "consumer-encode" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       },
                       "prepare" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       },
                       "wait" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       },
                       "total" : {
                         "totalRequests" : 1.0,
@@ -205,34 +206,34 @@ public class TestInvocationPublishModelFactory {
                       },
                       "consumer-send" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       },
                       "connection" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       },
                       "consumer-decode" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       }
                     },
-                    "latencyDistribution" : [ 1, 0, 0 ]
+                    "latencyDistribution" : [ 1, 1, 1 ]
                   } ],
                   "summary" : {
                     "operation" : "",
                     "stages" : {
                       "consumer-encode" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       },
                       "prepare" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       },
                       "total" : {
                         "totalRequests" : 1.0,
@@ -241,26 +242,26 @@ public class TestInvocationPublishModelFactory {
                       },
                       "wait" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       },
                       "consumer-send" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       },
                       "connection" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       },
                       "consumer-decode" : {
                         "totalRequests" : 1.0,
-                        "msTotalTime" : 1.0E-6,
-                        "msMaxLatency" : 1.0E-6
+                        "msTotalTime" : 1.0000000000000002E-6,
+                        "msMaxLatency" : 1.0000000000000002E-6
                       }
                     },
-                    "latencyDistribution" : [ 1, 0, 0 ]
+                    "latencyDistribution" : [ 1, 1, 1 ]
                   }
                 }
               }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestPublishUtils.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestPublishUtils.java
index 66fb62f2f..cb4508337 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestPublishUtils.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestPublishUtils.java
@@ -44,8 +44,8 @@ public class TestPublishUtils {
     PerfInfo perf = PublishUtils.createPerfInfo(stageNode);
 
     Assertions.assertEquals(10, perf.getTotalRequests(), 0);
-    Assertions.assertEquals(1, perf.calcMsLatency(), 0);
-    Assertions.assertEquals(100, perf.getMsMaxLatency(), 0);
+    Assertions.assertEquals(1000, perf.calcMsLatency(), 0);
+    Assertions.assertEquals(100000, perf.getMsMaxLatency(), 0);
   }
 
   @Test
@@ -55,8 +55,8 @@ public class TestPublishUtils {
     PerfInfo perfInfo = opPerf.findStage(InvocationStageTrace.STAGE_TOTAL);
     Integer[] latencyDistribution = opPerf.getLatencyDistribution();
     Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0);
-    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
     Assertions.assertEquals(2, latencyDistribution.length);
     Assertions.assertEquals(1, latencyDistribution[0].intValue());
     Assertions.assertEquals(2, latencyDistribution[1].intValue());
@@ -76,8 +76,8 @@ public class TestPublishUtils {
     PerfInfo perfInfo = 
group.getSummary().findStage(InvocationStageTrace.STAGE_TOTAL);
     Integer[] latencyDistribution = 
group.getSummary().getLatencyDistribution();
     Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0);
-    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
     Assertions.assertEquals(2, latencyDistribution.length);
     Assertions.assertEquals(1, latencyDistribution[0].intValue());
     Assertions.assertEquals(2, latencyDistribution[1].intValue());
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerf.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerf.java
index 2090f21a8..f5948016c 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerf.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerf.java
@@ -36,12 +36,12 @@ public class TestOperationPerf {
 
     PerfInfo perfInfo = opPerf.findStage(InvocationStageTrace.STAGE_TOTAL);
     Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0);
-    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
 
     perfInfo = opPerf.findStage(InvocationStageTrace.STAGE_PROVIDER_BUSINESS);
     Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0);
-    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerfGroup.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerfGroup.java
index 9f4fa492f..7dda01408 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerfGroup.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerfGroup.java
@@ -48,12 +48,12 @@ public class TestOperationPerfGroup {
 
     PerfInfo perfInfo = summary.findStage(InvocationStageTrace.STAGE_TOTAL);
     Assertions.assertEquals(20, perfInfo.getTotalRequests(), 0);
-    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
 
     perfInfo = summary.findStage(InvocationStageTrace.STAGE_PROVIDER_BUSINESS);
     Assertions.assertEquals(20, perfInfo.getTotalRequests(), 0);
-    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/Utils.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/Utils.java
index c48a1b5b6..17a62c575 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/Utils.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/Utils.java
@@ -21,7 +21,6 @@ import java.util.List;
 
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
 import org.apache.servicecomb.foundation.metrics.publish.MeasurementNode;
-import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst;
 import org.apache.servicecomb.metrics.core.publish.PublishUtils;
 
@@ -61,7 +60,7 @@ public class Utils {
     Id id = initId;
     MeasurementNode statusNode = new MeasurementNode(status, id, new 
HashMap<>());
     MeasurementNode typeNode = new 
MeasurementNode(MeterInvocationConst.TAG_STAGE, id, new HashMap<>());
-    MeasurementNode latencyNode = new 
MeasurementNode(MeasurementTree.TAG_LATENCY_DISTRIBUTION, id,
+    MeasurementNode latencyNode = new 
MeasurementNode(MeterInvocationConst.TAG_DISTRIBUTION, id,
         new HashMap<>());
     List<Measurement> measurements = latencyNode.getMeasurements();
     measurements.add(new Measurement(() -> 1, Statistic.VALUE));

Reply via email to