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 6eb8066aa52ab7f9d7cd465bfa1d328dcea4d404
Author: zhengyangyong <yangyong.zh...@huawei.com>
AuthorDate: Thu Dec 21 16:29:05 2017 +0800

    JAV-539 & SCB-9 fix pr comment separate Consumer and Producer invocation 
metric
    SCB-91 All Monitor can convert to Map with plain-key when polling data
    
    Signed-off-by: zhengyangyong <yangyong.zh...@huawei.com>
---
 .../{metric/CallMetric.java => MetricsConst.java}  |  29 +--
 .../InvocationStartProcessingEventListener.java    |   1 +
 .../metrics/core/metric/CallMetric.java            |  24 ++-
 ...elMetric.java => ConsumerInvocationMetric.java} |  51 ++---
 .../metrics/core/metric/InstanceMetric.java        |  35 ++-
 .../metrics/core/metric/InvocationMetric.java      |  24 ++-
 ...elMetric.java => ProducerInvocationMetric.java} |  40 ++--
 .../metrics/core/metric/RegistryMetric.java        |  89 ++++++--
 .../metrics/core/metric/TimerMetric.java           |  27 ++-
 .../metrics/core/monitor/CallMonitor.java          |  12 +-
 .../metrics/core/monitor/InvocationMonitor.java    |  75 +++++--
 .../InvocationMonitorType.java}                    |  31 +--
 .../metrics/core/monitor/RegistryMonitor.java      |  12 +-
 .../metrics/core/monitor/TimerMonitor.java         |  15 +-
 .../metrics/core/publish/DefaultDataSource.java    |  20 +-
 .../metrics/core/TestEventAndRunner.java           | 237 ++++++++++++++-------
 .../src/main/resources/microservice.yaml           |   2 +-
 17 files changed, 438 insertions(+), 286 deletions(-)

diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsConst.java
similarity index 62%
copy from 
metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java
copy to 
metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsConst.java
index 7fa5299..5554796 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsConst.java
@@ -15,31 +15,14 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.core.metric;
+package io.servicecomb.metrics.core;
 
