You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2018/01/24 01:21:40 UTC

[incubator-servicecomb-java-chassis] 03/10: SCB-150 minor refactor and fix test case

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

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

commit e4bf6300d20471d3a07e95ab5c91ec257584fd8a
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Fri Jan 12 11:34:41 2018 +0800

    SCB-150 minor refactor and fix test case
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../metrics/common/DoubleMetricValue.java          |   2 +
 .../metrics/common/LongMetricValue.java            |   2 +
 .../io/servicecomb/metrics/common/MetricValue.java |   7 +-
 .../servicecomb/metrics/common/CallMetric.java     |  18 ++
 .../metrics/core/utils/MonitorUtils.java           |   5 +-
 .../metrics/core/monitor/CallMonitor.java          |  12 +-
 .../core/monitor/ConsumerInvocationMonitor.java    |   9 +-
 .../core/monitor/ProducerInvocationMonitor.java    |  11 +-
 .../metrics/core/TestEventAndRunner.java           | 346 ++++++++++-----------
 .../servicecomb/metrics/core/TestPublisher.java    |   7 +-
 10 files changed, 221 insertions(+), 198 deletions(-)

diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java
index c116562..8b83191 100644
--- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java
+++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java
@@ -53,6 +53,8 @@ public class DoubleMetricValue extends MetricValue<Double> {
     for (DoubleMetricValue s : source) {
       if (finalValues.containsKey(s.getKey())) {
         finalValues.put(s.getKey(), finalValues.get(s.getKey()).merge(s));
+      } else {
+        finalValues.put(s.getKey(), s);
       }
     }
     return new ArrayList<>(finalValues.values());
diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java
index eb0ac8d..6f7429c 100644
--- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java
+++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java
@@ -53,6 +53,8 @@ public class LongMetricValue extends MetricValue<Long> {
     for (LongMetricValue s : source) {
       if (finalValues.containsKey(s.getKey())) {
         finalValues.put(s.getKey(), finalValues.get(s.getKey()).merge(s));
+      } else {
+        finalValues.put(s.getKey(), s);
       }
     }
     return new ArrayList<>(finalValues.values());
diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java
index c368aba..f1f95e3 100644
--- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java
+++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java
@@ -48,7 +48,7 @@ public class MetricValue<T extends Number> {
       for (String key : keys) {
         builder.append(String.format("%s=%s,", key, dimensions.get(key)));
       }
-      builder.deleteCharAt(dimensions.size() - 1);
+      builder.deleteCharAt(builder.length() - 1);
       builder.append("}");
       finalKey = builder.toString();
     }
@@ -62,4 +62,9 @@ public class MetricValue<T extends Number> {
     this.value = value;
     this.dimensions = dimensions;
   }
+
+  public boolean containDimension(String dimensionKey, String dimensionValue) {
+    return this.getDimensions().containsKey(dimensionKey) &&
+        dimensionValue.equals(this.getDimensions().get(dimensionKey));
+  }
 }
diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java
index a65ee92..f3e82d5 100644
--- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java
+++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/CallMetric.java
@@ -35,10 +35,28 @@ public class CallMetric {
     return totalValues;
   }
 
+  public LongMetricValue getTotalValues(String dimensionKey, String dimensionValue) {
+    for (LongMetricValue value : totalValues) {
+      if (value.containDimension(dimensionKey, dimensionValue)) {
+        return value;
+      }
+    }
+    return null;
+  }
+
   public List<DoubleMetricValue> getTpsValues() {
     return tpsValues;
   }
 
+  public DoubleMetricValue getTpsValue(String dimensionKey, String dimensionValue) {
+    for (DoubleMetricValue value : tpsValues) {
+      if (value.containDimension(dimensionKey, dimensionValue)) {
+        return value;
+      }
+    }
+    return null;
+  }
+
   public CallMetric(String prefix) {
     this(prefix, new ArrayList<>(), new ArrayList<>());
   }
diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java
index 7091724..741cdd5 100644
--- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java
+++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java
@@ -51,7 +51,10 @@ public class MonitorUtils {
     if (tags.size() != 0) {
       Map<String, String> tagMap = new HashMap<>();
       for (Tag tag : tags) {
-        tagMap.put(tag.getKey(), tag.getValue());
+        //we don't need servo internal type tag for metrics
+        if (!"type".equals(tag.getKey())) {
+          tagMap.put(tag.getKey(), tag.getValue());
+        }
       }
       return tagMap;
     }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java
index fb47b9b..bd2829f 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/CallMonitor.java
@@ -39,20 +39,20 @@ public class CallMonitor {
 
   private final List<StepCounter> tpsCounters;
 
-  public CallMonitor(String prefix, String... dimensions) {
+  public CallMonitor(String prefix, String... dimensionKeys) {
     this.prefix = prefix;
     this.totalCounters = new ArrayList<>();
     this.tpsCounters = new ArrayList<>();
-    if (dimensions.length == 0) {
+    if (dimensionKeys.length == 0) {
       this.totalCounters.add(new BasicCounter(MonitorConfig.builder(prefix + ".total").build()));
       this.tpsCounters.add(new StepCounter(MonitorConfig.builder(prefix + ".tps").build()));
     } else {
-      for (String dimension : dimensions) {
-        for (String option : MetricsDimension.getDimensionOptions(dimension)) {
+      for (String dimensionKey : dimensionKeys) {
+        for (String option : MetricsDimension.getDimensionOptions(dimensionKey)) {
           this.totalCounters
-              .add(new BasicCounter(MonitorConfig.builder(prefix + ".total").withTag(dimension, option).build()));
+              .add(new BasicCounter(MonitorConfig.builder(prefix + ".total").withTag(dimensionKey, option).build()));
           this.tpsCounters
-              .add(new StepCounter(MonitorConfig.builder(prefix + ".tps").withTag(dimension, option).build()));
+              .add(new StepCounter(MonitorConfig.builder(prefix + ".tps").withTag(dimensionKey, option).build()));
         }
       }
     }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java
index 1f2f247..4f8f7df 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ConsumerInvocationMonitor.java
@@ -15,11 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.metrics.core.monitor;
+package io.servicecomb.metrics.core.monitor;
 
 
-import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric;
-import org.apache.servicecomb.metrics.common.MetricsConst;
+import io.servicecomb.metrics.common.ConsumerInvocationMetric;
+import io.servicecomb.metrics.common.MetricsConst;
+import io.servicecomb.metrics.core.MetricsDimension;
 
 public class ConsumerInvocationMonitor extends InvocationMonitor {
   private final TimerMonitor consumerLatency;
@@ -37,7 +38,7 @@ public class ConsumerInvocationMonitor extends InvocationMonitor {
   public ConsumerInvocationMonitor(String operationName) {
     super(operationName, String.format(MetricsConst.CONSUMER_PREFIX_TEMPLATE, operationName));
     this.consumerLatency = new TimerMonitor(this.getPrefix() + ".consumerLatency");
-    this.consumerCall = new CallMonitor(this.getPrefix() + ".consumerCall");
+    this.consumerCall = new CallMonitor(this.getPrefix() + ".consumerCall", MetricsDimension.DIMENSION_STATUS);
   }
 
   public ConsumerInvocationMetric toMetric(int windowTimeIndex) {
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java
index 9c77ec8..a5cb7c4 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/ProducerInvocationMonitor.java
@@ -15,14 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.metrics.core.monitor;
-
-import org.apache.servicecomb.metrics.common.MetricsConst;
-import org.apache.servicecomb.metrics.common.ProducerInvocationMetric;
+package io.servicecomb.metrics.core.monitor;
 
 import com.netflix.servo.monitor.BasicCounter;
 import com.netflix.servo.monitor.MonitorConfig;
 
+import io.servicecomb.metrics.common.MetricsConst;
+import io.servicecomb.metrics.common.ProducerInvocationMetric;
+import io.servicecomb.metrics.core.MetricsDimension;
+
 public class ProducerInvocationMonitor extends InvocationMonitor {
   private final BasicCounter waitInQueue;
 
@@ -60,7 +61,7 @@ public class ProducerInvocationMonitor extends InvocationMonitor {
     this.lifeTimeInQueue = new TimerMonitor(this.getPrefix() + ".lifeTimeInQueue");
     this.executionTime = new TimerMonitor(this.getPrefix() + ".executionTime");
     this.producerLatency = new TimerMonitor(this.getPrefix() + ".producerLatency");
-    this.producerCall = new CallMonitor(this.getPrefix() + ".producerCall");
+    this.producerCall = new CallMonitor(this.getPrefix() + ".producerCall", MetricsDimension.DIMENSION_STATUS);
   }
 
   public ProducerInvocationMetric toMetric(int windowTimeIndex) {
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java
index 6edff5e..fc797cb 100644
--- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestEventAndRunner.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.metrics.core;
+package io.servicecomb.metrics.core;
 
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.mockito.Mockito.when;
@@ -29,20 +29,21 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.servicecomb.core.metrics.InvocationFinishedEvent;
-import org.apache.servicecomb.core.metrics.InvocationStartProcessingEvent;
-import org.apache.servicecomb.core.metrics.InvocationStartedEvent;
-import org.apache.servicecomb.foundation.common.utils.EventUtils;
-import org.apache.servicecomb.metrics.common.RegistryMetric;
-import org.apache.servicecomb.metrics.core.event.DefaultEventListenerManager;
-import org.apache.servicecomb.metrics.core.monitor.DefaultSystemMonitor;
-import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor;
-import org.apache.servicecomb.metrics.core.publish.DefaultDataSource;
-import org.apache.servicecomb.swagger.invocation.InvocationType;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import io.servicecomb.core.metrics.InvocationFinishedEvent;
+import io.servicecomb.core.metrics.InvocationStartProcessingEvent;
+import io.servicecomb.core.metrics.InvocationStartedEvent;
+import io.servicecomb.foundation.common.utils.EventUtils;
+import io.servicecomb.metrics.common.RegistryMetric;
+import io.servicecomb.metrics.core.event.DefaultEventListenerManager;
+import io.servicecomb.metrics.core.monitor.DefaultSystemMonitor;
+import io.servicecomb.metrics.core.monitor.RegistryMonitor;
+import io.servicecomb.metrics.core.publish.DefaultDataSource;
+import io.servicecomb.swagger.invocation.InvocationType;
+
 public class TestEventAndRunner {
 
   @Test
@@ -75,14 +76,15 @@ public class TestEventAndRunner {
 
     new DefaultEventListenerManager(monitor);
 
-    //fun1 is a PRODUCER invocation call twice and all is completed
+    //fun1 is a PRODUCER invocation call 2 time and all is completed
+    //two time success
     EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime()));
     EventUtils.triggerEvent(
         new InvocationStartProcessingEvent("fun1", InvocationType.PRODUCER,
             TimeUnit.MILLISECONDS.toNanos(100)));
     EventUtils
         .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER,
-            TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300)));
+            TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), true));
 
     EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime()));
     EventUtils.triggerEvent(
@@ -90,7 +92,9 @@ public class TestEventAndRunner {
             TimeUnit.MILLISECONDS.toNanos(300)));
     EventUtils
         .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER,
-            TimeUnit.MILLISECONDS.toNanos(400), TimeUnit.MILLISECONDS.toNanos(700)));
+            TimeUnit.MILLISECONDS.toNanos(400), TimeUnit.MILLISECONDS.toNanos(700), false));
+
+    //==========================================================================
 
     //fun3 is a PRODUCER invocation call uncompleted
     EventUtils.triggerEvent(new InvocationStartedEvent("fun3", InvocationType.PRODUCER, System.nanoTime()));
@@ -98,6 +102,13 @@ public class TestEventAndRunner {
         new InvocationStartProcessingEvent("fun3", InvocationType.PRODUCER,
             TimeUnit.MILLISECONDS.toNanos(500)));
 
+    //==========================================================================
+
+    //fun4 is a PRODUCER call only started and no processing start and finished
+    EventUtils.triggerEvent(new InvocationStartedEvent("fun4", InvocationType.PRODUCER, System.nanoTime()));
+
+    //==========================================================================
+
     //fun2 is a CONSUMER invocation call once and completed
     EventUtils.triggerEvent(new InvocationStartedEvent("fun2", InvocationType.CONSUMER, System.nanoTime()));
     EventUtils.triggerEvent(
@@ -105,10 +116,9 @@ public class TestEventAndRunner {
             TimeUnit.MILLISECONDS.toNanos(100)));
     EventUtils
         .triggerEvent(new InvocationFinishedEvent("fun2", InvocationType.CONSUMER,
-            TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300)));
+            TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), true));
 
