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 26b990fd5ce9b0a91e65379e892739bdbf7cb87d
Author: liubao <[email protected]>
AuthorDate: Fri Dec 1 09:13:04 2023 +0800

    [SCB-2838]using micrometer to replace spectator part6: thread pool and 
endpoint improvement
---
 .../metrics/publish/MeasurementTree.java           |  31 +-
 .../publish/spectator/TestMeasurementTree.java     |   4 +-
 .../monitor/MetricsMonitorDataProvider.java        |  26 +-
 .../metrics/core/MetricsCoreConfiguration.java     |   2 +
 .../metrics/core/ThreadPoolMetersInitializer.java  |  54 +--
 .../ThreadPoolMonitorPublishModelFactory.java      |  52 ++-
 .../meter/invocation/AbstractInvocationMeter.java  |   3 +-
 .../meter/invocation/MeterInvocationConst.java     |   6 -
 .../metrics/core/meter/pool/ThreadPoolMeter.java   | 102 ++++++
 .../metrics/core/meter/vertx/EndpointMeter.java    |   2 +-
 .../metrics/core/publish/DefaultLogPublisher.java  |  55 ++-
 .../metrics/core/publish/PublishModelFactory.java  |  12 +-
 .../metrics/core/publish/PublishUtils.java         |  13 +-
 .../core/publish/model/invocation/PerfInfo.java    |  16 +-
 .../core/TestInvocationMetersInitializer.java      | 100 +++---
 .../core/TestThreadPoolMetersInitializer.java      |  30 +-
 .../core/publish/TestDefaultLogPublisher.java      |  17 +-
 .../publish/TestInvocationPublishModelFactory.java | 372 ++++++++++-----------
 .../metrics/core/publish/TestPublishUtils.java     |  27 +-
 .../publish/TestThreadPoolPublishModelFactory.java |   7 +-
 .../model/invocation/TestOperationPerf.java        |  12 +-
 .../model/invocation/TestOperationPerfGroup.java   |  12 +-
 .../publish/model/invocation/TestPerfInfo.java     |  16 +-
 .../core/publish/model/invocation/Utils.java       |   3 +-
 24 files changed, 521 insertions(+), 453 deletions(-)

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 440900e4f..88e6eda69 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,8 +17,10 @@
 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.Measurement;
 import io.micrometer.core.instrument.Meter;
@@ -46,28 +48,35 @@ 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 -> {
-      Iterable<Measurement> measurements = meter.measure();
-      from(meter.getId(), measurements, groupConfig);
-
       // This code snip is not very good design. But timer is quite special.
-      if (meter instanceof Timer) {
-        HistogramSnapshot snapshot = ((Timer) meter).takeSnapshot();
+      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);
+
         CountAtBucket[] countAtBuckets = snapshot.histogramCounts();
         if (countAtBuckets.length > 2) {
-          List<Measurement> latency = new ArrayList<>(countAtBuckets.length);
+          List<Measurement> distributions = new 
ArrayList<>(countAtBuckets.length);
           for (int i = 0; i < countAtBuckets.length; i++) {
             final int index = i;
             if (index == 0) {
-              latency.add(new Measurement(() -> countAtBuckets[index].count(),
-                  Statistic.VALUE));
+              distributions.add(new Measurement(() -> 
countAtBuckets[index].count(),
+                  Statistic.COUNT));
               continue;
             }
-            latency.add(new Measurement(() -> countAtBuckets[index].count() - 
countAtBuckets[index - 1].count(),
-                Statistic.VALUE));
+            distributions.add(new Measurement(() -> 
countAtBuckets[index].count() - countAtBuckets[index - 1].count(),
+                Statistic.COUNT));
           }
-          from(meter.getId().withTag(Tag.of(TAG_TYPE, 
TAG_LATENCY_DISTRIBUTION)), latency, groupConfig);
+
+          from(meter.getId().withTag(Tag.of(TAG_TYPE, 
TAG_LATENCY_DISTRIBUTION)), distributions, groupConfig);
         }
+        return;
       }
+
+      Iterable<Measurement> measurements = meter.measure();
+      from(meter.getId(), measurements, groupConfig);
     });
   }
 
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 d21354be5..234147a1f 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.SECONDS);
-    timer.record(2, TimeUnit.SECONDS);
+    timer.record(10, TimeUnit.MILLISECONDS);
+    timer.record(2, TimeUnit.MILLISECONDS);
 
     MeasurementGroupConfig config = new MeasurementGroupConfig("id", "g1", 
"g2");
     tree.from(registry.getMeters().iterator(), config);
diff --git 
a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java
 
b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java
index 4829fb22a..ed54eef34 100644
--- 
a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java
+++ 
b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java
@@ -140,16 +140,16 @@ public class MetricsMonitorDataProvider implements 
MonitorDataProvider {
               });
           // dashboard calculates the latest 10 seconds, different with 
metrics cycle.
           interfaceInfo.setTotal(
-              doubleToInt(interfaceInfo.getTotal() + 10 * 
stageTotal.getTps()));
+              doubleToInt(interfaceInfo.getTotal() + 
stageTotal.getTotalRequests()));
           if (perfGroup.getStatus().matches(CODE_SUCCESS)) {
-            interfaceInfo.setQps(stageTotal.getTps());
+            interfaceInfo.setQps(stageTotal.getTotalRequests() / 10);
             interfaceInfo.setLatency(doubleToInt(stageTotal.calcMsLatency()));
           } else {
             interfaceInfo.setFailure(
-                doubleToInt(interfaceInfo.getTotal() + 
stageTotal.getMsTotalTime() * stageTotal.getTps()));
+                doubleToInt(interfaceInfo.getTotal() + 
stageTotal.getTotalRequests()));
             if (perfGroup.getStatus().equals(CODE_TIMEOUT)) {
               interfaceInfo.setCountTimeout(
-                  doubleToInt(interfaceInfo.getCountTimeout() + 
stageTotal.getMsTotalTime() * stageTotal.getTps()));
+                  doubleToInt(interfaceInfo.getCountTimeout() + 
stageTotal.getTotalRequests()));
             }
           }
         }
@@ -176,16 +176,17 @@ public class MetricsMonitorDataProvider implements 
MonitorDataProvider {
               });
           // dashboard calculates the latest 10 seconds, different with 
metrics cycle.
           interfaceInfo.setTotal(
-              doubleToInt(interfaceInfo.getTotal() + 10 * 
stageTotal.getTps()));
+              doubleToInt(interfaceInfo.getTotal() + 
stageTotal.getTotalRequests()));
           if (perfGroup.getStatus().matches(CODE_SUCCESS)) {
-            interfaceInfo.setQps(stageTotal.getTps());
+            interfaceInfo.setQps(stageTotal.getTotalRequests() / 10);
             interfaceInfo.setLatency(doubleToInt(stageTotal.calcMsLatency()));
           } else {
             interfaceInfo.setFailure(
-                doubleToInt(interfaceInfo.getTotal() + 
stageTotal.getMsTotalTime() * stageTotal.getTps()));
+                doubleToInt(interfaceInfo.getTotal() + 
stageTotal.getTotalRequests()));
             if (perfGroup.getStatus().equals(CODE_TIMEOUT)) {
               interfaceInfo.setCountTimeout(
-                  doubleToInt(interfaceInfo.getCountTimeout() + 
stageTotal.getMsTotalTime() * stageTotal.getTps()));
+                  doubleToInt(
+                      interfaceInfo.getCountTimeout() + 
stageTotal.getTotalRequests()));
             }
           }
         }