-public class CallMetric {
-  private final long total;
+public class MetricsConst {
+  public static final String CONSUMER_PREFIX_TEMPLATE = 
"servicecomb.%s.consumer";
 
-  private final double tps;
+  public static final String PRODUCER_PREFIX_TEMPLATE = 
"servicecomb.%s.producer";
 
-  public long getTotal() {
-    return total;
-  }
+  public static final String INSTANCE_CONSUMER_PREFIX = 
String.format(CONSUMER_PREFIX_TEMPLATE, "instance");
 
-  public double getTps() {
-    return tps;
-  }
-
-  public CallMetric() {
-    this(0, 0);
-  }
-
-  public CallMetric(long total, double tps) {
-    this.total = total;
-    this.tps = tps;
-  }
-
-  public CallMetric merge(CallMetric metric) {
-    return new CallMetric(this.total + metric.total, this.tps + metric.tps);
-  }
+  public static final String INSTANCE_PRODUCER_PREFIX = 
String.format(PRODUCER_PREFIX_TEMPLATE, "instance");
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/event/InvocationStartProcessingEventListener.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/event/InvocationStartProcessingEventListener.java
index 1aabd22..d0288f4 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/event/InvocationStartProcessingEventListener.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/event/InvocationStartProcessingEventListener.java
@@ -43,6 +43,7 @@ public class InvocationStartProcessingEventListener 
implements EventListener {
     InvocationMonitor monitor = 
registryMonitor.getInvocationMonitor(event.getOperationName());
     //TODO:current java chassis unable know invocation type before starting 
process,so all type WaitInQueue increment(-1) (decrement)
     monitor.getWaitInQueue().increment(-1);
+    monitor.setInvocationMonitorType(event.getInvocationType());
     if (InvocationType.PRODUCER.equals(event.getInvocationType())) {
       monitor.getLifeTimeInQueue().update(event.getInQueueNanoTime());
       monitor.getProducerCall().increment();
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java
index 7fa5299..84a06e4 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java
@@ -17,7 +17,15 @@
 
 package io.servicecomb.metrics.core.metric;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 public class CallMetric {
+  @JsonIgnore
+  private final String prefix;
+
   private final long total;
 
   private final double tps;
@@ -30,16 +38,24 @@ public class CallMetric {
     return tps;
   }
 
-  public CallMetric() {
-    this(0, 0);
+  public CallMetric(String prefix) {
+    this(prefix, 0, 0);
   }
 
-  public CallMetric(long total, double tps) {
+  public CallMetric(String prefix, long total, double tps) {
+    this.prefix = prefix;
     this.total = total;
     this.tps = tps;
   }
 
   public CallMetric merge(CallMetric metric) {
-    return new CallMetric(this.total + metric.total, this.tps + metric.tps);
+    return new CallMetric(this.prefix, this.total + metric.total, this.tps + 
metric.tps);
+  }
+
+  public Map<String, Number> toMap() {
+    Map<String, Number> metrics = new HashMap<>();
+    metrics.put(prefix + ".total", total);
+    metrics.put(prefix + ".tps", tps);
+    return metrics;
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ModelMetric.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ConsumerInvocationMetric.java
similarity index 53%
copy from 
metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ModelMetric.java
copy to 
metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ConsumerInvocationMetric.java
index 7273171..f0059a3 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ModelMetric.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ConsumerInvocationMetric.java
@@ -17,58 +17,33 @@
 
 package io.servicecomb.metrics.core.metric;
 
-public abstract class ModelMetric {
-  private final long waitInQueue;
-
-  private final TimerMetric lifeTimeInQueue;
-
-  private final TimerMetric executionTime;
+import java.util.HashMap;
+import java.util.Map;
 
+public class ConsumerInvocationMetric extends InvocationMetric {
   private final TimerMetric consumerLatency;
 
-  private final TimerMetric producerLatency;
-
   private final CallMetric consumerCall;
 
-  private final CallMetric producerCall;
-
-  public long getWaitInQueue() {
-    return waitInQueue;
-  }
-
-  public TimerMetric getLifeTimeInQueue() {
-    return lifeTimeInQueue;
-  }
-
-  public TimerMetric getExecutionTime() {
-    return executionTime;
-  }
-
   public TimerMetric getConsumerLatency() {
     return consumerLatency;
   }
 
-  public TimerMetric getProducerLatency() {
-    return producerLatency;
-  }
-
   public CallMetric getConsumerCall() {
     return consumerCall;
   }
 
-  public CallMetric getProducerCall() {
-    return producerCall;
-  }
-
-  public ModelMetric(long waitInQueue,
-      TimerMetric lifeTimeInQueue, TimerMetric executionTime, TimerMetric 
consumerLatency,
-      TimerMetric producerLatency, CallMetric consumerCall, CallMetric 
producerCall) {
-    this.waitInQueue = waitInQueue;
-    this.lifeTimeInQueue = lifeTimeInQueue;
-    this.executionTime = executionTime;
+  public ConsumerInvocationMetric(String operationName, String prefix, long 
waitInQueue,
+      TimerMetric consumerLatency, CallMetric consumerCall) {
+    super(operationName, prefix, waitInQueue);
     this.consumerLatency = consumerLatency;
-    this.producerLatency = producerLatency;
     this.consumerCall = consumerCall;
-    this.producerCall = producerCall;
+  }
+
+  public Map<String, Number> toMap() {
+    Map<String, Number> metrics = new HashMap<>();
+    metrics.putAll(consumerLatency.toMap());
+    metrics.putAll(consumerCall.toMap());
+    return metrics;
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/InstanceMetric.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/InstanceMetric.java
index c3e8fa1..7a934bd 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/InstanceMetric.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/InstanceMetric.java
@@ -17,18 +17,35 @@
 
 package io.servicecomb.metrics.core.metric;
 
-public class InstanceMetric extends ModelMetric {
+public class InstanceMetric {
+  private final long waitInQueue;
 
-  private final SystemMetric systemMetric;
+  private final ConsumerInvocationMetric consumerMetric;
 
-  public SystemMetric getSystemMetric() {
-    return systemMetric;
+  private final ProducerInvocationMetric producerMetric;
+
+  public long getWaitInQueue() {
+    return waitInQueue;
+  }
+
+  public ConsumerInvocationMetric getConsumerMetric() {
+    return consumerMetric;
+  }
+
+  public ProducerInvocationMetric getProducerMetric() {
+    return producerMetric;
+  }
+
+  public InstanceMetric() {
+    waitInQueue = 0;
+    consumerMetric = null;
+    producerMetric = null;
   }
 
-  public InstanceMetric(long waitInQueue, SystemMetric systemMetric,
-      TimerMetric lifeTimeInQueue, TimerMetric executionTime, TimerMetric 
consumerLatency,
-      TimerMetric producerLatency) {
-    super(waitInQueue, lifeTimeInQueue, executionTime, consumerLatency, 
producerLatency);
-    this.systemMetric = systemMetric;
+  public InstanceMetric(long waitInQueue, ConsumerInvocationMetric 
consumerMetric,
+      ProducerInvocationMetric producerMetric) {
+    this.waitInQueue = waitInQueue;
+    this.consumerMetric = consumerMetric;
+    this.producerMetric = producerMetric;
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/InvocationMetric.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/InvocationMetric.java
index e1b5e3e..03c66db 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/InvocationMetric.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/InvocationMetric.java
@@ -17,17 +17,31 @@
 
 package io.servicecomb.metrics.core.metric;
 
-public class InvocationMetric extends ModelMetric {
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+public class InvocationMetric {
   private final String operationName;
 
+  @JsonIgnore
+  private final String prefix;
+
+  private final long waitInQueue;
+
   public String getOperationName() {
     return operationName;
   }
 
-  public InvocationMetric(String operationName, long waitInQueue,
-      TimerMetric lifeTimeInQueue, TimerMetric executionTime, TimerMetric 
consumerLatency,
-      TimerMetric producerLatency, CallMetric consumerCall, CallMetric 
producerCall) {
-    super(waitInQueue, lifeTimeInQueue, executionTime, consumerLatency, 
producerLatency, consumerCall, producerCall);
+  public String getPrefix() {
+    return prefix;
+  }
+
+  public long getWaitInQueue() {
+    return waitInQueue;
+  }
+
+  public InvocationMetric(String operationName, String prefix, long 
waitInQueue) {
     this.operationName = operationName;
+    this.prefix = prefix;
+    this.waitInQueue = waitInQueue;
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ModelMetric.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ProducerInvocationMetric.java
similarity index 70%
rename from 
metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ModelMetric.java
rename to 
metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ProducerInvocationMetric.java
index 7273171..4eaa8c3 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ModelMetric.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/ProducerInvocationMetric.java
@@ -17,25 +17,18 @@
 
 package io.servicecomb.metrics.core.metric;
 
-public abstract class ModelMetric {
-  private final long waitInQueue;
+import java.util.HashMap;
+import java.util.Map;
 
+public class ProducerInvocationMetric extends InvocationMetric {
   private final TimerMetric lifeTimeInQueue;
 
   private final TimerMetric executionTime;
 
-  private final TimerMetric consumerLatency;
-
   private final TimerMetric producerLatency;
 
-  private final CallMetric consumerCall;
-
   private final CallMetric producerCall;
 
-  public long getWaitInQueue() {
-    return waitInQueue;
-  }
-
   public TimerMetric getLifeTimeInQueue() {
     return lifeTimeInQueue;
   }
@@ -44,31 +37,30 @@ public abstract class ModelMetric {
     return executionTime;
   }
 
-  public TimerMetric getConsumerLatency() {
-    return consumerLatency;
-  }
-
   public TimerMetric getProducerLatency() {
     return producerLatency;
   }
 
-  public CallMetric getConsumerCall() {
-    return consumerCall;
-  }
-
   public CallMetric getProducerCall() {
     return producerCall;
   }
 
-  public ModelMetric(long waitInQueue,
-      TimerMetric lifeTimeInQueue, TimerMetric executionTime, TimerMetric 
consumerLatency,
-      TimerMetric producerLatency, CallMetric consumerCall, CallMetric 
producerCall) {
-    this.waitInQueue = waitInQueue;
+  public ProducerInvocationMetric(String operationName, String prefix, long 
waitInQueue,
+      TimerMetric lifeTimeInQueue, TimerMetric executionTime, TimerMetric 
producerLatency, CallMetric producerCall) {
+    super(operationName, prefix, waitInQueue);
     this.lifeTimeInQueue = lifeTimeInQueue;
     this.executionTime = executionTime;
-    this.consumerLatency = consumerLatency;
     this.producerLatency = producerLatency;
-    this.consumerCall = consumerCall;
     this.producerCall = producerCall;
   }
+
+  public Map<String, Number> toMap() {
+    Map<String, Number> metrics = new HashMap<>();
+    metrics.put(getPrefix() + ".waitInQueue.count", getWaitInQueue());
+    metrics.putAll(lifeTimeInQueue.toMap());
+    metrics.putAll(executionTime.toMap());
+    metrics.putAll(producerLatency.toMap());
+    metrics.putAll(producerCall.toMap());
+    return metrics;
+  }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/RegistryMetric.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/RegistryMetric.java
index bf7b5e8..7238f92 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/RegistryMetric.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/RegistryMetric.java
@@ -17,48 +17,93 @@
 
 package io.servicecomb.metrics.core.metric;
 
+import java.util.HashMap;
 import java.util.Map;
 
-import io.servicecomb.metrics.core.monitor.RegistryMonitor;
+import io.servicecomb.metrics.core.MetricsConst;
 
 public class RegistryMetric {
 
   private final InstanceMetric instanceMetric;
 
-  private final Map<String, InvocationMetric> invocationMetrics;
+  private final Map<String, ConsumerInvocationMetric> consumerMetrics;
+
+  private final Map<String, ProducerInvocationMetric> producerMetrics;
 
   public InstanceMetric getInstanceMetric() {
     return instanceMetric;
   }
 
-  public Map<String, InvocationMetric> getInvocationMetrics() {
-    return invocationMetrics;
+  public Map<String, ConsumerInvocationMetric> getConsumerMetrics() {
+    return consumerMetrics;
+  }
+
+  public Map<String, ProducerInvocationMetric> getProducerMetrics() {
+    return producerMetrics;
   }
 
-  public RegistryMetric(RegistryMonitor registryMonitor, int pollerIndex) {
-    invocationMetrics = registryMonitor.toInvocationMetrics(pollerIndex);
+  public RegistryMetric() {
+    consumerMetrics = new HashMap<>();
+    producerMetrics = new HashMap<>();
+    instanceMetric = new InstanceMetric();
+  }
 
+  public RegistryMetric(Map<String, InvocationMetric> invocationMetrics) {
     //sum instance level metric
-    long waitInQueue = 0;
-    TimerMetric lifeTimeInQueue = new TimerMetric();
-    TimerMetric executionTime = new TimerMetric();
-    TimerMetric consumerLatency = new TimerMetric();
-    TimerMetric producerLatency = new TimerMetric();
+    consumerMetrics = new HashMap<>();
+    producerMetrics = new HashMap<>();
 
-    CallMetric consumerCall = new CallMetric();
-    CallMetric producerCall = new CallMetric();
+    //TODO:current java chassis unable know invocation type before starting 
process,ProducerInvocation + UnknownTypeInvocation
+    long totalWaitInQueue = 0;
+    long producerWaitInQueue = 0;
+    TimerMetric lifeTimeInQueue = new 
TimerMetric(MetricsConst.INSTANCE_PRODUCER_PREFIX + ".lifeTimeInQueue");
+    TimerMetric executionTime = new 
TimerMetric(MetricsConst.INSTANCE_PRODUCER_PREFIX + ".executionTime");
+    TimerMetric consumerLatency = new 
TimerMetric(MetricsConst.INSTANCE_CONSUMER_PREFIX + ".consumerLatency");
+    TimerMetric producerLatency = new 
TimerMetric(MetricsConst.INSTANCE_PRODUCER_PREFIX + ".producerLatency");
+    CallMetric consumerCall = new 
CallMetric(MetricsConst.INSTANCE_CONSUMER_PREFIX + ".consumerCall");
+    CallMetric producerCall = new 
CallMetric(MetricsConst.INSTANCE_PRODUCER_PREFIX + ".producerCall");
 
     for (InvocationMetric metric : invocationMetrics.values()) {
-      waitInQueue += metric.getWaitInQueue();
-      lifeTimeInQueue = lifeTimeInQueue.merge(metric.getLifeTimeInQueue());
-      executionTime = executionTime.merge(metric.getExecutionTime());
-      consumerLatency = consumerLatency.merge(metric.getConsumerLatency());
-      producerLatency = producerLatency.merge(metric.getProducerLatency());
-      consumerCall = consumerCall.merge(metric.getConsumerCall());
-      producerCall = producerCall.merge(metric.getProducerCall());
+      if (metric != null) {
+        if (metric instanceof ConsumerInvocationMetric) {
+          ConsumerInvocationMetric consumerMetric = (ConsumerInvocationMetric) 
metric;
+          consumerLatency = 
consumerLatency.merge(consumerMetric.getConsumerLatency());
+          consumerCall = consumerCall.merge(consumerMetric.getConsumerCall());
+          consumerMetrics.put(metric.getOperationName(), consumerMetric);
+        } else if (metric instanceof ProducerInvocationMetric) {
+          ProducerInvocationMetric producerMetric = (ProducerInvocationMetric) 
metric;
+          totalWaitInQueue += producerMetric.getWaitInQueue();
+          producerWaitInQueue += producerMetric.getWaitInQueue();
+          lifeTimeInQueue = 
lifeTimeInQueue.merge(producerMetric.getLifeTimeInQueue());
+          executionTime = 
executionTime.merge(producerMetric.getExecutionTime());
+          producerLatency = 
producerLatency.merge(producerMetric.getProducerLatency());
+          producerCall = producerCall.merge(producerMetric.getProducerCall());
+          producerMetrics.put(metric.getOperationName(), producerMetric);
+        } else {
+          totalWaitInQueue += metric.getWaitInQueue();
+        }
+      }
     }
 
-    instanceMetric = new InstanceMetric(waitInQueue, lifeTimeInQueue, 
executionTime, consumerLatency, producerLatency,
-        consumerCall, producerCall);
+    instanceMetric = new InstanceMetric(totalWaitInQueue,
+        new ConsumerInvocationMetric("instance", 
MetricsConst.INSTANCE_CONSUMER_PREFIX,
+            producerWaitInQueue, consumerLatency, consumerCall),
+        new ProducerInvocationMetric("instance", 
MetricsConst.INSTANCE_PRODUCER_PREFIX,
+            totalWaitInQueue, lifeTimeInQueue, executionTime, producerLatency, 
producerCall));
+  }
+
+  public Map<String, Number> toMap() {
+    Map<String, Number> metrics = new HashMap<>();
+    metrics.putAll(instanceMetric.getConsumerMetric().toMap());
+    metrics.putAll(instanceMetric.getProducerMetric().toMap());
+    //will override waitInQueue.count value
+    metrics.put(MetricsConst.INSTANCE_PRODUCER_PREFIX + ".waitInQueue.count", 
instanceMetric.getWaitInQueue());
+    for (ConsumerInvocationMetric metric : consumerMetrics.values()) {
+      metrics.putAll(metric.toMap());
+    }
+    for (ProducerInvocationMetric metric : producerMetrics.values()) {
+      metrics.putAll(metric.toMap());
+    }
+    return metrics;
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/TimerMetric.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/TimerMetric.java
index 40f82ff..d2587cf 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/TimerMetric.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/TimerMetric.java
@@ -17,7 +17,15 @@
 
 package io.servicecomb.metrics.core.metric;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 public class TimerMetric {
+  @JsonIgnore
+  private final String prefix;
+
   private final long total;
 
   private final long count;
@@ -48,11 +56,12 @@ public class TimerMetric {
     return max;
   }
 
-  public TimerMetric() {
-    this(0, 0, 0, 0);
+  public TimerMetric(String prefix) {
+    this(prefix, 0, 0, 0, 0);
   }
 
-  public TimerMetric(long total, long count, long min, long max) {
+  public TimerMetric(String prefix, long total, long count, long min, long 
max) {
+    this.prefix = prefix;
     this.total = total;
     this.count = count;
     if (count != 0) {
@@ -65,7 +74,7 @@ public class TimerMetric {
   }
 
   public TimerMetric merge(TimerMetric metric) {
-    return new TimerMetric(this.total + metric.total, this.count + 
metric.count,
+    return new TimerMetric(this.prefix, this.total + metric.total, this.count 
+ metric.count,
         getMin(this.min, metric.min), getMax(this.max, metric.max));
   }
 
@@ -76,4 +85,14 @@ public class TimerMetric {
   private long getMax(long value1, long value2) {
     return value2 > value1 ? value2 : value1;
   }
+
+  public Map<String, Number> toMap() {
+    Map<String, Number> metrics = new HashMap<>();
+    metrics.put(prefix + ".total", total);
+    metrics.put(prefix + ".count", count);
+    metrics.put(prefix + ".average", average);
+    metrics.put(prefix + ".max", max);
+    metrics.put(prefix + ".min", min);
+    return metrics;
+  }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/CallMonitor.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/CallMonitor.java
index ec38caf..259a604 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/CallMonitor.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/CallMonitor.java
@@ -24,13 +24,16 @@ import com.netflix.servo.monitor.StepCounter;
 import io.servicecomb.metrics.core.metric.CallMetric;
 
 public class CallMonitor {
+  private final String prefix;
+
   private final BasicCounter total;
 
   private final StepCounter tps;
 
-  public CallMonitor(String name) {
-    this.total = new BasicCounter(MonitorConfig.builder(name + 
".total").build());
-    this.tps = new StepCounter(MonitorConfig.builder(name + ".tps").build());
+  public CallMonitor(String prefix) {
+    this.prefix = prefix;
+    this.total = new BasicCounter(MonitorConfig.builder(prefix + 
".total").build());
+    this.tps = new StepCounter(MonitorConfig.builder(prefix + ".tps").build());
   }
 
   public void increment() {
@@ -39,6 +42,7 @@ public class CallMonitor {
   }
 
   public CallMetric toCallMetric(int pollerIndex) {
-    return new CallMetric(total.getValue(pollerIndex).longValue(), 
tps.getValue(pollerIndex).doubleValue());
+    return new CallMetric(this.prefix, total.getValue(pollerIndex).longValue(),
+        tps.getValue(pollerIndex).doubleValue());
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/InvocationMonitor.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/InvocationMonitor.java
index d3588f5..e11ee89 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/InvocationMonitor.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/InvocationMonitor.java
@@ -20,31 +20,49 @@ package io.servicecomb.metrics.core.monitor;
 import com.netflix.servo.monitor.BasicCounter;
 import com.netflix.servo.monitor.MonitorConfig;
 
+import io.servicecomb.metrics.core.MetricsConst;
+import io.servicecomb.metrics.core.metric.ConsumerInvocationMetric;
 import io.servicecomb.metrics.core.metric.InvocationMetric;
+import io.servicecomb.metrics.core.metric.ProducerInvocationMetric;
+import io.servicecomb.swagger.invocation.InvocationType;
 
 public class InvocationMonitor {
   private final String operationName;
 
+  private final String consumerPrefix;
+
+  private final String producerPrefix;
+
   private final BasicCounter waitInQueue;
 
   private final TimerMonitor lifeTimeInQueue;
 
   private final TimerMonitor executionTime;
 
+  private final TimerMonitor producerLatency;
+
   private final TimerMonitor consumerLatency;
 
-  private final TimerMonitor producerLatency;
+  private final CallMonitor producerCall;
 
   private final CallMonitor consumerCall;
 
-  private final CallMonitor producerCall;
+  private InvocationMonitorType invocationMonitorType = 
InvocationMonitorType.UNKNOWN;
+
+  //TODO:current java chassis unable know invocation type before starting 
process,so we need set it,can improve later
+  public void setInvocationMonitorType(InvocationType invocationType) {
+    if (InvocationMonitorType.UNKNOWN.equals(this.invocationMonitorType)) {
+      this.invocationMonitorType = invocationType == InvocationType.PRODUCER ?
+          InvocationMonitorType.PRODUCER : InvocationMonitorType.CONSUMER;
+    }
+  }
 
   public String getOperationName() {
     return operationName;
   }
 
-  public BasicCounter getWaitInQueue() {
-    return waitInQueue;
+  public TimerMonitor getConsumerLatency() {
+    return consumerLatency;
   }
 
   public TimerMonitor getLifeTimeInQueue() {
@@ -55,10 +73,6 @@ public class InvocationMonitor {
     return executionTime;
   }
 
-  public TimerMonitor getConsumerLatency() {
-    return consumerLatency;
-  }
-
   public TimerMonitor getProducerLatency() {
     return producerLatency;
   }
@@ -71,25 +85,40 @@ public class InvocationMonitor {
     return producerCall;
   }
 
+  public BasicCounter getWaitInQueue() {
+    return waitInQueue;
+  }
+
   public InvocationMonitor(String operationName) {
     this.operationName = operationName;
-    this.waitInQueue = new BasicCounter(MonitorConfig.builder(operationName + 
".waitInQueue.count").build());
-    this.lifeTimeInQueue = new TimerMonitor(operationName + 
".lifeTimeInQueue");
-    this.executionTime = new TimerMonitor(operationName + ".executionTime");
-    this.consumerLatency = new TimerMonitor(operationName + 
".consumerLatency");
-    this.producerLatency = new TimerMonitor(operationName + 
".producerLatency");
-
-    this.consumerCall = new CallMonitor(operationName + ".consumerCall");
-    this.producerCall = new CallMonitor(operationName + ".producerCall");
+    this.consumerPrefix = String.format(MetricsConst.CONSUMER_PREFIX_TEMPLATE, 
operationName);
+    this.producerPrefix = String.format(MetricsConst.PRODUCER_PREFIX_TEMPLATE, 
operationName);
+    this.waitInQueue = new BasicCounter(MonitorConfig.builder(producerPrefix + 
".waitInQueue.count").build());
+
+    this.consumerLatency = new TimerMonitor(consumerPrefix + 
".consumerLatency");
+    this.consumerCall = new CallMonitor(consumerPrefix + ".consumerCall");
+
+    this.lifeTimeInQueue = new TimerMonitor(producerPrefix + 
".lifeTimeInQueue");
+    this.executionTime = new TimerMonitor(producerPrefix + ".executionTime");
+    this.producerLatency = new TimerMonitor(producerPrefix + 
".producerLatency");
+    this.producerCall = new CallMonitor(producerPrefix + ".producerCall");
   }
 
   public InvocationMetric toInvocationMetric(int pollerIndex) {
-    return new InvocationMetric(this.getOperationName(), 
this.getWaitInQueue().getValue(pollerIndex).longValue(),
-        this.lifeTimeInQueue.toTimerMetric(pollerIndex),
-        this.executionTime.toTimerMetric(pollerIndex),
-        this.consumerLatency.toTimerMetric(pollerIndex),
-        this.producerLatency.toTimerMetric(pollerIndex),
-        this.consumerCall.toCallMetric(pollerIndex),
-        this.producerCall.toCallMetric(pollerIndex));
+    InvocationMetric metric;
+    long queueCount = waitInQueue.getValue(pollerIndex).longValue();
+    if (invocationMonitorType.equals(InvocationMonitorType.PRODUCER)) {
+      metric = new ProducerInvocationMetric(operationName, producerPrefix, 
queueCount,
+          lifeTimeInQueue.toTimerMetric(pollerIndex),
+          executionTime.toTimerMetric(pollerIndex),
+          producerLatency.toTimerMetric(pollerIndex),
+          producerCall.toCallMetric(pollerIndex));
+    } else if (invocationMonitorType.equals(InvocationMonitorType.CONSUMER)) {
+      metric = new ConsumerInvocationMetric(operationName, consumerPrefix, 
queueCount,
+          consumerLatency.toTimerMetric(pollerIndex), 
consumerCall.toCallMetric(pollerIndex));
+    } else {
+      metric = new InvocationMetric(operationName, consumerPrefix, queueCount);
+    }
+    return metric;
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/InvocationMonitorType.java
similarity index 62%
copy from 
metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java
copy to 
metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/InvocationMonitorType.java
index 7fa5299..3ef00e3 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/InvocationMonitorType.java
@@ -15,31 +15,10 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.core.metric;
+package io.servicecomb.metrics.core.monitor;
 
-public class CallMetric {
-  private final long total;
-
-  private final double tps;
-
-  public long getTotal() {
-    return total;
-  }
-
-  public double getTps() {
-    return tps;
-  }
-
-  public CallMetric() {
-    this(0, 0);
-  }
-
-  public CallMetric(long total, double tps) {
-    this.total = total;
-    this.tps = tps;
-  }
-
-  public CallMetric merge(CallMetric metric) {
-    return new CallMetric(this.total + metric.total, this.tps + metric.tps);
-  }
+public enum InvocationMonitorType {
+  UNKNOWN,
+  CONSUMER,
+  PRODUCER
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/RegistryMonitor.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/RegistryMonitor.java
index 75ffc33..fd2fc53 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/RegistryMonitor.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/RegistryMonitor.java
@@ -17,13 +17,14 @@
 
 package io.servicecomb.metrics.core.monitor;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
 
 import org.springframework.stereotype.Component;
 
 import io.servicecomb.metrics.core.metric.InvocationMetric;
+import io.servicecomb.metrics.core.metric.RegistryMetric;
 
 @Component
 public class RegistryMonitor {
@@ -38,8 +39,11 @@ public class RegistryMonitor {
     return invocationMonitors.computeIfAbsent(operationName, i -> new 
InvocationMonitor(operationName));
   }
 
-  public Map<String, InvocationMetric> toInvocationMetrics(int pollerIndex) {
-    return 
invocationMonitors.values().stream().collect(Collectors.toMap(InvocationMonitor::getOperationName,
-        monitor -> monitor.toInvocationMetric(pollerIndex)));
+  public RegistryMetric toRegistryMetric(int pollerIndex) {
+    Map<String, InvocationMetric> invocationMetrics = new HashMap<>();
+    for (InvocationMonitor monitor : invocationMonitors.values()) {
+      invocationMetrics.put(monitor.getOperationName(), 
monitor.toInvocationMetric(pollerIndex));
+    }
+    return new RegistryMetric(invocationMetrics);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/TimerMonitor.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/TimerMonitor.java
index 8d7e276..a2120e3 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/TimerMonitor.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/TimerMonitor.java
@@ -25,6 +25,8 @@ import com.netflix.servo.monitor.StepCounter;
 import io.servicecomb.metrics.core.metric.TimerMetric;
 
 public class TimerMonitor {
+  private final String prefix;
+
   private final StepCounter total;
 
   private final StepCounter count;
@@ -42,15 +44,16 @@ public class TimerMonitor {
     }
   }
 
-  public TimerMonitor(String name) {
-    total = new StepCounter(MonitorConfig.builder(name + ".total").build());
-    count = new StepCounter(MonitorConfig.builder(name + ".count").build());
-    min = new MinGauge(MonitorConfig.builder(name + ".min").build());
-    max = new MaxGauge(MonitorConfig.builder(name + ".max").build());
+  public TimerMonitor(String prefix) {
+    this.prefix = prefix;
+    total = new StepCounter(MonitorConfig.builder(prefix + ".total").build());
+    count = new StepCounter(MonitorConfig.builder(prefix + ".count").build());
+    min = new MinGauge(MonitorConfig.builder(prefix + ".min").build());
+    max = new MaxGauge(MonitorConfig.builder(prefix + ".max").build());
   }
 
   public TimerMetric toTimerMetric(int pollerIndex) {
-    return new TimerMetric(total.getCount(pollerIndex), 
count.getCount(pollerIndex),
+    return new TimerMetric(this.prefix, total.getCount(pollerIndex), 
count.getCount(pollerIndex),
         min.getValue(pollerIndex), max.getValue(pollerIndex));
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultDataSource.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultDataSource.java
index 70ddb18..6aa0420 100644
--- 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultDataSource.java
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/publish/DefaultDataSource.java
@@ -31,7 +31,6 @@ import org.springframework.stereotype.Component;
 import com.netflix.config.DynamicPropertyFactory;
 import com.netflix.servo.monitor.Pollers;
 
-import io.servicecomb.metrics.core.extra.SystemResource;
 import io.servicecomb.metrics.core.metric.RegistryMetric;
 import io.servicecomb.metrics.core.monitor.RegistryMonitor;
 
@@ -45,19 +44,15 @@ public class DefaultDataSource implements DataSource {
 
   private final RegistryMonitor registryMonitor;
 
-  private final SystemResource systemResource;
-
   private final Map<Integer, RegistryMetric> registryMetrics;
 
   @Autowired
-  public DefaultDataSource(SystemResource systemResource, RegistryMonitor 
registryMonitor) {
-    this(systemResource, registryMonitor,
-        
DynamicPropertyFactory.getInstance().getStringProperty(METRICS_POLLING_TIME, 
"10000").get());
+  public DefaultDataSource(RegistryMonitor registryMonitor) {
+    this(registryMonitor, 
DynamicPropertyFactory.getInstance().getStringProperty(METRICS_POLLING_TIME, 
"10000").get());
   }
 
-  public DefaultDataSource(SystemResource systemResource, RegistryMonitor 
registryMonitor, String pollingSettings) {
+  public DefaultDataSource(RegistryMonitor registryMonitor, String 
pollingSettings) {
     this.registryMetrics = new ConcurrentHashMap<>();
-    this.systemResource = systemResource;
     this.registryMonitor = registryMonitor;
     //需要限制一下Polling的最小时间间隔, Servo推荐是10000(10秒),默认最低限制为100毫秒
     long minPollingTime = 
DynamicPropertyFactory.getInstance().getLongProperty(METRICS_POLLING_MIN, 
100).get();
@@ -68,10 +63,11 @@ public class DefaultDataSource implements DataSource {
     for (int index = 0; index < intervals.size(); index++) {
       int finalIndex = index;
       long finalInterval = intervals.get(finalIndex) < minPollingTime ? 
minPollingTime : intervals.get(finalIndex);
+      long pollerInterval = (long) (finalInterval * 0.5);
       final Runnable poller = () -> reloadRegistryMetric(finalIndex);
       Executors.newScheduledThreadPool(1)
           //for step counter correct work we need poll in time ,otherwise 
current step will return Datapoint.UNKNOWN (missing last sample)
-          .scheduleWithFixedDelay(poller, 0, (long) (finalInterval * 0.5), 
MILLISECONDS);
+          .scheduleWithFixedDelay(poller, pollerInterval, pollerInterval, 
MILLISECONDS);
       appliedIntervals.add(finalInterval);
     }
     this.appliedPollingIntervals = appliedIntervals;
@@ -79,7 +75,7 @@ public class DefaultDataSource implements DataSource {
 
   @Override
   public RegistryMetric getRegistryMetric(int pollerIndex) {
-    return registryMetrics.getOrDefault(pollerIndex, new 
RegistryMetric(systemResource, registryMonitor, pollerIndex));
+    return registryMetrics.getOrDefault(pollerIndex, new RegistryMetric());
   }
 
   @Override
@@ -87,7 +83,7 @@ public class DefaultDataSource implements DataSource {
     return appliedPollingIntervals;
   }
 
-  private void reloadRegistryMetric(Integer pollingIndex) {
-    registryMetrics.put(pollingIndex, new RegistryMetric(systemResource, 
registryMonitor, pollingIndex));
+  private void reloadRegistryMetric(Integer pollerIndex) {
+    registryMetrics.put(pollerIndex, 
registryMonitor.toRegistryMetric(pollerIndex));
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/io/servicecomb/metrics/core/TestEventAndRunner.java
 
b/metrics/metrics-core/src/test/java/io/servicecomb/metrics/core/TestEventAndRunner.java
index da7f02e..06d2b77 100644
--- 
a/metrics/metrics-core/src/test/java/io/servicecomb/metrics/core/TestEventAndRunner.java
+++ 
b/metrics/metrics-core/src/test/java/io/servicecomb/metrics/core/TestEventAndRunner.java
@@ -17,6 +17,8 @@
 
 package io.servicecomb.metrics.core;
 
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import org.junit.Assert;
@@ -39,8 +41,13 @@ public class TestEventAndRunner {
     RegistryMonitor monitor = new RegistryMonitor();
     DefaultDataSource dataSource = new DefaultDataSource(monitor, "2000");
 
+    List<Long> intervals = dataSource.getAppliedPollingIntervals();
+    Assert.assertEquals(intervals.size(), 1);
+    Assert.assertEquals(intervals.get(0).intValue(), 2000);
+
     DefaultEventListenerManager manager = new 
DefaultEventListenerManager(monitor);
 
+    //fun1 is a PRODUCER invocation call twice and all is completed
     EventUtils.triggerEvent(new InvocationStartedEvent("fun1", 
System.nanoTime()));
     EventUtils.triggerEvent(
         new InvocationStartProcessingEvent("fun1", InvocationType.PRODUCER, 
System.nanoTime(),
@@ -57,96 +64,164 @@ public class TestEventAndRunner {
         .triggerEvent(new InvocationFinishedEvent("fun1", 
InvocationType.PRODUCER, System.nanoTime(),
             TimeUnit.MILLISECONDS.toNanos(400), 
TimeUnit.MILLISECONDS.toNanos(700)));
 
-    EventUtils.triggerEvent(new InvocationStartedEvent("fun12", 
System.nanoTime()));
+    //fun3 is a PRODUCER invocation call uncompleted
+    EventUtils.triggerEvent(new InvocationStartedEvent("fun3", 
System.nanoTime()));
     EventUtils.triggerEvent(
-        new InvocationStartProcessingEvent("fun12", InvocationType.PRODUCER, 
System.nanoTime(),
+        new InvocationStartProcessingEvent("fun3", InvocationType.PRODUCER, 
System.nanoTime(),
             TimeUnit.MILLISECONDS.toNanos(500)));
+
+    //fun2 is a CONSUMER invocation call once and completed
+    EventUtils.triggerEvent(new InvocationStartedEvent("fun2", 
System.nanoTime()));
+    EventUtils.triggerEvent(
+        new InvocationStartProcessingEvent("fun2", InvocationType.CONSUMER, 
System.nanoTime(),
+            TimeUnit.MILLISECONDS.toNanos(100)));
     EventUtils
-        .triggerEvent(new InvocationFinishedEvent("fun12", 
InvocationType.PRODUCER, System.nanoTime(),
-            TimeUnit.MILLISECONDS.toNanos(600), 
TimeUnit.MILLISECONDS.toNanos(1100)));
+        .triggerEvent(new InvocationFinishedEvent("fun2", 
InvocationType.CONSUMER, System.nanoTime(),
+            TimeUnit.MILLISECONDS.toNanos(200), 
TimeUnit.MILLISECONDS.toNanos(300)));
 
-    EventUtils.triggerEvent(new InvocationStartedEvent("fun11", 
System.nanoTime()));
+    //fun4 is a invocation call only started and no processing start and 
finished
+    EventUtils.triggerEvent(new InvocationStartedEvent("fun4", 
System.nanoTime()));
 
     Thread.sleep(2000);
 
     RegistryMetric model = dataSource.getRegistryMetric(0);
 
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun1").getWaitInQueue(), 
0);
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun11").getWaitInQueue(), 
1);
+    //check InstanceMetric
     Assert.assertEquals(model.getInstanceMetric().getWaitInQueue(), 1);
-
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun1").getLifeTimeInQueue().getMin(),
-        TimeUnit.MILLISECONDS.toNanos(100),
-        0);
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun1").getLifeTimeInQueue().getMax(),
-        TimeUnit.MILLISECONDS.toNanos(300),
-        0);
-    Assert.assertEquals(
-        
model.getInvocationMetrics().get("fun1").getLifeTimeInQueue().getAverage(), 
TimeUnit.MILLISECONDS.toNanos(200),
-        0);
-    
Assert.assertEquals(model.getInstanceMetric().getLifeTimeInQueue().getMin(), 
TimeUnit.MILLISECONDS.toNanos(100), 0);
-    
Assert.assertEquals(model.getInstanceMetric().getLifeTimeInQueue().getMax(), 
TimeUnit.MILLISECONDS.toNanos(500), 0);
-    
Assert.assertEquals(model.getInstanceMetric().getLifeTimeInQueue().getAverage(),
 TimeUnit.MILLISECONDS.toNanos(300),
-        0);
-
-    Assert
-        
.assertEquals(model.getInvocationMetrics().get("fun1").getExecutionTime().getMin(),
-            TimeUnit.MILLISECONDS.toNanos(200), 0);
-    Assert
-        
.assertEquals(model.getInvocationMetrics().get("fun1").getExecutionTime().getMax(),
-            TimeUnit.MILLISECONDS.toNanos(400), 0);
-    Assert
-        
.assertEquals(model.getInvocationMetrics().get("fun1").getExecutionTime().getAverage(),
-            TimeUnit.MILLISECONDS.toNanos(300),
-            0);
-    Assert.assertEquals(model.getInstanceMetric().getExecutionTime().getMin(), 
TimeUnit.MILLISECONDS.toNanos(200), 0);
-    Assert.assertEquals(model.getInstanceMetric().getExecutionTime().getMax(), 
TimeUnit.MILLISECONDS.toNanos(600), 0);
-    Assert
-        
.assertEquals(model.getInstanceMetric().getExecutionTime().getAverage(), 
TimeUnit.MILLISECONDS.toNanos(400), 0);
-
-    Assert
-        
.assertEquals(model.getInvocationMetrics().get("fun1").getProducerLatency().getMin(),
-            TimeUnit.MILLISECONDS.toNanos(300), 0);
-    Assert
-        
.assertEquals(model.getInvocationMetrics().get("fun1").getProducerLatency().getMax(),
-            TimeUnit.MILLISECONDS.toNanos(700), 0);
-    Assert
-        
.assertEquals(model.getInvocationMetrics().get("fun1").getProducerLatency().getAverage(),
-            TimeUnit.MILLISECONDS.toNanos(500),
-            0);
-    
Assert.assertEquals(model.getInstanceMetric().getProducerLatency().getMin(), 
TimeUnit.MILLISECONDS.toNanos(300), 0);
-    Assert
-        .assertEquals(model.getInstanceMetric().getProducerLatency().getMax(), 
TimeUnit.MILLISECONDS.toNanos(1100), 0);
-    Assert
-        
.assertEquals(model.getInstanceMetric().getProducerLatency().getAverage(), 
TimeUnit.MILLISECONDS.toNanos(700),
-            0);
-
-    Assert
-        
.assertEquals(model.getInvocationMetrics().get("fun1").getConsumerLatency().getMin(),
-            TimeUnit.MILLISECONDS.toNanos(0), 0);
-    Assert
-        
.assertEquals(model.getInvocationMetrics().get("fun1").getConsumerLatency().getMax(),
-            TimeUnit.MILLISECONDS.toNanos(0), 0);
-    Assert
-        
.assertEquals(model.getInvocationMetrics().get("fun1").getConsumerLatency().getAverage(),
-            TimeUnit.MILLISECONDS.toNanos(0),
-            0);
-    
Assert.assertEquals(model.getInstanceMetric().getConsumerLatency().getMin(), 
TimeUnit.MILLISECONDS.toNanos(0), 0);
-    
Assert.assertEquals(model.getInstanceMetric().getConsumerLatency().getMax(), 
TimeUnit.MILLISECONDS.toNanos(0), 0);
-    Assert
-        
.assertEquals(model.getInstanceMetric().getConsumerLatency().getAverage(), 
TimeUnit.MILLISECONDS.toNanos(0), 0);
-
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun1").getConsumerCall().getTotal(),
 0, 0);
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun1").getConsumerCall().getTps(),
 0, 0);
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun1").getProducerCall().getTotal(),
 2, 0);
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun1").getProducerCall().getTps(),
 1.0, 0);
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun12").getConsumerCall().getTotal(),
 0, 0);
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun12").getConsumerCall().getTps(),
 0, 0);
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun12").getProducerCall().getTotal(),
 1, 0);
-    
Assert.assertEquals(model.getInvocationMetrics().get("fun12").getProducerCall().getTps(),
 0.5, 0);
-    
Assert.assertEquals(model.getInstanceMetric().getConsumerCall().getTotal(), 0, 
0);
-    Assert.assertEquals(model.getInstanceMetric().getConsumerCall().getTps(), 
0, 0);
-    
Assert.assertEquals(model.getInstanceMetric().getProducerCall().getTotal(), 3, 
0);
-    Assert.assertEquals(model.getInstanceMetric().getProducerCall().getTps(), 
1.5, 0);
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getWaitInQueue(),
 1);
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getCount(),
 3);
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getTotal(),
+        TimeUnit.MILLISECONDS.toNanos(900));
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(300), 0);
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(500));
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getLifeTimeInQueue().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(100));
+
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getCount(),
 2);
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getTotal(),
+        TimeUnit.MILLISECONDS.toNanos(600));
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(300), 0);
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(400));
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getExecutionTime().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(200));
+
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getCount(),
 2);
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getTotal(),
+        TimeUnit.MILLISECONDS.toNanos(1000));
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(500), 0);
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(700));
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerLatency().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(300));
+
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerCall().getTps(),
 1.5, 0);
+    
Assert.assertEquals(model.getInstanceMetric().getProducerMetric().getProducerCall().getTotal(),
 3);
+
+    
Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getCount(),
 1);
+    
Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getTotal(),
+        TimeUnit.MILLISECONDS.toNanos(300));
+    
Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(300), 0);
+    
Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(300));
+    
Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(300));
+
+    
Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerCall().getTps(),
 0.5, 0);
+    
Assert.assertEquals(model.getInstanceMetric().getConsumerMetric().getConsumerCall().getTotal(),
 1);
+
+    //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(),
+        TimeUnit.MILLISECONDS.toNanos(400));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(200), 0);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(300));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getLifeTimeInQueue().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(100));
+
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getCount(),
 2);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getTotal(),
+        TimeUnit.MILLISECONDS.toNanos(600));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(300), 0);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(400));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getExecutionTime().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(200));
+
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getCount(),
 2);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getTotal(),
+        TimeUnit.MILLISECONDS.toNanos(1000));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(500), 0);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(700));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerLatency().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(300));
+
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerCall().getTps(),
 1, 0);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun1").getProducerCall().getTotal(),
 2);
+
+    //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(),
+        TimeUnit.MILLISECONDS.toNanos(500));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(500), 0);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(500));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getLifeTimeInQueue().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(500));
+
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getCount(),
 0);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getTotal(),
+        TimeUnit.MILLISECONDS.toNanos(0));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(0), 0);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(0));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getExecutionTime().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(0));
+
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getCount(),
 0);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getTotal(),
+        TimeUnit.MILLISECONDS.toNanos(0));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(0), 0);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(0));
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerLatency().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(0));
+
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerCall().getTps(),
 0.5, 0);