-    //fun4 is a invocation call only started and no processing start and finished
-    EventUtils.triggerEvent(new InvocationStartedEvent("fun4", InvocationType.PRODUCER, System.nanoTime()));
+    //==========================================================================
 
     //sim lease one window time
     Thread.sleep(1000);
@@ -116,194 +126,176 @@ public class TestEventAndRunner {
     RegistryMetric model = dataSource.getRegistryMetric(1000);
 
     //check InstanceMetric
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getWaitInQueue(), 1);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getCount(), 3);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getTotal(),
-        900,
-        0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getAverage(),
-        300,
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getWaitInQueue());
+    Assert.assertEquals(3, model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getCount());
+    Assert.assertEquals(900, model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getTotal(), 0);
+    Assert.assertEquals(300, model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getAverage(),
         0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getMax(),
-        500,
+    Assert.assertEquals(500, model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getMax(),
         0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getMin(),
-        100,
+    Assert.assertEquals(100, model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getMin(),
         0);
 
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getCount(), 2);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getTotal(),
-        600,
+    Assert.assertEquals(2, model.getInstanceMetric().getProducerMetric().getExecutionTime().getCount());
+    Assert.assertEquals(600, model.getInstanceMetric().getProducerMetric().getExecutionTime().getTotal(),
         0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getAverage(),
-        300,
+    Assert.assertEquals(300, model.getInstanceMetric().getProducerMetric().getExecutionTime().getAverage(),
         0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getMax(),
-        400,
+    Assert.assertEquals(400, model.getInstanceMetric().getProducerMetric().getExecutionTime().getMax(),
         0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getMin(),
-        200,
+    Assert.assertEquals(200, model.getInstanceMetric().getProducerMetric().getExecutionTime().getMin(),
         0);
 
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getCount(), 2);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getTotal(),
-        1000,
+    Assert.assertEquals(2, model.getInstanceMetric().getProducerMetric().getProducerLatency().getCount());
+    Assert.assertEquals(1000, model.getInstanceMetric().getProducerMetric().getProducerLatency().getTotal(),
         0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getAverage(),
-        500,
+    Assert.assertEquals(500, model.getInstanceMetric().getProducerMetric().getProducerLatency().getAverage(),
         0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getMax(),
-        700,
+    Assert.assertEquals(700, model.getInstanceMetric().getProducerMetric().getProducerLatency().getMax(),
         0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getMin(),
-        300,
+    Assert.assertEquals(300, model.getInstanceMetric().getProducerMetric().getProducerLatency().getMin(),
         0);
 
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerCall().getTps(), 4, 0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerCall().getTotal(), 4);
-
-    Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getCount(), 1);
-    Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getTotal(),
-        300,
-        0);
-    Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getAverage(),
-        300,
-        0);
-    Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getMax(),
-        300,
-        0);
-    Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getMin(),
-        300,
-        0);
+    Assert.assertEquals(4, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
-    Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerCall().getTps(), 1, 0);
-    Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerCall().getTotal(), 1);
+    Assert.assertEquals(4, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
-    //check ProducerMetrics
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getWaitInQueue(), 0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getCount(), 2);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getTotal(),
-        400,
+    Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getCount());
+    Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getTotal(),
         0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getAverage(),