@@ -212,16 +213,17 @@ public class MetricsMonitorDataProvider implements 
MonitorDataProvider {
               });
           // dashboard calculates the latest 10 seconds, different with 
metrics cycle.
           interfaceInfo.setTotal(
-              doubleToInt(interfaceInfo.getTotal() + 10 * 
stageTotal.getTps()));
+              doubleToInt(interfaceInfo.getTotal() + 
stageTotal.getTotalRequests()));
           if (perfGroup.getStatus().matches(CODE_SUCCESS)) {
-            interfaceInfo.setQps(stageTotal.getTps());
+            interfaceInfo.setQps(stageTotal.getTotalRequests() / 10);
             interfaceInfo.setLatency(doubleToInt(stageTotal.calcMsLatency()));
           } else {
             interfaceInfo.setFailure(
-                doubleToInt(interfaceInfo.getTotal() + 
stageTotal.getMsTotalTime() * stageTotal.getTps()));
+                doubleToInt(interfaceInfo.getTotal() + 
stageTotal.getTotalRequests()));
             if (perfGroup.getStatus().equals(CODE_TIMEOUT)) {
               interfaceInfo.setCountTimeout(
-                  doubleToInt(interfaceInfo.getCountTimeout() + 
stageTotal.getMsTotalTime() * stageTotal.getTps()));
+                  doubleToInt(
+                      interfaceInfo.getCountTimeout() + 
stageTotal.getTotalRequests()));
             }
           }
         }
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 f0e05ae00..661fc7a1d 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
@@ -23,6 +23,7 @@ import 
org.apache.servicecomb.foundation.metrics.MetricsBootstrap;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import org.apache.servicecomb.metrics.core.publish.DefaultLogPublisher;
 import org.apache.servicecomb.metrics.core.publish.SlowInvocationLogger;
+import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.env.Environment;
@@ -40,6 +41,7 @@ public class MetricsCoreConfiguration {
   }
 
   @Bean