+    
Assert.assertEquals(model.getProducerMetrics().get("fun3").getProducerCall().getTotal(),
 1);
+
+    //check ConsumerMetrics
+    //no need
+    
Assert.assertEquals(model.getConsumerMetrics().get("fun2").getWaitInQueue(), 0);
+    
Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getCount(),
 1);
+    
Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getTotal(),
+        TimeUnit.MILLISECONDS.toNanos(300));
+    
Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getAverage(),
+        TimeUnit.MILLISECONDS.toNanos(300), 0);
+    
Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getMax(),
+        TimeUnit.MILLISECONDS.toNanos(300));
+    
Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerLatency().getMin(),
+        TimeUnit.MILLISECONDS.toNanos(300));
+
+    
Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerCall().getTps(),
 0.5, 0);
+    
Assert.assertEquals(model.getConsumerMetrics().get("fun2").getConsumerCall().getTotal(),
 1);
+
+    Map<String, Number> metrics = model.toMap();
+    Assert.assertEquals(metrics.size(), 68);
   }
 }
diff --git 
a/metrics/metrics-sample/metrics-performance-test/src/main/resources/microservice.yaml
 
b/metrics/metrics-sample/metrics-performance-test/src/main/resources/microservice.yaml
index 664614c..52596aa 100644
--- 
a/metrics/metrics-sample/metrics-performance-test/src/main/resources/microservice.yaml
+++ 
b/metrics/metrics-sample/metrics-performance-test/src/main/resources/microservice.yaml
@@ -32,5 +32,5 @@ servicecomb:
   metrics:
     #polling setting
     polling:
-      #Support Muti Polling Time (MILLISECONDS) like 10000,60000 (10s and 60s)
+      #Support Muti-Polling Time (MILLISECONDS) like 10000,60000 (10s and 
60s), Use pollerIndex make selection,start from 0
       time: 10000
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
"commits@servicecomb.apache.org" <commits@servicecomb.apache.org>.

Reply via email to