-        200,
+    Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getAverage(),
         0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getMax(),
-        300,
+    Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getMax(),
         0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getMin(),
-        100,
+    Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getMin(),
         0);
 
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getCount(), 2);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getTotal(),
-        600,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getAverage(),
-        300,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getMax(),
-        400,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getMin(),
-        200,
-        0);
+    Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+    Assert.assertEquals(0, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getCount(), 2);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getTotal(),
-        1000,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getAverage(),
-        500,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getMax(),
-        700,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getMin(),
-        300,
-        0);
+    Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+    Assert.assertEquals(0, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerCall().getTps(), 2, 0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerCall().getTotal(), 2);
+    //check ProducerMetrics
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun1").getWaitInQueue());
+    Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getCount());
+    Assert.assertEquals(400, model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getTotal(), 0);
+    Assert.assertEquals(200, model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getAverage(), 0);
+    Assert.assertEquals(300, model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getMax(), 0);
+    Assert.assertEquals(100, model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getMin(), 0);
+
+    Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getExecutionTime().getCount());
+    Assert.assertEquals(600, model.getProducerMetrics().get("fun1").getExecutionTime().getTotal(), 0);
+    Assert.assertEquals(300, model.getProducerMetrics().get("fun1").getExecutionTime().getAverage(), 0);
+    Assert.assertEquals(400, model.getProducerMetrics().get("fun1").getExecutionTime().getMax(), 0);
+    Assert.assertEquals(200, model.getProducerMetrics().get("fun1").getExecutionTime().getMin(), 0);
+
+    Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getProducerLatency().getCount());
+    Assert.assertEquals(1000, model.getProducerMetrics().get("fun1").getProducerLatency().getTotal(), 0);
+    Assert.assertEquals(500, model.getProducerMetrics().get("fun1").getProducerLatency().getAverage(), 0);
+    Assert.assertEquals(700, model.getProducerMetrics().get("fun1").getProducerLatency().getMax(), 0);
+    Assert.assertEquals(300, model.getProducerMetrics().get("fun1").getProducerLatency().getMin(), 0);
+
+    Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+    Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+
+    Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getProducerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+    Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
     //fun3
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getWaitInQueue(), 0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getCount(), 1);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getTotal(),
-        500,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getAverage(),
-        500,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getMax(),
-        500,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getMin(),
-        500,
-        0);
-
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getCount(), 0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getTotal(),
-        0,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getAverage(),
-        0,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getMax(),
-        0,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getMin(),
-        0,
-        0);
-
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getCount(), 0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getTotal(),
-        0,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getAverage(),
-        0,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getMax(),
-        0,
-        0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getMin(),
-        0,
-        0);
-
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerCall().getTps(), 1, 0);
-    Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerCall().getTotal(), 1);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getWaitInQueue());
+    Assert.assertEquals(1, model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getCount());
+    Assert.assertEquals(500, model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getTotal(), 0);
+    Assert.assertEquals(500, model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getAverage(), 0);
+    Assert.assertEquals(500, model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getMax(), 0);
+    Assert.assertEquals(500, model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getMin(), 0);
+
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getExecutionTime().getCount());
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getExecutionTime().getTotal(), 0);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getExecutionTime().getAverage(), 0);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getExecutionTime().getMax(), 0);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getExecutionTime().getMin(), 0);
+
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerLatency().getCount());
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerLatency().getTotal(), 0);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerLatency().getAverage(), 0);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerLatency().getMax(), 0);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerLatency().getMin(), 0);
+
+    Assert.assertEquals(1, model.getProducerMetrics().get("fun3").getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+
+    Assert.assertEquals(1, model.getProducerMetrics().get("fun3").getProducerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+    Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
     //check ConsumerMetrics
     //no need
-    Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getCount(), 1);
-    Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getTotal(),
-        300,
-        0);
-    Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getAverage(),
-        300,
-        0);
-    Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getMax(),
-        300,
-        0);
-    Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getMin(),
-        300,
-        0);
-
-    Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerCall().getTps(), 1, 0);
-    Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerCall().getTotal(), 1);
+    Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerLatency().getCount());
+    Assert.assertEquals(300, model.getConsumerMetrics().get("fun2").getConsumerLatency().getTotal(), 0);
+    Assert.assertEquals(300, model.getConsumerMetrics().get("fun2").getConsumerLatency().getAverage(), 0);
+    Assert.assertEquals(300, model.getConsumerMetrics().get("fun2").getConsumerLatency().getMax(), 0);
+    Assert.assertEquals(300, model.getConsumerMetrics().get("fun2").getConsumerLatency().getMin(), 0);
+
+    Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+    Assert.assertEquals(0, model.getConsumerMetrics().get("fun2").getConsumerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+
+    Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+    Assert.assertEquals(0, model.getConsumerMetrics().get("fun2").getConsumerCall()
+        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
     Map<String, Number> metrics = model.toMap();
-    Assert.assertEquals(96, metrics.size());
-
-    Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getCpuLoad(), 1.0, 0);
-    Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getCpuRunningThreads(), 2, 0);
-    Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapCommit(), 100, 0);
-    Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapInit(), 200, 0);
-    Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapMax(), 300, 0);
-    Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapUsed(), 400, 0);
-    Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapCommit(), 500, 0);
-    Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapInit(), 600, 0);
-    Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapMax(), 700, 0);
-    Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapUsed(), 800, 0);
+    Assert.assertEquals(120, metrics.size());
+
+    Assert.assertEquals(1.0, model.getInstanceMetric().getSystemMetric().getCpuLoad(), 0);
+    Assert.assertEquals(2, model.getInstanceMetric().getSystemMetric().getCpuRunningThreads(), 0);
+    Assert.assertEquals(100, model.getInstanceMetric().getSystemMetric().getHeapCommit(), 0);
+    Assert.assertEquals(200, model.getInstanceMetric().getSystemMetric().getHeapInit(), 0);
+    Assert.assertEquals(300, model.getInstanceMetric().getSystemMetric().getHeapMax(), 0);
+    Assert.assertEquals(400, model.getInstanceMetric().getSystemMetric().getHeapUsed(), 0);
+    Assert.assertEquals(500, model.getInstanceMetric().getSystemMetric().getNonHeapCommit(), 0);
+    Assert.assertEquals(600, model.getInstanceMetric().getSystemMetric().getNonHeapInit(), 0);
+    Assert.assertEquals(700, model.getInstanceMetric().getSystemMetric().getNonHeapMax(), 0);
+    Assert.assertEquals(800, model.getInstanceMetric().getSystemMetric().getNonHeapUsed(), 0);
   }