+  @ConditionalOnMissingBean
   public MeterRegistry meterRegistry(MetricsBootstrapConfig config) {
     return new SimpleMeterRegistry(s -> {
       if ("simple.step".equals(s)) {
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java
index a2a307b4a..9ada12258 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java
@@ -16,6 +16,7 @@
  */
 package org.apache.servicecomb.metrics.core;
 
+import java.util.HashMap;
 import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -26,37 +27,21 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.executor.GroupExecutor;
-import org.apache.servicecomb.core.executor.ThreadPoolExecutorEx;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
+import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
+import org.apache.servicecomb.metrics.core.meter.pool.ThreadPoolMeter;
 
 import com.google.common.eventbus.EventBus;
 
-import io.micrometer.core.instrument.Gauge;
 import io.micrometer.core.instrument.MeterRegistry;
 
-public class ThreadPoolMetersInitializer implements MetricsInitializer {
-  public static final String ID = "id";
-
-  public static final String REJECTED_COUNT = "threadpool.rejectedCount";
-
-  public static final String TASK_COUNT = "threadpool.taskCount";
-
-  public static final String COMPLETED_TASK_COUNT = 
"threadpool.completedTaskCount";
-
-  public static final String CURRENT_THREADS_BUSY = 
"threadpool.currentThreadsBusy";
-
-  public static final String MAX_THREADS = "threadpool.maxThreads";
-
-  public static final String POOL_SIZE = "threadpool.poolSize";
-
-  public static final String CORE_POOL_SIZE = "threadpool.corePoolSize";
-
-  public static final String QUEUE_SIZE = "threadpool.queueSize";
-
+public class ThreadPoolMetersInitializer implements MetricsInitializer, 
PeriodMeter {
   private MeterRegistry meterRegistry;
 
+  private Map<String, ThreadPoolMeter> threadPoolMeters = new HashMap<>();
+
   @Override
   public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
     this.meterRegistry = meterRegistry;
@@ -106,25 +91,12 @@ public class ThreadPoolMetersInitializer implements 
MetricsInitializer {
       return;
     }
 
-    Gauge.builder(TASK_COUNT, threadPoolExecutor::getTaskCount).tags(ID, 
threadPoolName)
-        .register(meterRegistry);
-    Gauge.builder(COMPLETED_TASK_COUNT, 
threadPoolExecutor::getCompletedTaskCount).tags(ID, threadPoolName)
-        .register(meterRegistry);
-    Gauge.builder(CURRENT_THREADS_BUSY, 
threadPoolExecutor::getActiveCount).tags(ID, threadPoolName)
-        .register(meterRegistry);
-    Gauge.builder(MAX_THREADS, 
threadPoolExecutor::getMaximumPoolSize).tags(ID, threadPoolName)
-        .register(meterRegistry);
-    Gauge.builder(POOL_SIZE, threadPoolExecutor::getPoolSize).tags(ID, 
threadPoolName)
-        .register(meterRegistry);
-    Gauge.builder(CORE_POOL_SIZE, 
threadPoolExecutor::getCorePoolSize).tags(ID, threadPoolName)
-        .register(meterRegistry);
-    Gauge.builder(QUEUE_SIZE, () -> 
threadPoolExecutor.getQueue().size()).tags(ID, threadPoolName)
-        .register(meterRegistry);
-
-    if (executor instanceof ThreadPoolExecutorEx) {
-      Gauge.builder(REJECTED_COUNT, () -> ((ThreadPoolExecutorEx) 
(executor)).getRejectedCount())
-          .tags(ID, threadPoolName)
-          .register(meterRegistry);
-    }
+    threadPoolMeters.computeIfAbsent(threadPoolName,
+        (key) -> new ThreadPoolMeter(meterRegistry, threadPoolName, 
threadPoolExecutor));
+  }
+
+  @Override
+  public void poll(long msNow, long secondInterval) {
+    threadPoolMeters.forEach((key, value) -> value.poll(msNow, 
secondInterval));
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ThreadPoolMonitorPublishModelFactory.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ThreadPoolMonitorPublishModelFactory.java
index 003989087..d0474142c 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ThreadPoolMonitorPublishModelFactory.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ThreadPoolMonitorPublishModelFactory.java
@@ -16,11 +16,12 @@
  */
 package org.apache.servicecomb.metrics.core.meter;
 
+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.ThreadPoolMetersInitializer;
+import org.apache.servicecomb.metrics.core.meter.pool.ThreadPoolMeter;
 import 
org.apache.servicecomb.metrics.core.publish.model.ThreadPoolPublishModel;
 
 import io.micrometer.core.instrument.Measurement;
@@ -30,54 +31,41 @@ public class ThreadPoolMonitorPublishModelFactory {
     void set(ThreadPoolPublishModel model, Measurement measurement);
   }
 
-  private final MeasurementTree tree;
-
-  private final Map<String, ThreadPoolPublishModel> threadPools;
-
-  public ThreadPoolMonitorPublishModelFactory(MeasurementTree tree,
-      Map<String, ThreadPoolPublishModel> threadPools) {
-    this.tree = tree;
-    this.threadPools = threadPools;
-  }
-
-  public static void create(MeasurementTree tree,
-      Map<String, ThreadPoolPublishModel> threadPools) {
-    new ThreadPoolMonitorPublishModelFactory(tree, threadPools).create();
-  }
-
-  public void create() {
-    readMeasurement(ThreadPoolMetersInitializer.TASK_COUNT,
+  public static Map<String, ThreadPoolPublishModel> create(MeasurementTree 
tree) {
+    Map<String, ThreadPoolPublishModel> result = new HashMap<>(8);
+    readMeasurement(result, tree, ThreadPoolMeter.TASK_COUNT,
         (model, measurement) -> model.setAvgTaskCount(measurement.getValue()));
-    readMeasurement(ThreadPoolMetersInitializer.COMPLETED_TASK_COUNT,
+    readMeasurement(result, tree, ThreadPoolMeter.COMPLETED_TASK_COUNT,
         (model, measurement) -> 
model.setAvgCompletedTaskCount(measurement.getValue()));
-    readMeasurement(ThreadPoolMetersInitializer.CURRENT_THREADS_BUSY,
+    readMeasurement(result, tree, ThreadPoolMeter.CURRENT_THREADS_BUSY,
         (model, measurement) -> model.setCurrentThreadsBusy((int) 
measurement.getValue()));
-    readMeasurement(ThreadPoolMetersInitializer.MAX_THREADS,
+    readMeasurement(result, tree, ThreadPoolMeter.MAX_THREADS,
         (model, measurement) -> model.setMaxThreads((int) 
measurement.getValue()));
-    readMeasurement(ThreadPoolMetersInitializer.POOL_SIZE,
+    readMeasurement(result, tree, ThreadPoolMeter.POOL_SIZE,
         (model, measurement) -> model.setPoolSize((int) 
measurement.getValue()));
-    readMeasurement(ThreadPoolMetersInitializer.CORE_POOL_SIZE,
+    readMeasurement(result, tree, ThreadPoolMeter.CORE_POOL_SIZE,
         (model, measurement) -> model.setCorePoolSize((int) 
measurement.getValue()));
-    readMeasurement(ThreadPoolMetersInitializer.QUEUE_SIZE,
+    readMeasurement(result, tree, ThreadPoolMeter.QUEUE_SIZE,
         (model, measurement) -> model.setQueueSize((int) 
measurement.getValue()));
-    readMeasurement(ThreadPoolMetersInitializer.REJECTED_COUNT,
+    readMeasurement(result, tree, ThreadPoolMeter.REJECTED_COUNT,
         (model, measurement) -> model.setRejected(measurement.getValue()));
+    return result;
   }
 
-  protected void readMeasurement(String name, Setter setter) {
-    MeasurementNode node = tree.findChild(name);
+  protected static void readMeasurement(Map<String, ThreadPoolPublishModel> 
threadPools, MeasurementTree tree,
+      String name, Setter setter) {
+    MeasurementNode node = tree.findChild(ThreadPoolMeter.THREAD_POOL_METER);
     if (node == null) {
       return;
     }
 
-    for (Measurement measurement : node.getMeasurements()) {
-      String threadPoolName = 
node.getId().getTag(ThreadPoolMetersInitializer.ID);
-      if (threadPoolName == null) {
+    for (String threadPoolName : node.getChildren().keySet()) {
+      MeasurementNode measure = node.findChild(threadPoolName, name);
+      if (measure == null) {
         continue;
       }
-
       ThreadPoolPublishModel model = 
threadPools.computeIfAbsent(threadPoolName, tpn -> new 
ThreadPoolPublishModel());
-      setter.set(model, measurement);
+      setter.set(model, measure.getMeasurements().get(0));
     }
   }
 }
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 bf7bb0429..1ced47feb 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
@@ -46,7 +46,8 @@ public abstract class AbstractInvocationMeter {
         .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()));
+      
totalBuilder.sla(toDuration(metricsBootstrapConfig.getLatencyDistribution()))
+          
.distributionStatisticExpiry(Duration.ofMillis(metricsBootstrapConfig.getMsPollInterval()));
     }
     this.totalTimer = totalBuilder.register(meterRegistry);
     this.prepareTimer = 
Timer.builder(name).tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE
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 fd5d53f9e..fac87d55e 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
@@ -16,8 +16,6 @@
  */
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import io.micrometer.core.instrument.Statistic;
-
 public interface MeterInvocationConst {
   String INVOCATION_NAME = "servicecomb.invocation";
 
@@ -32,11 +30,7 @@ public interface MeterInvocationConst {
 
   String TAG_STAGE = "stage";
 
-  String TAG_LATENCY_DISTRIBUTION = "latencyDistribution";
-
   String TAG_STATUS = "status";
 
-  String TAG_STATISTIC = Statistic.COUNT.name();
-
   String EDGE_INVOCATION_NAME = "EDGE";
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/pool/ThreadPoolMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/pool/ThreadPoolMeter.java
new file mode 100644
index 000000000..1267bc53e
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/pool/ThreadPoolMeter.java
@@ -0,0 +1,102 @@
+/*
+ * 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.meter.pool;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+import org.apache.servicecomb.core.executor.ThreadPoolExecutorEx;
+import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
+
+import io.micrometer.core.instrument.Gauge;
+import io.micrometer.core.instrument.MeterRegistry;
+
+public class ThreadPoolMeter implements PeriodMeter {
+  public static final String THREAD_POOL_METER = "servicecomb.threadpool";
+
+  public static final String ID = "id";
+
+  public static final String STAGE = "stage";
+
+  public static final String REJECTED_COUNT = "rejectedCount";
+
+  public static final String TASK_COUNT = "taskCount";
+
+  public static final String COMPLETED_TASK_COUNT = "completedTaskCount";
+
+  public static final String CURRENT_THREADS_BUSY = "currentThreadsBusy";
+
+  public static final String MAX_THREADS = "maxThreads";
+
+  public static final String POOL_SIZE = "poolSize";
+
+  public static final String CORE_POOL_SIZE = "corePoolSize";
+
+  public static final String QUEUE_SIZE = "queueSize";
+
+  private final ThreadPoolExecutor threadPoolExecutor;
+
+  private long currentTask;
+
+  private long lastTask;
+
+  private long currentCompletedTask;
+
+  private long lastCompletedTask;
+
+  public ThreadPoolMeter(MeterRegistry meterRegistry, String threadPoolName, 
ThreadPoolExecutor threadPoolExecutor) {
+    this.threadPoolExecutor = threadPoolExecutor;
+
+    Gauge.builder(THREAD_POOL_METER, () -> currentTask)
+        .tags(ID, threadPoolName, STAGE, TASK_COUNT)
+        .register(meterRegistry);
+    Gauge.builder(THREAD_POOL_METER, () -> currentCompletedTask)
+        .tags(ID, threadPoolName, STAGE, COMPLETED_TASK_COUNT)
+        .register(meterRegistry);
+    Gauge.builder(THREAD_POOL_METER, threadPoolExecutor::getActiveCount)
+        .tags(ID, threadPoolName, STAGE, CURRENT_THREADS_BUSY)
+        .register(meterRegistry);
+    Gauge.builder(THREAD_POOL_METER, threadPoolExecutor::getMaximumPoolSize)
+        .tags(ID, threadPoolName, STAGE, MAX_THREADS)
+        .register(meterRegistry);
+    Gauge.builder(THREAD_POOL_METER, threadPoolExecutor::getPoolSize)
+        .tags(ID, threadPoolName, STAGE, POOL_SIZE)
+        .register(meterRegistry);
+    Gauge.builder(THREAD_POOL_METER, threadPoolExecutor::getCorePoolSize)
+        .tags(ID, threadPoolName, STAGE, CORE_POOL_SIZE)
+        .register(meterRegistry);
+    Gauge.builder(THREAD_POOL_METER, () -> 
threadPoolExecutor.getQueue().size())
+        .tags(ID, threadPoolName, STAGE, QUEUE_SIZE)
+        .register(meterRegistry);
+
+    if (threadPoolExecutor instanceof ThreadPoolExecutorEx) {
+      Gauge.builder(THREAD_POOL_METER, () -> ((ThreadPoolExecutorEx) 
(threadPoolExecutor)).getRejectedCount())
+          .tags(ID, threadPoolName, STAGE, REJECTED_COUNT)
+          .register(meterRegistry);
+    }
+  }
+
+  @Override
+  public void poll(long msNow, long secondInterval) {
+    long temp = threadPoolExecutor.getTaskCount();
+    currentTask = temp - lastTask;
+    lastTask = temp;
+
+    temp = threadPoolExecutor.getCompletedTaskCount();
+    currentCompletedTask = temp - lastCompletedTask;
+    lastCompletedTask = temp;
+  }
+}
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
index f00cf22e0..b758dbebf 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
@@ -104,7 +104,7 @@ public class EndpointMeter implements PeriodMeter {
     disconnectCount = Gauge.builder(name, () -> currentDisconnectCount)
         .tags(tags.and(Tag.of(STATISTIC, DISCONNECT_COUNT)))
         .register(meterRegistry);
-    connections = Gauge.builder(name, () -> currentConnectCount - 
currentDisconnectCount)
+    connections = Gauge.builder(name, () -> this.metric.getConnectCount() - 
this.metric.getDisconnectCount())
         .tags(tags.and(Tag.of(STATISTIC, CONNECTIONS)))
         .register(meterRegistry);
     bytesRead = Gauge.builder(name, () -> currentBytesRead)
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
index ba0679e8d..feaee2e22 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
@@ -62,7 +62,7 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
   // for a client, maybe will connect to too many endpoints, so default not 
print detail, just print summary
   public static final String ENDPOINTS_CLIENT_DETAIL_ENABLED = 
"servicecomb.metrics.publisher.defaultLog.endpoints.client.detail.enabled";
 
-  private static final String FIRST_LINE_SIMPLE_FORMAT = "  %-11s %-8.1f %-18s 
%s%s\n";
+  private static final String FIRST_LINE_SIMPLE_FORMAT = "  %-11s\n";
 
   private static final String SIMPLE_FORMAT = "              %-8.1f %-18s 
%s%s\n";
 
@@ -243,7 +243,7 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
     sb.append(""
             + "edge:\n"
             + " simple:\n"
-            + "  status      tps      latency            ")
+            + "  status      requests      latency       ")
         .append(latencyDistributionHeader)
         .append("operation\n");
     StringBuilder detailsBuilder = new StringBuilder();
@@ -267,7 +267,7 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
     sb.append(""
             + "consumer:\n"
             + " simple:\n"
-            + "  status      tps      latency            ")
+            + "  status      requests      latency       ")
         .append(latencyDistributionHeader)
         .append("operation\n");
     StringBuilder detailsBuilder = new StringBuilder();
@@ -291,7 +291,7 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
     sb.append(""
             + "producer:\n"
             + " simple:\n"
-            + "  status      tps      latency            ")
+            + "  status      requests      latency       ")
         .append(latencyDistributionHeader)
         .append("operation\n");
     // use detailsBuilder, we can traverse the map only once
@@ -311,32 +311,24 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
 
   private StringBuilder printSamplePerf(OperationPerfGroup perfGroup) {
     StringBuilder sb = new StringBuilder();
-    boolean firstLine = true;
+    String status = perfGroup.getTransport() + "." + perfGroup.getStatus() + 
":";
+    sb.append(String.format(FIRST_LINE_SIMPLE_FORMAT, status));
+
     for (int i = 0; i < perfGroup.getOperationPerfs().size(); i++) {
       OperationPerf operationPerf = perfGroup.getOperationPerfs().get(i);
-      PerfInfo stageTotal = 
operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL);
-      if (Double.compare(0D, stageTotal.getTps()) == 0) {
+      if (isIngoreEmptyPerf(operationPerf)) {
         continue;
       }
-      if (firstLine) {
-        firstLine = false;
-        String status = perfGroup.getTransport() + "." + perfGroup.getStatus();
-        sb.append(String.format(FIRST_LINE_SIMPLE_FORMAT, status,
-            stageTotal.getTps(),
-            getDetailsFromPerf(stageTotal),
-            formatLatencyDistribution(operationPerf),
-            operationPerf.getOperation()));
-      } else {
-        sb.append(String.format(SIMPLE_FORMAT, stageTotal.getTps(),
-            getDetailsFromPerf(stageTotal),
-            formatLatencyDistribution(operationPerf),
-            operationPerf.getOperation()));
-      }
+      PerfInfo stageTotal = 
operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL);
+      sb.append(String.format(SIMPLE_FORMAT, stageTotal.getTotalRequests(),
+          getDetailsFromPerf(stageTotal),
+          formatLatencyDistribution(operationPerf),
+          operationPerf.getOperation()));
     }
     OperationPerf summaryOperation = perfGroup.getSummary();
     PerfInfo stageSummaryTotal = 
summaryOperation.findStage(InvocationStageTrace.STAGE_TOTAL);
     //print summary
-    sb.append(String.format(SIMPLE_FORMAT, stageSummaryTotal.getTps(),
+    sb.append(String.format(SIMPLE_FORMAT, 
stageSummaryTotal.getTotalRequests(),
         getDetailsFromPerf(stageSummaryTotal),
         formatLatencyDistribution(summaryOperation),
         "(summary)"));
@@ -357,8 +349,7 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
         .append(":\n");
     PerfInfo prepare, queue, providerDecode, providerEncode, execute, sendResp;
     for (OperationPerf operationPerf : perfGroup.getOperationPerfs()) {
-      PerfInfo stageTotal = 
operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL);
-      if (Double.compare(0D, stageTotal.getTps()) == 0) {
+      if (isIngoreEmptyPerf(operationPerf)) {
         continue;
       }
       prepare = operationPerf.findStage(InvocationStageTrace.STAGE_PREPARE);
@@ -396,8 +387,7 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
     PerfInfo prepare, encodeRequest, decodeResponse, sendReq, getConnect,
         waitResp;
     for (OperationPerf operationPerf : perfGroup.getOperationPerfs()) {
-      PerfInfo stageTotal = 
operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL);
-      if (Double.compare(0D, stageTotal.getTps()) == 0) {
+      if (isIngoreEmptyPerf(operationPerf)) {
         continue;
       }
       prepare = operationPerf.findStage(InvocationStageTrace.STAGE_PREPARE);
@@ -436,8 +426,7 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
         encodeConsumerRequest, decodeConsumerResponse, sendReq, getConnect,
         waitResp, sendResp;
     for (OperationPerf operationPerf : perfGroup.getOperationPerfs()) {
-      PerfInfo stageTotal = 
operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL);
-      if (Double.compare(0D, stageTotal.getTps()) == 0) {
+      if (isIngoreEmptyPerf(operationPerf)) {
         continue;
       }
       prepare = operationPerf.findStage(InvocationStageTrace.STAGE_PREPARE);
@@ -469,6 +458,16 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
     return sb;
   }
 
+  private boolean isIngoreEmptyPerf(OperationPerf operationPerf) {
+    PerfInfo stageTotal = 
operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL);
+    // max latency is calculated in ring algorithm, maybe not 0
+    if (Double.compare(0D, stageTotal.getTotalRequests()) == 0
+        && Double.compare(0D, stageTotal.getMsMaxLatency()) == 0) {
+      return true;
+    }
+    return false;
+  }
+
   protected void printVertxMetrics(MeasurementTree tree, StringBuilder sb) {
     appendLine(sb, "vertx:");
 
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java
index db5e43404..5baa2917e 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java
@@ -23,16 +23,16 @@ import 
org.apache.servicecomb.foundation.metrics.publish.MeasurementGroupConfig;
 import org.apache.servicecomb.foundation.metrics.publish.MeasurementNode;
 import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree;
 import org.apache.servicecomb.metrics.core.VertxMetersInitializer;
+import 
org.apache.servicecomb.metrics.core.meter.ThreadPoolMonitorPublishModelFactory;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst;
 import org.apache.servicecomb.metrics.core.meter.os.NetMeter;
 import org.apache.servicecomb.metrics.core.meter.os.OsMeter;
+import org.apache.servicecomb.metrics.core.meter.pool.ThreadPoolMeter;
 import org.apache.servicecomb.metrics.core.meter.vertx.EndpointMeter;
 import org.apache.servicecomb.metrics.core.publish.model.DefaultPublishModel;
 import 
org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroups;
 import org.apache.servicecomb.swagger.invocation.InvocationType;
 
-import 
org.apache.servicecomb.metrics.core.meter.ThreadPoolMonitorPublishModelFactory;
-
 import io.micrometer.core.instrument.Meter;
 
 public class PublishModelFactory {
@@ -64,7 +64,6 @@ public class PublishModelFactory {
         MeterInvocationConst.TAG_TYPE,
         new DefaultTagFinder(MeterInvocationConst.TAG_STAGE, true));
 
-    //os config
     groupConfig.addGroup(OsMeter.OS_NAME,
         OsMeter.OS_TYPE,
         new DefaultTagFinder(NetMeter.INTERFACE, true));
@@ -73,6 +72,9 @@ public class PublishModelFactory {
         VertxMetersInitializer.ENDPOINTS_TYPE,
         EndpointMeter.ADDRESS, EndpointMeter.STATISTIC);
 
+    groupConfig.addGroup(ThreadPoolMeter.THREAD_POOL_METER,
+        ThreadPoolMeter.ID, ThreadPoolMeter.STAGE);
+
     return groupConfig;
   }
 
@@ -106,11 +108,11 @@ public class PublishModelFactory {
 
     model.getProducer()
         .setOperationPerfGroups(generateOperationPerfGroups(tree, 
InvocationType.PROVIDER.name()));
-    //edge
+
     model.getEdge()
         .setOperationPerfGroups(generateOperationPerfGroups(tree, 
MeterInvocationConst.EDGE_INVOCATION_NAME));
 
-    ThreadPoolMonitorPublishModelFactory.create(tree, model.getThreadPools());
+    model.setThreadPools(ThreadPoolMonitorPublishModelFactory.create(tree));
 
     return model;
   }
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 8f883b5a8..9bf2cb6f9 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,6 +20,7 @@ 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;
@@ -34,13 +35,9 @@ public final class PublishUtils {
 
   public static PerfInfo createPerfInfo(MeasurementNode stageNode) {
     PerfInfo perfInfo = new PerfInfo();
-    perfInfo.setTps(stageNode.findChild(Statistic.COUNT.name()).summary());
-    
perfInfo.setMsTotalTime(stageNode.findChild(Statistic.TOTAL_TIME.name()).summary()
 * 1000);
-    // when UT with DefaultRegistry, there is no max value
-    MeasurementNode maxNode = stageNode.findChild(Statistic.MAX.name());
-    if (maxNode != null) {
-      perfInfo.setMsMaxLatency(maxNode.summary() * 1000);
-    }
+    
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());
     return perfInfo;
   }
 
@@ -54,7 +51,7 @@ public final class PublishUtils {
       operationPerf.getStages().put(mNode.getName(), perfInfo);
     });
 
-    MeasurementNode latencyNode = 
statusNode.findChild(MeterInvocationConst.TAG_LATENCY_DISTRIBUTION);
+    MeasurementNode latencyNode = 
statusNode.findChild(MeasurementTree.TAG_LATENCY_DISTRIBUTION);
     if (latencyNode != null && latencyNode.getMeasurements() != null) {
       
operationPerf.setLatencyDistribution(latencyNode.getMeasurements().stream()
           .map(m -> (int) m.getValue())
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/model/invocation/PerfInfo.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/model/invocation/PerfInfo.java
index fef78700c..e9e3afbee 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/model/invocation/PerfInfo.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/model/invocation/PerfInfo.java
@@ -17,18 +17,18 @@
 package org.apache.servicecomb.metrics.core.publish.model.invocation;
 
 public class PerfInfo {
-  private double tps;
+  private double totalRequests;
 
   private double msTotalTime;
 
   private double msMaxLatency;
 
-  public double getTps() {
-    return tps;
+  public double getTotalRequests() {
+    return totalRequests;
   }
 
-  public void setTps(double tps) {
-    this.tps = tps;
+  public void setTotalRequests(double totalRequests) {
+    this.totalRequests = totalRequests;
   }
 
   public double getMsTotalTime() {
@@ -48,7 +48,7 @@ public class PerfInfo {
   }
 
   public void add(PerfInfo other) {
-    tps += other.tps;
+    totalRequests += other.totalRequests;
     msTotalTime += other.msTotalTime;
     if (msMaxLatency < other.msMaxLatency) {
       msMaxLatency = other.msMaxLatency;
@@ -56,12 +56,12 @@ public class PerfInfo {
   }
 
   public double calcMsLatency() {
-    return (tps != 0) ? msTotalTime / tps : 0;
+    return (totalRequests != 0) ? msTotalTime / totalRequests : 0;
   }
 
   @Override
   public String toString() {
-    return "PerfInfo [tps=" + tps + ", msTotalTime=" + msTotalTime + ", 
msLatency=" + calcMsLatency()
+    return "PerfInfo [tps=" + totalRequests + ", msTotalTime=" + msTotalTime + 
", msLatency=" + calcMsLatency()
         + ", msMaxLatency="
         + msMaxLatency + "]";
   }
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 8705f89d1..09963b4e4 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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.0E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=5.0E-9");
+        "statistic='MAX', value=5.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-9");
+        "statistic='TOTAL_TIME', value=8.0E-6");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=4.0E-9");
+        "statistic='MAX', value=4.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
   }
 
   @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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.0E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=5.0E-9");
+        "statistic='MAX', value=5.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-9");
+        "statistic='TOTAL_TIME', value=8.0E-6");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=4.0E-9");
+        "statistic='MAX', value=4.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.6E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=8.0E-9");
+        "statistic='MAX', value=8.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
   }
 
   @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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
 
     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-8");
+        "statistic='TOTAL_TIME', value=1.8E-5");
     AssertUtil.assertMeasure(measurements, 2,
-        "statistic='MAX', value=9.0E-9");
+        "statistic='MAX', value=9.0E-6");
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestThreadPoolMetersInitializer.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestThreadPoolMetersInitializer.java
index 73afa85b9..9c9698aed 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestThreadPoolMetersInitializer.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestThreadPoolMetersInitializer.java
@@ -32,7 +32,9 @@ import org.apache.servicecomb.core.executor.GroupExecutor;
 import org.apache.servicecomb.core.executor.ThreadPoolExecutorEx;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import 
org.apache.servicecomb.foundation.metrics.publish.MeasurementGroupConfig;
+import org.apache.servicecomb.foundation.metrics.publish.MeasurementNode;
 import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree;
+import org.apache.servicecomb.metrics.core.meter.pool.ThreadPoolMeter;
 import org.junit.Test;
 import org.junit.jupiter.api.Assertions;
 import org.mockito.Mockito;
@@ -127,22 +129,18 @@ public class TestThreadPoolMetersInitializer {
 
     MeasurementTree tree = new MeasurementTree();
     MeasurementGroupConfig group = new MeasurementGroupConfig();
-    group.addGroup("threadpool.maxThreads", "id");
-    group.addGroup("threadpool.rejectedCount", "id");
-    group.addGroup("threadpool.completedTaskCount", "id");
-    group.addGroup("threadpool.currentThreadsBusy", "id");
-    group.addGroup("threadpool.corePoolSize", "id");
-    group.addGroup("threadpool.poolSize", "id");
-    group.addGroup("threadpool.queueSize", "id");
-    group.addGroup("threadpool.taskCount", "id");
+    group.addGroup(ThreadPoolMeter.THREAD_POOL_METER, ThreadPoolMeter.ID,
+        ThreadPoolMeter.STAGE);
     tree.from(registry.getMeters().iterator(), group);
-    Assertions.assertEquals(tree.findChild("threadpool.maxThreads", 
"groupExecutor-group0").summary(), 0, 0);
-    Assertions.assertEquals(tree.findChild("threadpool.rejectedCount", 
"groupExecutor-group0").summary(), 0, 0);
-    Assertions.assertEquals(tree.findChild("threadpool.completedTaskCount", 
"groupExecutor-group0").summary(), 0, 0);
-    Assertions.assertEquals(tree.findChild("threadpool.currentThreadsBusy", 
"groupExecutor-group0").summary(), 0, 0);
-    Assertions.assertEquals(tree.findChild("threadpool.corePoolSize", 
"groupExecutor-group0").summary(), 0, 0);
-    Assertions.assertEquals(tree.findChild("threadpool.poolSize", 
"groupExecutor-group0").summary(), 0, 0);
-    Assertions.assertEquals(tree.findChild("threadpool.queueSize", 
"groupExecutor-group0").summary(), 10, 0);
-    Assertions.assertEquals(tree.findChild("threadpool.taskCount", 
"groupExecutor-group0").summary(), 0, 0);
+
+    MeasurementNode node = tree.findChild(ThreadPoolMeter.THREAD_POOL_METER);
+    Assertions.assertEquals(node.findChild("groupExecutor-group0", 
"maxThreads").summary(), 0, 0);
+    Assertions.assertEquals(node.findChild("groupExecutor-group0", 
"rejectedCount").summary(), 0, 0);
+    Assertions.assertEquals(node.findChild("groupExecutor-group0", 
"completedTaskCount").summary(), 0, 0);
+    Assertions.assertEquals(node.findChild("groupExecutor-group0", 
"currentThreadsBusy").summary(), 0, 0);
+    Assertions.assertEquals(node.findChild("groupExecutor-group0", 
"corePoolSize").summary(), 0, 0);
+    Assertions.assertEquals(node.findChild("groupExecutor-group0", 
"poolSize").summary(), 0, 0);
+    Assertions.assertEquals(node.findChild("groupExecutor-group0", 
"queueSize").summary(), 10, 0);
+    Assertions.assertEquals(node.findChild("groupExecutor-group0", 
"taskCount").summary(), 0, 0);
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
index a18d2207d..bc1fd4df6 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
@@ -163,7 +163,7 @@ public class TestDefaultLogPublisher {
       };
       DefaultPublishModel model = new DefaultPublishModel();
       PerfInfo perfTotal = new PerfInfo();
-      perfTotal.setTps(10_0000);
+      perfTotal.setTotalRequests(10_0000);
       perfTotal.setMsTotalTime(30000L * 1_0000);
       perfTotal.setMsMaxLatency(30000);
       OperationPerf operationPerf = new OperationPerf();
@@ -264,8 +264,9 @@ public class TestDefaultLogPublisher {
                 0        0          0        0           NaN      0         
0.0       0.0          test
               consumer:
                simple:
-                status      tps      latency            [0,1) [1,100) [100,) 
operation
-                rest.OK     100000.0 3000.000/30000.000 12    120     1200   op
+                status      requests      latency       [0,1) [1,100) [100,) 
operation
+                rest.OK:  \s
+                            100000.0 3000.000/30000.000 12    120     1200   op
                             100000.0 3000.000/30000.000 12    120     1200   
(summary)
                details:
                   rest.OK:
@@ -274,8 +275,9 @@ public class TestDefaultLogPublisher {
                       wait  : 3000.000/30000.000 decode-response    : 
3000.000/30000.000
               producer:
                simple:
-                status      tps      latency            [0,1) [1,100) [100,) 
operation
-                rest.OK     100000.0 3000.000/30000.000 12    120     1200   op
+                status      requests      latency       [0,1) [1,100) [100,) 
operation
+                rest.OK:  \s
+                            100000.0 3000.000/30000.000 12    120     1200   op
                             100000.0 3000.000/30000.000 12    120     1200   
(summary)
                details:
                   rest.OK:
@@ -284,8 +286,9 @@ public class TestDefaultLogPublisher {
                       encode-response: 3000.000/30000.000 send: 
3000.000/30000.000
               edge:
                simple:
-                status      tps      latency            [0,1) [1,100) [100,) 
operation
-                rest.OK     100000.0 3000.000/30000.000 12    120     1200   op
+                status      requests      latency       [0,1) [1,100) [100,) 
operation
+                rest.OK:  \s
+                            100000.0 3000.000/30000.000 12    120     1200   op
                             100000.0 3000.000/30000.000 12    120     1200   
(summary)
                details:
                   rest.OK:
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 e96bed878..d0310e48c 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
@@ -75,198 +75,198 @@ public class TestInvocationPublishModelFactory {
 
     String expect = """
         {
-           "operationPerfGroups" : {
-             "groups" : {
-               "rest" : {
-                 "200" : {
-                   "transport" : "rest",
-                   "status" : "200",
-                   "operationPerfs" : [ {
-                     "operation" : "m.s.o",
-                     "stages" : {
-                       "consumer-encode" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "prepare" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "wait" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "total" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.4E-5,
-                         "msMaxLatency" : 1.4E-5
-                       },
-                       "consumer-send" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "connection" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "consumer-decode" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       }
-                     },
-                     "latencyDistribution" : [ 1, 0, 0 ]
-                   } ],
-                   "summary" : {
-                     "operation" : "",
-                     "stages" : {
-                       "consumer-encode" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "prepare" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "total" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.4E-5,
-                         "msMaxLatency" : 1.4E-5
-                       },
-                       "wait" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "consumer-send" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "connection" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "consumer-decode" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       }
-                     },
-                     "latencyDistribution" : [ 1, 0, 0 ]
-                   }
-                 }
-               }
-             }
-           }
-         }
+            "operationPerfGroups" : {
+              "groups" : {
+                "rest" : {
+                  "200" : {
+                    "transport" : "rest",
+                    "status" : "200",
+                    "operationPerfs" : [ {
+                      "operation" : "m.s.o",
+                      "stages" : {
+                        "consumer-encode" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        },
+                        "prepare" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        },
+                        "wait" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        },
+                        "total" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.4E-5,
+                          "msMaxLatency" : 1.4E-5
+                        },
+                        "consumer-send" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        },
+                        "connection" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        },
+                        "consumer-decode" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        }
+                      },
+                      "latencyDistribution" : [ 1, 0, 0 ]
+                    } ],
+                    "summary" : {
+                      "operation" : "",
+                      "stages" : {
+                        "consumer-encode" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        },
+                        "prepare" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        },
+                        "total" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.4E-5,
+                          "msMaxLatency" : 1.4E-5
+                        },
+                        "wait" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        },
+                        "consumer-send" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        },
+                        "connection" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        },
+                        "consumer-decode" : {
+                          "totalRequests" : 1.0,
+                          "msTotalTime" : 1.0E-6,
+                          "msMaxLatency" : 1.0E-6
+                        }
+                      },
+                      "latencyDistribution" : [ 1, 0, 0 ]
+                    }
+                  }
+                }
+              }
+            }
+          }
         """;
     Assertions.assertEquals(Json.encodePrettily(Json.decodeValue(expect, 
Object.class)),
         Json.encodePrettily(model.getConsumer()));
 
     expect = """
         {
-           "operationPerfGroups" : {
-             "groups" : {
-               "rest" : {
-                 "200" : {
-                   "transport" : "rest",
-                   "status" : "200",
-                   "operationPerfs" : [ {
-                     "operation" : "m.s.o",
-                     "stages" : {
-                       "consumer-encode" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "prepare" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "wait" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "total" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.4E-5,
-                         "msMaxLatency" : 1.4E-5
-                       },
-                       "consumer-send" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "connection" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "consumer-decode" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       }
-                     },
-                     "latencyDistribution" : [ 1, 0, 0 ]
-                   } ],
-                   "summary" : {
-                     "operation" : "",
-                     "stages" : {
-                       "consumer-encode" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "prepare" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "total" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.4E-5,
-                         "msMaxLatency" : 1.4E-5
-                       },
-                       "wait" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "consumer-send" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "connection" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       },
-                       "consumer-decode" : {
-                         "tps" : 1.0,
-                         "msTotalTime" : 1.0000000000000002E-6,
-                         "msMaxLatency" : 1.0000000000000002E-6
-                       }
-                     },
-                     "latencyDistribution" : [ 1, 0, 0 ]
-                   }
-                 }
-               }
-             }
-           }
-         }
+          "operationPerfGroups" : {
+            "groups" : {
+              "rest" : {
+                "200" : {
+                  "transport" : "rest",
+                  "status" : "200",
+                  "operationPerfs" : [ {
+                    "operation" : "m.s.o",
+                    "stages" : {
+                      "consumer-encode" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      },
+                      "prepare" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      },
+                      "wait" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      },
+                      "total" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.4E-5,
+                        "msMaxLatency" : 1.4E-5
+                      },
+                      "consumer-send" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      },
+                      "connection" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      },
+                      "consumer-decode" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      }
+                    },
+                    "latencyDistribution" : [ 1, 0, 0 ]
+                  } ],
+                  "summary" : {
+                    "operation" : "",
+                    "stages" : {
+                      "consumer-encode" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      },
+                      "prepare" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      },
+                      "total" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.4E-5,
+                        "msMaxLatency" : 1.4E-5
+                      },
+                      "wait" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      },
+                      "consumer-send" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      },
+                      "connection" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      },
+                      "consumer-decode" : {
+                        "totalRequests" : 1.0,
+                        "msTotalTime" : 1.0E-6,
+                        "msMaxLatency" : 1.0E-6
+                      }
+                    },
+                    "latencyDistribution" : [ 1, 0, 0 ]
+                  }
+                }
+              }
+            }
+          }
+        }
         """;
     Assertions.assertEquals(Json.encodePrettily(Json.decodeValue(expect, 
Object.class)),
         Json.encodePrettily(model.getProducer()));
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 7d98f7bff..66fb62f2f 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
@@ -16,13 +16,13 @@
  */
 package org.apache.servicecomb.metrics.core.publish;
 
-import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.servicecomb.core.CoreConst;
 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.ThreadPoolMonitorPublishModelFactory;
 import 
org.apache.servicecomb.metrics.core.publish.model.ThreadPoolPublishModel;
 import 
org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerf;
 import 
org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroup;
@@ -32,8 +32,6 @@ import 
org.apache.servicecomb.metrics.core.publish.model.invocation.Utils;
 import org.junit.Test;
 import org.junit.jupiter.api.Assertions;
 
-import 
org.apache.servicecomb.metrics.core.meter.ThreadPoolMonitorPublishModelFactory;
-
 import jakarta.ws.rs.core.Response.Status;
 
 public class TestPublishUtils {
@@ -45,9 +43,9 @@ public class TestPublishUtils {
 
     PerfInfo perf = PublishUtils.createPerfInfo(stageNode);
 
-    Assertions.assertEquals(10, perf.getTps(), 0);
-    Assertions.assertEquals(1000, perf.calcMsLatency(), 0);
-    Assertions.assertEquals(100000, perf.getMsMaxLatency(), 0);
+    Assertions.assertEquals(10, perf.getTotalRequests(), 0);
+    Assertions.assertEquals(1, perf.calcMsLatency(), 0);
+    Assertions.assertEquals(100, perf.getMsMaxLatency(), 0);
   }
 
   @Test
@@ -56,9 +54,9 @@ public class TestPublishUtils {
 
     PerfInfo perfInfo = opPerf.findStage(InvocationStageTrace.STAGE_TOTAL);
     Integer[] latencyDistribution = opPerf.getLatencyDistribution();
-    Assertions.assertEquals(10, perfInfo.getTps(), 0);
-    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0);
+    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
     Assertions.assertEquals(2, latencyDistribution.length);
     Assertions.assertEquals(1, latencyDistribution[0].intValue());
     Assertions.assertEquals(2, latencyDistribution[1].intValue());
@@ -77,9 +75,9 @@ public class TestPublishUtils {
 
     PerfInfo perfInfo = 
group.getSummary().findStage(InvocationStageTrace.STAGE_TOTAL);
     Integer[] latencyDistribution = 
group.getSummary().getLatencyDistribution();
-    Assertions.assertEquals(10, perfInfo.getTps(), 0);
-    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0);
+    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
     Assertions.assertEquals(2, latencyDistribution.length);
     Assertions.assertEquals(1, latencyDistribution[0].intValue());
     Assertions.assertEquals(2, latencyDistribution[1].intValue());
@@ -87,9 +85,8 @@ public class TestPublishUtils {
 
   @Test
   public void createThreadPoolPublishModels_empty() {
-    Map<String, ThreadPoolPublishModel> threadPools = new HashMap<>();
-
-    ThreadPoolMonitorPublishModelFactory.create(new MeasurementTree(), 
threadPools);
+    Map<String, ThreadPoolPublishModel> threadPools =
+        ThreadPoolMonitorPublishModelFactory.create(new MeasurementTree());
 
     Assertions.assertTrue(threadPools.isEmpty());
   }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java
index 64778d3ee..7a20f852c 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java
@@ -17,8 +17,8 @@
 package org.apache.servicecomb.metrics.core.publish;
 
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
 
+import org.apache.servicecomb.core.executor.ThreadPoolExecutorEx;
 import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.apache.servicecomb.foundation.common.utils.JsonUtils;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
@@ -44,7 +44,7 @@ public class TestThreadPoolPublishModelFactory {
   BlockingQueue<Runnable> queue;
 
   @Test
-  public void createDefaultPublishModel(@Injectable ThreadPoolExecutor 
threadPoolExecutor) throws Exception {
+  public void createDefaultPublishModel(@Injectable ThreadPoolExecutorEx 
threadPoolExecutor) throws Exception {
     new Expectations() {
       {
         threadPoolExecutor.getQueue();
@@ -66,7 +66,8 @@ public class TestThreadPoolPublishModelFactory {
     DefaultPublishModel model = factory.createDefaultPublishModel();
 
     Assertions.assertEquals(
-        
"{\"test\":{\"avgTaskCount\":0.0,\"avgCompletedTaskCount\":0.0,\"currentThreadsBusy\":0,\"maxThreads\":0,\"poolSize\":0,\"corePoolSize\":0,\"queueSize\":10,\"rejected\":\"NaN\"}}",
+        """
+            
{"test":{"avgTaskCount":0.0,"avgCompletedTaskCount":0.0,"currentThreadsBusy":0,"maxThreads":0,"poolSize":0,"corePoolSize":0,"queueSize":10,"rejected":0.0}}""",
         JsonUtils.writeValueAsString(model.getThreadPools()));
   }
 }
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 bc4016165..2090f21a8 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
@@ -35,13 +35,13 @@ public class TestOperationPerf {
     Assertions.assertEquals(op, otherOpPerf.getOperation());
 
     PerfInfo perfInfo = opPerf.findStage(InvocationStageTrace.STAGE_TOTAL);
-    Assertions.assertEquals(10, perfInfo.getTps(), 0);
-    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0);
+    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
 
     perfInfo = opPerf.findStage(InvocationStageTrace.STAGE_PROVIDER_BUSINESS);
-    Assertions.assertEquals(10, perfInfo.getTps(), 0);
-    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0);
+    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100, 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 ae3ed7a29..9f4fa492f 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
@@ -47,13 +47,13 @@ public class TestOperationPerfGroup {
     OperationPerf summary = group.getSummary();
 
     PerfInfo perfInfo = summary.findStage(InvocationStageTrace.STAGE_TOTAL);
-    Assertions.assertEquals(20, perfInfo.getTps(), 0);
-    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(20, perfInfo.getTotalRequests(), 0);
+    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
 
     perfInfo = summary.findStage(InvocationStageTrace.STAGE_PROVIDER_BUSINESS);
-    Assertions.assertEquals(20, perfInfo.getTps(), 0);
-    Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0);
-    Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0);
+    Assertions.assertEquals(20, perfInfo.getTotalRequests(), 0);
+    Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0);
+    Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0);
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestPerfInfo.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestPerfInfo.java
index 3fec1908b..35c6d83e7 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestPerfInfo.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestPerfInfo.java
@@ -24,7 +24,7 @@ public class TestPerfInfo {
   public void construct() {
     PerfInfo perf = new PerfInfo();
 
-    Assertions.assertEquals(0, perf.getTps(), 0);
+    Assertions.assertEquals(0, perf.getTotalRequests(), 0);
     Assertions.assertEquals(0, perf.getMsTotalTime(), 0);
     Assertions.assertEquals(0, perf.getMsMaxLatency(), 0);
     Assertions.assertEquals(0, perf.calcMsLatency(), 0);
@@ -35,18 +35,18 @@ public class TestPerfInfo {
     PerfInfo sum = new PerfInfo();
 
     PerfInfo other = new PerfInfo();
-    other.setTps(10);
+    other.setTotalRequests(10);
     other.setMsTotalTime(10);
     other.setMsMaxLatency(100);
     sum.add(other);
 
     other = new PerfInfo();
-    other.setTps(20);
+    other.setTotalRequests(20);
     other.setMsTotalTime(20);
     other.setMsMaxLatency(200);
     sum.add(other);
 
-    Assertions.assertEquals(30, sum.getTps(), 0);
+    Assertions.assertEquals(30, sum.getTotalRequests(), 0);
     Assertions.assertEquals(30, sum.getMsTotalTime(), 0);
     Assertions.assertEquals(200, sum.getMsMaxLatency(), 0);
     Assertions.assertEquals(1.0, sum.calcMsLatency(), 0);
@@ -57,18 +57,18 @@ public class TestPerfInfo {
     PerfInfo sum = new PerfInfo();
 
     PerfInfo other = new PerfInfo();
-    other.setTps(10);
+    other.setTotalRequests(10);
     other.setMsTotalTime(10);
     other.setMsMaxLatency(100);
     sum.add(other);
 
     other = new PerfInfo();
-    other.setTps(20);
+    other.setTotalRequests(20);
     other.setMsTotalTime(20);
     other.setMsMaxLatency(50);
     sum.add(other);
 
-    Assertions.assertEquals(30, sum.getTps(), 0);
+    Assertions.assertEquals(30, sum.getTotalRequests(), 0);
     Assertions.assertEquals(1.0, sum.calcMsLatency(), 0);
     Assertions.assertEquals(100, sum.getMsMaxLatency(), 0);
   }
@@ -76,7 +76,7 @@ public class TestPerfInfo {
   @Test
   public void testToString() {
     PerfInfo perf = new PerfInfo();
-    perf.setTps(10);
+    perf.setTotalRequests(10);
     perf.setMsTotalTime(10);
     perf.setMsMaxLatency(100);
 
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 a9f87601d..c48a1b5b6 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,6 +21,7 @@ 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;
 
@@ -60,7 +61,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(MeterInvocationConst.TAG_LATENCY_DISTRIBUTION, id,
+    MeasurementNode latencyNode = new 
MeasurementNode(MeasurementTree.TAG_LATENCY_DISTRIBUTION, id,
         new HashMap<>());
     List<Measurement> measurements = latencyNode.getMeasurements();
     measurements.add(new Measurement(() -> 1, Statistic.VALUE));


Reply via email to