-}
+}
\ No newline at end of file
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestPublisher.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestPublisher.java
index ef44bc7..55bd705 100644
--- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestPublisher.java
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestPublisher.java
@@ -19,7 +19,6 @@ package org.apache.servicecomb.metrics.core;
 
 import static org.hamcrest.Matchers.containsInAnyOrder;
 
-import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -36,7 +35,7 @@ import org.junit.Test;
 public class TestPublisher {
 
   @Test
-  public void test() throws IOException {
+  public void test() {
     SystemMonitor systemMonitor = new DefaultSystemMonitor();
     RegistryMonitor registryMonitor = new RegistryMonitor(systemMonitor);
     DefaultDataSource dataSource = new DefaultDataSource(registryMonitor, "1000,2000,3000,3000,2000,1000");
@@ -44,11 +43,11 @@ public class TestPublisher {
 
     RegistryMetric registryMetric = publisher.metrics();
     Map<String, Number> metricsMap = registryMetric.toMap();
-    Assert.assertEquals(35, metricsMap.size());
+    Assert.assertEquals(31, metricsMap.size());
 
     registryMetric = publisher.metricsWithWindowTime(1000);
     metricsMap = registryMetric.toMap();
-    Assert.assertEquals(35, metricsMap.size());
+    Assert.assertEquals(31, metricsMap.size());
 
     List<Long> appliedWindowTime = publisher.getAppliedWindowTime();
     Assert.assertEquals(appliedWindowTime.size(), 3);

-- 
To stop receiving notification emails like this one, please contact
ningjiang@apache.org.