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:37 UTC

[incubator-servicecomb-java-chassis] branch master updated (6dc4dbe -> bd87a72)

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

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


    from 6dc4dbe  SCB-230 Setup the snapshot deploy for the travis build
     new 37a2d03  SCB-150 add success/failed dimension for call count and tps
     new 98a141b  SCB-150 impl success /failed in invocation and event
     new e4bf630  SCB-150 minor refactor and fix test case
     new 3ed292d  SCB-150 minor refactor and fix test case
     new 14521ec  SCB-150 minor refactor for prometheus
     new 1e8a735  SCB-150 add module name
     new a103bf5  SCB-150 fix RegistryMetric serialization
     new cbd7092  SCB-150 update package name and resolve conflicts
     new 604afb2  SCB-150 fix pr comment
     new bd87a72  SCB-150 add Status Dimension output level support

The 10 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../common/rest/AbstractRestInvocation.java        |   2 +-
 .../org/apache/servicecomb/core/Invocation.java    |   4 +-
 .../core/metrics/InvocationFinishedEvent.java      |  17 +-
 .../core/provider/consumer/InvokerUtils.java       |  15 +-
 .../demo/springmvc/client/SpringmvcClient.java     |   6 +-
 .../demo/perf/PerfMetricsFilePublisher.java        |  15 +-
 metrics/metrics-common/pom.xml                     |   4 +-
 .../servicecomb/metrics/common/CallMetric.java     |  59 +++-
 .../metrics/common/DoubleMetricValue.java          |  56 ++++
 .../metrics/common/LongMetricValue.java            |  56 ++++
 .../servicecomb/metrics/common/MetricValue.java    |  70 +++++
 .../metrics/common/MetricsDimension.java           |  46 +++
 .../servicecomb/metrics/core/MetricsConfig.java    |   2 +
 .../core/event/DefaultEventListenerManager.java    |  17 +-
 .../event/InvocationFinishedEventListener.java     |  11 +-
 .../core/event/InvocationStartedEventListener.java |   5 +-
 .../event/dimension/CodeGroupStatusConvertor.java  |  45 +++
 .../core/event/dimension/CodeStatusConvertor.java  |  15 +-
 .../core/event/dimension/StatusConvertor.java      |   8 +-
 .../event/dimension/StatusConvertorFactory.java    |  53 ++++
 .../dimension/SuccessFailedStatusConvertor.java    |  16 +-
 .../metrics/core/monitor/CallMonitor.java          |  70 ++++-
 .../metrics/core/monitor/DefaultSystemMonitor.java |   5 +-
 .../metrics/core/monitor/TimerMonitor.java         |  24 +-
 .../metrics/core/utils/MonitorUtils.java           |  70 +++++
 .../metrics/core/TestEventAndRunner.java           | 348 +++++++++++----------
 .../servicecomb/metrics/core/TestPublisher.java    |   7 +-
 .../metrics/core/TestStatusDimension.java          | 158 ++++++++++
 metrics/metrics-extension/pom.xml                  |   1 +
 .../metrics-integration/metrics-prometheus/pom.xml |   1 +
 .../metrics/prometheus/MetricsCollector.java       |  83 ++++-
 .../servicecomb/samples/mwf/TestWriteFile.java     |  24 +-
 .../transport/highway/HighwayServerInvoke.java     |   2 +-
 33 files changed, 1021 insertions(+), 294 deletions(-)
 create mode 100644 metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java
 create mode 100644 metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java
 create mode 100644 metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricValue.java
 create mode 100644 metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java
 create mode 100644 metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeGroupStatusConvertor.java
 copy core/src/test/java/org/apache/servicecomb/core/provider/Person.java => metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeStatusConvertor.java (77%)
 copy common/common-javassist/src/main/java/org/apache/servicecomb/common/javassist/SingleWrapper.java => metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertor.java (84%)
 create mode 100644 metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertorFactory.java
 copy common/common-rest/src/main/java/org/apache/servicecomb/common/rest/definition/path/StaticUrlParamWriter.java => metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/SuccessFailedStatusConvertor.java (67%)
 create mode 100644 metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java
 create mode 100644 metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestStatusDimension.java

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

[incubator-servicecomb-java-chassis] 06/10: SCB-150 add module name

Posted by ni...@apache.org.
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 1e8a7356aa0595a1e318ca10a8e1aea124dbfdf8
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Fri Jan 12 15:45:09 2018 +0800

    SCB-150 add module name
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 metrics/metrics-extension/pom.xml                      | 1 +
 metrics/metrics-integration/metrics-prometheus/pom.xml | 1 +
 2 files changed, 2 insertions(+)

diff --git a/metrics/metrics-extension/pom.xml b/metrics/metrics-extension/pom.xml
index 1d64230..ecd2f6e 100644
--- a/metrics/metrics-extension/pom.xml
+++ b/metrics/metrics-extension/pom.xml
@@ -27,6 +27,7 @@
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>metrics-extension</artifactId>
+  <name>Java Chassis::Metrics::Extension</name>
   <packaging>pom</packaging>
 
 </project>
\ No newline at end of file
diff --git a/metrics/metrics-integration/metrics-prometheus/pom.xml b/metrics/metrics-integration/metrics-prometheus/pom.xml
index 684749a..0ff0bea 100644
--- a/metrics/metrics-integration/metrics-prometheus/pom.xml
+++ b/metrics/metrics-integration/metrics-prometheus/pom.xml
@@ -27,6 +27,7 @@
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>metrics-prometheus</artifactId>
+  <name>Java Chassis::Metrics::Prometheus Integration</name>
 
   <dependencies>
     <dependency>

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

[incubator-servicecomb-java-chassis] 10/10: SCB-150 add Status Dimension output level support

Posted by ni...@apache.org.
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 bd87a7240eb1eb73d854d689b7776079fc4c33c5
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Wed Jan 17 15:36:37 2018 +0800

    SCB-150 add Status Dimension output level support
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../common/rest/AbstractRestInvocation.java        |   2 +-
 .../org/apache/servicecomb/core/Invocation.java    |   4 +-
 .../core/metrics/InvocationFinishedEvent.java      |  11 +-
 .../core/provider/consumer/InvokerUtils.java       |   9 +-
 .../servicecomb/metrics/common/CallMetric.java     |   4 +-
 .../metrics/common/MetricsDimension.java           |  31 ++--
 .../servicecomb/metrics/core/MetricsConfig.java    |   2 +
 .../core/event/DefaultEventListenerManager.java    |  17 ++-
 .../event/InvocationFinishedEventListener.java     |  14 +-
 .../event/dimension/CodeGroupStatusConvertor.java  |  45 ++++++
 .../dimension/CodeStatusConvertor.java}            |   9 +-
 .../dimension/StatusConvertor.java}                |   6 +-
 .../event/dimension/StatusConvertorFactory.java    |  53 +++++++
 .../dimension/SuccessFailedStatusConvertor.java}   |  12 +-
 .../metrics/core/monitor/CallMonitor.java          |  90 ++++++------
 .../core/monitor/ConsumerInvocationMonitor.java    |   3 +-
 .../core/monitor/ProducerInvocationMonitor.java    |   3 +-
 .../metrics/core/TestEventAndRunner.java           |  72 ++++++----
 .../metrics/core/TestStatusDimension.java          | 158 +++++++++++++++++++++
 .../transport/highway/HighwayServerInvoke.java     |   2 +-
 20 files changed, 433 insertions(+), 114 deletions(-)

diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
index 0ee7999..36c1739 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
@@ -189,7 +189,7 @@ public abstract class AbstractRestInvocation {
     invocation.next(resp -> {
       sendResponseQuietly(resp);
 
-      invocation.triggerFinishedEvent(resp.isSuccessed());
+      invocation.triggerFinishedEvent(resp.getStatusCode(), resp.isSuccessed());
       endMetrics();
     });
   }
diff --git a/core/src/main/java/org/apache/servicecomb/core/Invocation.java b/core/src/main/java/org/apache/servicecomb/core/Invocation.java
index 19241b8..81f25f8 100644
--- a/core/src/main/java/org/apache/servicecomb/core/Invocation.java
+++ b/core/src/main/java/org/apache/servicecomb/core/Invocation.java
@@ -202,12 +202,12 @@ public class Invocation extends SwaggerInvocation {
         operationMeta.getMicroserviceQualifiedName(), this.invocationType, startProcessingTime - startTime));
   }
 
-  public void triggerFinishedEvent(boolean success) {
+  public void triggerFinishedEvent(int statusCode, boolean success) {
     long finishedTime = System.nanoTime();
     EventUtils
         .triggerEvent(new InvocationFinishedEvent(operationMeta.getMicroserviceQualifiedName(),
             this.invocationType, finishedTime - startProcessingTime,
-            finishedTime - startTime, success));
+            finishedTime - startTime, statusCode, success));
   }
 
   public boolean isSync() {
diff --git a/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java b/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java
index ea54d67..4de6154 100644
--- a/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java
+++ b/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java
@@ -29,6 +29,8 @@ public class InvocationFinishedEvent implements Event {
 
   private final long totalElapsedNanoTime;
 
+  private final int statusCode;
+
   private final boolean success;
 
   public String getOperationName() {
@@ -47,18 +49,21 @@ public class InvocationFinishedEvent implements Event {
     return totalElapsedNanoTime;
   }
 
+  public int getStatusCode() {
+    return statusCode;
+  }
+
   public boolean isSuccess() {
     return success;
   }
 
   public InvocationFinishedEvent(String operationName, InvocationType invocationType,
-      long processElapsedNanoTime,
-      long totalElapsedNanoTime,
-      boolean success) {
+      long processElapsedNanoTime, long totalElapsedNanoTime, int statusCode, boolean success) {
     this.operationName = operationName;
     this.invocationType = invocationType;
     this.processElapsedNanoTime = processElapsedNanoTime;
     this.totalElapsedNanoTime = totalElapsedNanoTime;
+    this.statusCode = statusCode;
     this.success = success;
   }
 }
diff --git a/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java b/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java
index e8b8247..2635ac3 100644
--- a/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java
+++ b/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java
@@ -63,6 +63,7 @@ public final class InvokerUtils {
 
   public static Response innerSyncInvoke(Invocation invocation) {
     boolean success = false;
+    int statusCode = 0;
     try {
       triggerStartedEvent(invocation);
       SyncResponseExecutor respExecutor = new SyncResponseExecutor();
@@ -72,6 +73,7 @@ public final class InvokerUtils {
 
       Response response = respExecutor.waitResponse();
       success = response.isSuccessed();
+      statusCode = response.getStatusCode();
       return response;
     } catch (Throwable e) {
       String msg =
@@ -79,7 +81,7 @@ public final class InvokerUtils {
       LOGGER.debug(msg, e);
       return Response.createConsumerFail(e);
     } finally {
-      invocation.triggerFinishedEvent(success);
+      invocation.triggerFinishedEvent(statusCode, success);
     }
   }
 
@@ -92,11 +94,12 @@ public final class InvokerUtils {
       invocation.setResponseExecutor(respExecutor);
 
       invocation.next(ar -> {
-        invocation.triggerFinishedEvent(ar.isSuccessed());
+        invocation.triggerFinishedEvent(ar.getStatusCode(), ar.isSuccessed());
         asyncResp.handle(ar);
       });
     } catch (Throwable e) {
-      invocation.triggerFinishedEvent(false);
+      //if throw exception,we can use 500 for status code ?
+      invocation.triggerFinishedEvent(500, false);
       LOGGER.error("invoke failed, {}", invocation.getOperationMeta().getMicroserviceQualifiedName());
       asyncResp.consumerFail(e);
     }
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 56d0f99..4c5c862 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
@@ -45,7 +45,7 @@ public class CallMetric {
         return value;
       }
     }
-    return null;
+    return new LongMetricValue(dimensionValue, 0L, null);
   }
 
   public List<DoubleMetricValue> getTpsValues() {
@@ -58,7 +58,7 @@ public class CallMetric {
         return value;
       }
     }
-    return null;
+    return new DoubleMetricValue(dimensionValue, 0.0, null);
   }
 
   public CallMetric(String prefix) {
diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java
index 23f1f40..904cc25 100644
--- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java
+++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java
@@ -17,23 +17,30 @@
 
 package org.apache.servicecomb.metrics.common;
 
-import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
-
 public class MetricsDimension {
   public static final String DIMENSION_STATUS = "Status";
 
   public static final String DIMENSION_STATUS_ALL = "all";
 
-  public static final String DIMENSION_STATUS_SUCCESS = "success";
+  public static final String DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS = "success";
+
+  public static final String DIMENSION_STATUS_SUCCESS_FAILED_FAILED = "failed";
+
+  public static final String DIMENSION_STATUS_CODE_GROUP_1XX = "1xx";
+
+  public static final String DIMENSION_STATUS_CODE_GROUP_2XX = "2xx";
+
+  public static final String DIMENSION_STATUS_CODE_GROUP_3XX = "3xx";
+
+  public static final String DIMENSION_STATUS_CODE_GROUP_4XX = "4xx";
+
+  public static final String DIMENSION_STATUS_CODE_GROUP_5XX = "5xx";
+
+  public static final String DIMENSION_STATUS_CODE_GROUP_OTHER = "xxx";
+
+  public static final String DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED = "success_failed";
 
-  public static final String DIMENSION_STATUS_FAILED = "failed";
+  public static final String DIMENSION_STATUS_OUTPUT_LEVEL_CODE_GROUP = "code_group";
 
-  public static String[] getDimensionOptions(String dimension) {
-    if (DIMENSION_STATUS.equals(dimension)) {
-      return new String[] {MetricsDimension.DIMENSION_STATUS_ALL,
-          MetricsDimension.DIMENSION_STATUS_SUCCESS,
-          MetricsDimension.DIMENSION_STATUS_FAILED};
-    }
-    throw new ServiceCombException("illegal dimension key : " + dimension);
-  }
+  public static final String DIMENSION_STATUS_OUTPUT_LEVEL_CODE = "code";
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java
index b903f15..cbf6455 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java
@@ -19,4 +19,6 @@ package org.apache.servicecomb.metrics.core;
 
 public class MetricsConfig {
   public static final String METRICS_POLLING_TIME = "servicecomb.metrics.window_time";
+
+  public static final String METRICS_DIMENSION_STATUS_OUTPUT_LEVEL = "servicecomb.metrics.dimension.status.output_level";
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/DefaultEventListenerManager.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/DefaultEventListenerManager.java
index 42aa024..6dc6df4 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/DefaultEventListenerManager.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/DefaultEventListenerManager.java
@@ -19,18 +19,31 @@ package org.apache.servicecomb.metrics.core.event;
 
 import org.apache.servicecomb.foundation.common.event.EventListener;
 import org.apache.servicecomb.foundation.common.utils.EventUtils;
+import org.apache.servicecomb.metrics.common.MetricsDimension;
+import org.apache.servicecomb.metrics.core.MetricsConfig;
+import org.apache.servicecomb.metrics.core.event.dimension.StatusConvertorFactory;
 import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import com.netflix.config.DynamicPropertyFactory;
+
 @Component
 public class DefaultEventListenerManager implements EventListenerManager {
 
   @Autowired
-  public DefaultEventListenerManager(RegistryMonitor registryMonitor) {
+  public DefaultEventListenerManager(RegistryMonitor registryMonitor, StatusConvertorFactory convertorFactory) {
+    this(registryMonitor, convertorFactory, DynamicPropertyFactory
+        .getInstance().getStringProperty(MetricsConfig.METRICS_DIMENSION_STATUS_OUTPUT_LEVEL,
+            MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED).get());
+  }
+
+  public DefaultEventListenerManager(RegistryMonitor registryMonitor, StatusConvertorFactory convertorFactory,
+      String outputLevel) {
     this.registerEventListener(new InvocationStartedEventListener(registryMonitor));
     this.registerEventListener(new InvocationStartProcessingEventListener(registryMonitor));
-    this.registerEventListener(new InvocationFinishedEventListener(registryMonitor));
+    this.registerEventListener(
+        new InvocationFinishedEventListener(registryMonitor, convertorFactory.getConvertor(outputLevel)));
   }
 
   @Override
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
index 8d15eac..5b886b6 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
@@ -21,17 +21,20 @@ import org.apache.servicecomb.core.metrics.InvocationFinishedEvent;
 import org.apache.servicecomb.foundation.common.event.Event;
 import org.apache.servicecomb.foundation.common.event.EventListener;
 import org.apache.servicecomb.metrics.common.MetricsDimension;
+import org.apache.servicecomb.metrics.core.event.dimension.StatusConvertor;
 import org.apache.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
 import org.apache.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
 import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor;
 import org.apache.servicecomb.swagger.invocation.InvocationType;
 
 public class InvocationFinishedEventListener implements EventListener {
-
   private final RegistryMonitor registryMonitor;
 
-  public InvocationFinishedEventListener(RegistryMonitor registryMonitor) {
+  private final StatusConvertor convertor;
+
+  public InvocationFinishedEventListener(RegistryMonitor registryMonitor, StatusConvertor convertor) {
     this.registryMonitor = registryMonitor;
+    this.convertor = convertor;
   }
 
   @Override
@@ -42,17 +45,16 @@ public class InvocationFinishedEventListener implements EventListener {
   @Override
   public void process(Event data) {
     InvocationFinishedEvent event = (InvocationFinishedEvent) data;
+    String statusDimensionValue = convertor.convert(event.isSuccess(), event.getStatusCode());
     if (InvocationType.PRODUCER.equals(event.getInvocationType())) {
       ProducerInvocationMonitor monitor = registryMonitor.getProducerInvocationMonitor(event.getOperationName());
       monitor.getExecutionTime().update(event.getProcessElapsedNanoTime());
       monitor.getProducerLatency().update(event.getTotalElapsedNanoTime());
-      monitor.getProducerCall().increment(MetricsDimension.DIMENSION_STATUS,
-          event.isSuccess() ? MetricsDimension.DIMENSION_STATUS_SUCCESS : MetricsDimension.DIMENSION_STATUS_FAILED);
+      monitor.getProducerCall().increment(MetricsDimension.DIMENSION_STATUS, statusDimensionValue);
     } else {
       ConsumerInvocationMonitor monitor = registryMonitor.getConsumerInvocationMonitor(event.getOperationName());
       monitor.getConsumerLatency().update(event.getTotalElapsedNanoTime());
-      monitor.getConsumerCall().increment(MetricsDimension.DIMENSION_STATUS,
-          event.isSuccess() ? MetricsDimension.DIMENSION_STATUS_SUCCESS : MetricsDimension.DIMENSION_STATUS_FAILED);
+      monitor.getConsumerCall().increment(MetricsDimension.DIMENSION_STATUS, statusDimensionValue);
     }
   }
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeGroupStatusConvertor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeGroupStatusConvertor.java
new file mode 100644
index 0000000..92b99d0
--- /dev/null
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeGroupStatusConvertor.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.metrics.core.event.dimension;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ws.rs.core.Response.Status.Family;
+
+import org.apache.servicecomb.metrics.common.MetricsDimension;
+
+public class CodeGroupStatusConvertor implements StatusConvertor {
+
+  private final Map<Family, String> families;
+
+  public CodeGroupStatusConvertor() {
+    this.families = new HashMap<>();
+    this.families.put(Family.INFORMATIONAL, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_1XX);
+    this.families.put(Family.SUCCESSFUL, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_2XX);
+    this.families.put(Family.REDIRECTION, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_3XX);
+    this.families.put(Family.CLIENT_ERROR, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_4XX);
+    this.families.put(Family.SERVER_ERROR, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_5XX);
+    this.families.put(Family.OTHER, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_OTHER);
+  }
+
+  @Override
+  public String convert(boolean success, int statusCode) {
+    return families.get(Family.familyOf(statusCode));
+  }
+}
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeStatusConvertor.java
similarity index 77%
copy from metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java
copy to metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeStatusConvertor.java
index b903f15..b01f5da 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/CodeStatusConvertor.java
@@ -15,8 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.metrics.core;
+package org.apache.servicecomb.metrics.core.event.dimension;
 
-public class MetricsConfig {
-  public static final String METRICS_POLLING_TIME = "servicecomb.metrics.window_time";
+public class CodeStatusConvertor implements StatusConvertor {
+  @Override
+  public String convert(boolean success, int statusCode) {
+    return String.valueOf(statusCode);
+  }
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertor.java
similarity index 83%
copy from metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java
copy to metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertor.java
index b903f15..17023b6 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertor.java
@@ -15,8 +15,8 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.metrics.core;
+package org.apache.servicecomb.metrics.core.event.dimension;
 
-public class MetricsConfig {
-  public static final String METRICS_POLLING_TIME = "servicecomb.metrics.window_time";
+public interface StatusConvertor {
+  String convert(boolean success, int statusCode);
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertorFactory.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertorFactory.java
new file mode 100644
index 0000000..369cda4
--- /dev/null
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/StatusConvertorFactory.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.metrics.core.event.dimension;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Supplier;
+
+import org.apache.servicecomb.metrics.common.MetricsDimension;
+import org.apache.servicecomb.metrics.core.MetricsConfig;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+public class StatusConvertorFactory {
+
+  private final Map<String, Supplier<StatusConvertor>> suppliers;
+
+  public StatusConvertorFactory() {
+    this.suppliers = new HashMap<>();
+    this.suppliers.put(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_CODE, CodeStatusConvertor::new);
+    this.suppliers.put(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_CODE_GROUP, CodeGroupStatusConvertor::new);
+    this.suppliers
+        .put(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED, SuccessFailedStatusConvertor::new);
+  }
+
+  public StatusConvertor getConvertor(String outputLevel) {
+    if (suppliers.containsKey(outputLevel)) {
+      return suppliers.get(outputLevel).get();
+    }
+    LoggerFactory.getLogger(StatusConvertorFactory.class).error("unknown config value of " +
+        MetricsConfig.METRICS_DIMENSION_STATUS_OUTPUT_LEVEL + " : " + outputLevel
+        + ", use default level : " +
+        MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED + " replace it");
+    //return default
+    return suppliers.get(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED).get();
+  }
+}
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/SuccessFailedStatusConvertor.java
similarity index 65%
copy from metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java
copy to metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/SuccessFailedStatusConvertor.java
index b903f15..c2cf998 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsConfig.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/dimension/SuccessFailedStatusConvertor.java
@@ -15,8 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.metrics.core;
+package org.apache.servicecomb.metrics.core.event.dimension;
 
-public class MetricsConfig {
-  public static final String METRICS_POLLING_TIME = "servicecomb.metrics.window_time";
+import org.apache.servicecomb.metrics.common.MetricsDimension;
+
+public class SuccessFailedStatusConvertor implements StatusConvertor {
+  @Override
+  public String convert(boolean success, int statusCode) {
+    return success ? MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS
+        : MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED;
+  }
 }
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 068776e..2e61440 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
@@ -19,7 +19,9 @@ package org.apache.servicecomb.metrics.core.monitor;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import org.apache.servicecomb.metrics.common.CallMetric;
 import org.apache.servicecomb.metrics.common.DoubleMetricValue;
 import org.apache.servicecomb.metrics.common.LongMetricValue;
@@ -33,61 +35,61 @@ import com.netflix.servo.monitor.StepCounter;
 public class CallMonitor {
   private final String prefix;
 
-  private final List<BasicCounter> totalCounters;
+  private final Map<String, Map<String, DimensionCounter>> dimensionCounters;
 
-  private final List<StepCounter> tpsCounters;
-
-  public CallMonitor(String prefix, String... dimensionKeys) {
+  public CallMonitor(String prefix) {
     this.prefix = prefix;
-    this.totalCounters = new ArrayList<>();
-    this.tpsCounters = new ArrayList<>();
-    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 dimensionKey : dimensionKeys) {
-        for (String option : MetricsDimension.getDimensionOptions(dimensionKey)) {
-          this.totalCounters
-              .add(new BasicCounter(MonitorConfig.builder(prefix + ".total").withTag(dimensionKey, option).build()));
-          this.tpsCounters
-              .add(new StepCounter(MonitorConfig.builder(prefix + ".tps").withTag(dimensionKey, option).build()));
-        }
-      }
-    }
+    this.dimensionCounters = new ConcurrentHashMapEx<>();
+    this.dimensionCounters.put(MetricsDimension.DIMENSION_STATUS, new ConcurrentHashMapEx<>());
   }
 
-  public void increment() {
-    for (int i = 0; i < totalCounters.size(); i++) {
-      totalCounters.get(i).increment();
-      tpsCounters.get(i).increment();
-    }
-  }
-
-  public void increment(String dimensionKey, String dimensionValue) {
-    for (int i = 0; i < totalCounters.size(); i++) {
-      BasicCounter totalCounter = totalCounters.get(i);
-      if (MonitorUtils.containsTagValue(totalCounter, dimensionKey, dimensionValue)) {
-        totalCounter.increment();
-      }
-      StepCounter tpsCounter = tpsCounters.get(i);
-      if (MonitorUtils.containsTagValue(tpsCounter, dimensionKey, dimensionValue)) {
-        tpsCounter.increment();
-      }
+  public void increment(String dimensionKey, String... dimensionValues) {
+    for (String dimensionValue : dimensionValues) {
+      DimensionCounter counter = dimensionCounters.get(dimensionKey)
+          .computeIfAbsent(dimensionValue, d -> new DimensionCounter(
+              new BasicCounter(MonitorConfig.builder(prefix + ".total").withTag(dimensionKey, dimensionValue).build()),
+              new StepCounter(MonitorConfig.builder(prefix + ".tps").withTag(dimensionKey, dimensionValue).build())));
+      counter.increment();
     }
   }
 
   public CallMetric toMetric(int windowTimeIndex) {
     List<LongMetricValue> totalValues = new ArrayList<>();
     List<DoubleMetricValue> tpsValues = new ArrayList<>();
-    for (int i = 0; i < totalCounters.size(); i++) {
-      BasicCounter totalCounter = totalCounters.get(i);
-      totalValues.add(new LongMetricValue(totalCounter.getValue(windowTimeIndex).longValue(),
-          MonitorUtils.convertTags(totalCounter)));
-      StepCounter tpsCounter = tpsCounters.get(i);
-      tpsValues.add(
-          new DoubleMetricValue(MonitorUtils.adjustValue(tpsCounter.getValue(windowTimeIndex).doubleValue()),
-              MonitorUtils.convertTags(tpsCounter)));
+    for (Map<String, DimensionCounter> dimensionCounter : dimensionCounters.values()) {
+      for (DimensionCounter counter : dimensionCounter.values()) {
+        totalValues.add(new LongMetricValue(counter.getTotal().getValue(windowTimeIndex).longValue(),
+            MonitorUtils.convertTags(counter.getTotal())));
+        tpsValues.add(
+            new DoubleMetricValue(MonitorUtils.adjustValue(counter.getTps().getValue(windowTimeIndex).doubleValue()),
+                MonitorUtils.convertTags(counter.getTps())));
+      }
     }
+
     return new CallMetric(this.prefix, totalValues, tpsValues);
   }
+
+  class DimensionCounter {
+    private final BasicCounter total;
+
+    private final StepCounter tps;
+
+    public BasicCounter getTotal() {
+      return total;
+    }
+
+    public StepCounter getTps() {
+      return tps;
+    }
+
+    public DimensionCounter(BasicCounter total, StepCounter tps) {
+      this.total = total;
+      this.tps = tps;
+    }
+
+    public void increment() {
+      total.increment();
+      tps.increment();
+    }
+  }
 }
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 9a09551..1f2f247 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
@@ -20,7 +20,6 @@ package org.apache.servicecomb.metrics.core.monitor;
 
 import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric;
 import org.apache.servicecomb.metrics.common.MetricsConst;
-import org.apache.servicecomb.metrics.common.MetricsDimension;
 
 public class ConsumerInvocationMonitor extends InvocationMonitor {
   private final TimerMonitor consumerLatency;
@@ -38,7 +37,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", MetricsDimension.DIMENSION_STATUS);
+    this.consumerCall = new CallMonitor(this.getPrefix() + ".consumerCall");
   }
 
   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 50a508c..9c77ec8 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
@@ -18,7 +18,6 @@
 package org.apache.servicecomb.metrics.core.monitor;
 
 import org.apache.servicecomb.metrics.common.MetricsConst;
-import org.apache.servicecomb.metrics.common.MetricsDimension;
 import org.apache.servicecomb.metrics.common.ProducerInvocationMetric;
 
 import com.netflix.servo.monitor.BasicCounter;
@@ -61,7 +60,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", MetricsDimension.DIMENSION_STATUS);
+    this.producerCall = new CallMonitor(this.getPrefix() + ".producerCall");
   }
 
   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 8e87439..85cf463 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
@@ -36,6 +36,7 @@ import org.apache.servicecomb.foundation.common.utils.EventUtils;
 import org.apache.servicecomb.metrics.common.MetricsDimension;
 import org.apache.servicecomb.metrics.common.RegistryMetric;
 import org.apache.servicecomb.metrics.core.event.DefaultEventListenerManager;
+import org.apache.servicecomb.metrics.core.event.dimension.StatusConvertorFactory;
 import org.apache.servicecomb.metrics.core.monitor.DefaultSystemMonitor;
 import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor;
 import org.apache.servicecomb.metrics.core.publish.DefaultDataSource;
@@ -74,7 +75,8 @@ public class TestEventAndRunner {
     Assert.assertEquals(intervals.size(), 3);
     Assert.assertThat(intervals, containsInAnyOrder(Arrays.asList(1000L, 2000L, 3000L).toArray()));
 
-    new DefaultEventListenerManager(monitor);
+    new DefaultEventListenerManager(monitor, new StatusConvertorFactory(),
+        MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_SUCCESS_FAILED);
 
     //fun1 is a PRODUCER invocation call 2 time and all is completed
     //two time success
@@ -84,7 +86,7 @@ public class TestEventAndRunner {
             TimeUnit.MILLISECONDS.toNanos(100)));
     EventUtils
         .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER,
-            TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), true));
+            TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 200, true));
 
     EventUtils.triggerEvent(new InvocationStartedEvent("fun1", InvocationType.PRODUCER, System.nanoTime()));
     EventUtils.triggerEvent(
@@ -92,7 +94,7 @@ public class TestEventAndRunner {
             TimeUnit.MILLISECONDS.toNanos(300)));
     EventUtils
         .triggerEvent(new InvocationFinishedEvent("fun1", InvocationType.PRODUCER,
-            TimeUnit.MILLISECONDS.toNanos(400), TimeUnit.MILLISECONDS.toNanos(700), false));
+            TimeUnit.MILLISECONDS.toNanos(400), TimeUnit.MILLISECONDS.toNanos(700), 500, false));
 
     //==========================================================================
 
@@ -116,7 +118,7 @@ public class TestEventAndRunner {
             TimeUnit.MILLISECONDS.toNanos(100)));
     EventUtils
         .triggerEvent(new InvocationFinishedEvent("fun2", InvocationType.CONSUMER,
-            TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), true));
+            TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 200, true));
 
     //==========================================================================
 
@@ -159,16 +161,20 @@ public class TestEventAndRunner {
     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);
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS)
+        .getValue(), 0);
     Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
-        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED)
+        .getValue(), 0);
 
     Assert.assertEquals(4, model.getInstanceMetric().getProducerMetric().getProducerCall()
         .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
     Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
-        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS)
+        .getValue(), 0);
     Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
-        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED)
+        .getValue(), 0);
 
     Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getCount());
     Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getTotal(),
@@ -183,16 +189,20 @@ public class TestEventAndRunner {
     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);
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS)
+        .getValue(), 0);
     Assert.assertEquals(0, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
-        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED)
+        .getValue(), 0);
 
     Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
         .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
     Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
-        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS)
+        .getValue(), 0);
     Assert.assertEquals(0, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
-        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED)
+        .getValue(), 0);
 
     //check ProducerMetrics
     Assert.assertEquals(0, model.getProducerMetrics().get("fun1").getWaitInQueue());
@@ -217,16 +227,20 @@ public class TestEventAndRunner {
     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);
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS)
+        .getValue(), 0);
     Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall()
-        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED)
+        .getValue(), 0);
 
     Assert.assertEquals(2, model.getProducerMetrics().get("fun1").getProducerCall()
         .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
     Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall()
-        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS)
+        .getValue(), 0);
     Assert.assertEquals(1, model.getProducerMetrics().get("fun1").getProducerCall()
-        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED)
+        .getValue(), 0);
 
     //fun3
     Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getWaitInQueue());
@@ -251,16 +265,20 @@ public class TestEventAndRunner {
     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);
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS)
+        .getValue(), 0);
     Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall()
-        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED)
+        .getValue(), 0);
 
     Assert.assertEquals(1, model.getProducerMetrics().get("fun3").getProducerCall()
         .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
     Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall()
-        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS)
+        .getValue(), 0);
     Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getProducerCall()
-        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED)
+        .getValue(), 0);
 
     //check ConsumerMetrics
     //no need
@@ -273,19 +291,23 @@ public class TestEventAndRunner {
     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);
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS)
+        .getValue(), 0);
     Assert.assertEquals(0, model.getConsumerMetrics().get("fun2").getConsumerCall()
-        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED)
+        .getValue(), 0);
 
     Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall()
         .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
     Assert.assertEquals(1, model.getConsumerMetrics().get("fun2").getConsumerCall()
-        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS).getValue(), 0);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_SUCCESS)
+        .getValue(), 0);
     Assert.assertEquals(0, model.getConsumerMetrics().get("fun2").getConsumerCall()
-        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_SUCCESS_FAILED_FAILED)
+        .getValue(), 0);
 
     Map<String, Number> metrics = model.toMap();
-    Assert.assertEquals(120, metrics.size());
+    Assert.assertEquals(108, metrics.size());
 
     Assert.assertEquals(1.0, model.getInstanceMetric().getSystemMetric().getCpuLoad(), 0);
     Assert.assertEquals(2, model.getInstanceMetric().getSystemMetric().getCpuRunningThreads(), 0);
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestStatusDimension.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestStatusDimension.java
new file mode 100644
index 0000000..0a113fb
--- /dev/null
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestStatusDimension.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.metrics.core;
+
+import 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.MetricsDimension;
+import org.apache.servicecomb.metrics.common.RegistryMetric;
+import org.apache.servicecomb.metrics.core.event.DefaultEventListenerManager;
+import org.apache.servicecomb.metrics.core.event.dimension.StatusConvertorFactory;
+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;
+
+public class TestStatusDimension {
+
+  @Test
+  public void testCodeGroupDimension() throws InterruptedException {
+    RegistryMetric model = prepare(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_CODE_GROUP);
+
+    Assert.assertEquals(5, 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_CODE_GROUP_2XX)
+        .getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_3XX)
+        .getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_4XX)
+        .getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_5XX)
+        .getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_OTHER)
+        .getValue(), 0);
+
+    Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_CODE_GROUP_2XX)
+        .getValue(), 0);
+  }
+
+  @Test
+  public void testCodeDimension() throws InterruptedException {
+    RegistryMetric model = prepare(MetricsDimension.DIMENSION_STATUS_OUTPUT_LEVEL_CODE);
+
+    Assert.assertEquals(5, 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, "222")
+        .getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, "333")
+        .getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, "444")
+        .getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, "555")
+        .getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getProducerMetric().getProducerCall()
+        .getTpsValue(MetricsDimension.DIMENSION_STATUS, "666")
+        .getValue(), 0);
+
+    Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+    Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, "200")
+        .getValue(), 0);
+  }
+
+  private RegistryMetric prepare(String outputLevel) throws InterruptedException {
+    DefaultSystemMonitor systemMonitor = new DefaultSystemMonitor();
+    RegistryMonitor monitor = new RegistryMonitor(systemMonitor);
+    DefaultDataSource dataSource = new DefaultDataSource(monitor, "1000,2000,3000");
+
+    new DefaultEventListenerManager(monitor, new StatusConvertorFactory(), outputLevel);
+
+    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), 222, true));
+
+    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), 333, false));
+
+    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), 444, false));
+
+    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), 555, false));
+
+    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), 666, false));
+
+    //fun2 is a CONSUMER invocation call once and completed
+    EventUtils.triggerEvent(new InvocationStartedEvent("fun2", InvocationType.CONSUMER, System.nanoTime()));
+    EventUtils.triggerEvent(
+        new InvocationStartProcessingEvent("fun2", InvocationType.CONSUMER,
+            TimeUnit.MILLISECONDS.toNanos(100)));
+    EventUtils
+        .triggerEvent(new InvocationFinishedEvent("fun2", InvocationType.CONSUMER,
+            TimeUnit.MILLISECONDS.toNanos(200), TimeUnit.MILLISECONDS.toNanos(300), 200, true));
+
+    //sim lease one window time
+    Thread.sleep(1000);
+
+    return dataSource.getRegistryMetric(1000);
+  }
+}
diff --git a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java
index ba8c126..020c926 100644
--- a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java
+++ b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java
@@ -134,7 +134,7 @@ public class HighwayServerInvoke {
     invocation.next(response -> {
       sendResponse(invocation.getContext(), response);
       endMetrics(invocation);
-      invocation.triggerFinishedEvent(response.isSuccessed());
+      invocation.triggerFinishedEvent(response.getStatusCode(), response.isSuccessed());
     });
   }
 

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

[incubator-servicecomb-java-chassis] 09/10: SCB-150 fix pr comment

Posted by ni...@apache.org.
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 604afb2e98fac07d1bf5f46d081b48e576e84b51
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Wed Jan 17 10:19:32 2018 +0800

    SCB-150 fix pr comment
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../metrics/common/DoubleMetricValue.java          |  8 +-----
 .../metrics/common/LongMetricValue.java            |  8 +-----
 .../metrics/core/utils/MonitorUtils.java           |  3 +-
 .../metrics/prometheus/MetricsCollector.java       | 33 ++++++++++++----------
 4 files changed, 22 insertions(+), 30 deletions(-)

diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java
index 30a7790..e6ace95 100644
--- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java
+++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java
@@ -22,8 +22,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
-
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class DoubleMetricValue extends MetricValue<Double> {
@@ -38,11 +36,7 @@ public class DoubleMetricValue extends MetricValue<Double> {
   }
 
   private DoubleMetricValue merge(DoubleMetricValue value) {
-    if (this.getKey().equals(value.getKey())) {
-      return new DoubleMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions());
-    }
-    throw new ServiceCombException("unable merge different key values,source key :" + value.getKey() +
-        " target key :" + this.getKey());
+    return new DoubleMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions());
   }
 
   public static List<DoubleMetricValue> merge(List<DoubleMetricValue> source, List<DoubleMetricValue> target) {
diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java
index 84babff..ff27134 100644
--- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java
+++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java
@@ -22,8 +22,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
-
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class LongMetricValue extends MetricValue<Long> {
@@ -38,11 +36,7 @@ public class LongMetricValue extends MetricValue<Long> {
   }
 
   private LongMetricValue merge(LongMetricValue value) {
-    if (this.getKey().equals(value.getKey())) {
-      return new LongMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions());
-    }
-    throw new ServiceCombException("unable merge different key values,source key :" + value.getKey() +
-        " target key :" + this.getKey());
+    return new LongMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions());
   }
 
   public static List<LongMetricValue> merge(List<LongMetricValue> source, List<LongMetricValue> target) {
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java
index 31be367..f2a8169 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java
@@ -17,6 +17,7 @@
 
 package org.apache.servicecomb.metrics.core.utils;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -58,7 +59,7 @@ public class MonitorUtils {
       }
       return tagMap;
     }
-    return null;
+    return Collections.emptyMap();
   }
 
   //Counting use System.nano get more precise time
diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
index 290d383..932863e 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
@@ -59,30 +59,33 @@ public class MetricsCollector extends Collector implements Collector.Describable
     RegistryMetric registryMetric = dataSource.getRegistryMetric();
     List<MetricFamilySamples> familySamples = new ArrayList<>();
 
-    List<Sample> samples = new ArrayList<>();
-    samples.addAll(convertMetricValues(registryMetric.getInstanceMetric().getSystemMetric().toMap()));
-    samples.addAll(convertConsumerMetric(registryMetric.getInstanceMetric().getConsumerMetric()));
-    samples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getConsumerMetric().getConsumerCall()));
-    samples.addAll(convertProducerMetric(registryMetric.getInstanceMetric().getProducerMetric()));
-    samples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getProducerMetric().getProducerCall()));
-    familySamples.add(new MetricFamilySamples("Instance Level", Type.UNTYPED, "Instance Level Metrics", samples));
+    List<Sample> instanceSamples = new ArrayList<>();
+    instanceSamples.addAll(convertMetricValues(registryMetric.getInstanceMetric().getSystemMetric().toMap()));
+    instanceSamples.addAll(convertConsumerMetric(registryMetric.getInstanceMetric().getConsumerMetric()));
+    instanceSamples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getConsumerMetric().getConsumerCall()));
+    instanceSamples.addAll(convertProducerMetric(registryMetric.getInstanceMetric().getProducerMetric()));
+    instanceSamples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getProducerMetric().getProducerCall()));
+    familySamples
+        .add(new MetricFamilySamples("Instance Level", Type.UNTYPED, "Instance Level Metrics", instanceSamples));
 
     if (registryMetric.getConsumerMetrics().size() != 0) {
-      samples = new ArrayList<>();
+      List<Sample> consumerSamples = new ArrayList<>();
       for (ConsumerInvocationMetric metric : registryMetric.getConsumerMetrics().values()) {
-        samples.addAll(convertConsumerMetric(metric));
-        samples.addAll(convertCallMetric(metric.getConsumerCall()));
+        consumerSamples.addAll(convertConsumerMetric(metric));
+        consumerSamples.addAll(convertCallMetric(metric.getConsumerCall()));
       }
-      familySamples.add(new MetricFamilySamples("Consumer Side", Type.UNTYPED, "Consumer Side Metrics", samples));
+      familySamples
+          .add(new MetricFamilySamples("Consumer Side", Type.UNTYPED, "Consumer Side Metrics", consumerSamples));
     }
 
     if (registryMetric.getProducerMetrics().size() != 0) {
-      samples = new ArrayList<>();
+      List<Sample> producerSamples = new ArrayList<>();
       for (ProducerInvocationMetric metric : registryMetric.getProducerMetrics().values()) {
-        samples.addAll(convertProducerMetric(metric));
-        samples.addAll(convertCallMetric(metric.getProducerCall()));
+        producerSamples.addAll(convertProducerMetric(metric));
+        producerSamples.addAll(convertCallMetric(metric.getProducerCall()));
       }
-      familySamples.add(new MetricFamilySamples("Producer Side", Type.UNTYPED, "Producer Side Metrics", samples));
+      familySamples
+          .add(new MetricFamilySamples("Producer Side", Type.UNTYPED, "Producer Side Metrics", producerSamples));
     }
 
     return familySamples;

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

[incubator-servicecomb-java-chassis] 07/10: SCB-150 fix RegistryMetric serialization

Posted by ni...@apache.org.
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 a103bf57395762a64c14e909ac1e60476882f1fb
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Fri Jan 12 16:07:38 2018 +0800

    SCB-150 fix RegistryMetric serialization
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../main/java/org/apache/servicecomb/metrics/common/CallMetric.java   | 4 ++--
 .../org/apache/servicecomb/metrics/prometheus/MetricsCollector.java   | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

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 d313acf..56d0f99 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,7 +35,7 @@ public class CallMetric {
     return prefix;
   }
 
-  public List<LongMetricValue> getTotalValue() {
+  public List<LongMetricValue> getTotalValues() {
     return totalValues;
   }
 
@@ -75,7 +75,7 @@ public class CallMetric {
 
   public CallMetric merge(CallMetric metric) {
     return new CallMetric(this.prefix,
-        LongMetricValue.merge(metric.getTotalValue(), this.getTotalValue()),
+        LongMetricValue.merge(metric.getTotalValues(), this.getTotalValues()),
         DoubleMetricValue.merge(metric.getTpsValues(), this.getTpsValues()));
   }
 
diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
index b22d8ea..f784722 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
@@ -112,7 +112,7 @@ public class MetricsCollector extends Collector implements Collector.Describable
   private List<Sample> convertCallMetric(CallMetric metric) {
     List<Sample> samples = new ArrayList<>();
     String totalName = formatMetricName(metric.getPrefix() + ".total");
-    for (LongMetricValue value : metric.getTotalValue()) {
+    for (LongMetricValue value : metric.getTotalValues()) {
       samples.add(new Sample(totalName,
           new ArrayList<>(value.getDimensions().keySet()), new ArrayList<>(value.getDimensions().values()),
           (double) value.getValue()));

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

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

Posted by ni...@apache.org.
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.

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

Posted by ni...@apache.org.
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 3ed292d4f8f2b810e0a6c75c5c24dae8c9388d83
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Fri Jan 12 14:43:23 2018 +0800

    SCB-150 minor refactor and fix test case
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../demo/springmvc/client/SpringmvcClient.java     |  3 +-
 .../demo/perf/PerfMetricsFilePublisher.java        | 14 +++-
 .../metrics/common}/MetricsDimension.java          |  2 +-
 .../servicecomb/metrics/common/CallMetric.java     | 10 ++-
 .../event/InvocationFinishedEventListener.java     |  2 +-
 .../core/event/InvocationStartedEventListener.java |  2 +-
 .../metrics/core/monitor/CallMonitor.java          |  2 +-
 .../core/monitor/ConsumerInvocationMonitor.java    |  2 +-
 .../core/monitor/ProducerInvocationMonitor.java    |  2 +-
 .../metrics/core/TestEventAndRunner.java           | 31 ++++----
 .../metrics/prometheus/MetricsCollector.java       | 88 +++++++++++++++++-----
 .../servicecomb/samples/mwf/TestWriteFile.java     | 55 ++++++++------
 12 files changed, 139 insertions(+), 74 deletions(-)

diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
index 3e93104..7ee9c14 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
@@ -125,7 +125,8 @@ public class SpringmvcClient {
           .check(true, metric.getInstanceMetric().getSystemMetric().getHeapUsed() != 0);
       TestMgr.check(true, metric.getProducerMetrics().size() > 0);
       TestMgr.check(true,
-          metric.getProducerMetrics().get("springmvc.codeFirst.saySomething").getProducerCall().getTotal() > 0);
+          metric.getProducerMetrics().get("springmvc.codeFirst.saySomething").getProducerCall()
+              .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue() > 0);
     } catch (Exception e) {
       TestMgr.check("true", "false");
     }
diff --git a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java
index e2ac65a..8a490a0 100644
--- a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java
+++ b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java
@@ -54,8 +54,11 @@ public class PerfMetricsFilePublisher {
       String opName = entry.getKey();
       sb.append(String
           .format("  %-16d%-16d%-16.3f%s\n",
-              entry.getValue().getConsumerCall().getTotal(),
-              (long) entry.getValue().getConsumerCall().getTps(),
+              entry.getValue().getConsumerCall()
+                  .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(),
+              entry.getValue().getConsumerCall()
+                  .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue()
+                  .longValue(),
               entry.getValue().getConsumerLatency().getAverage(),
               opName));
     }
@@ -66,8 +69,11 @@ public class PerfMetricsFilePublisher {
       String opName = entry.getKey();
       sb.append(
           String.format("  %-16d%-16d%-16.3f%-16.3f%-16.3f%s\n",
-              entry.getValue().getProducerCall().getTotal(),
-              (long) entry.getValue().getProducerCall().getTps(),
+              entry.getValue().getProducerCall()
+                  .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(),
+              entry.getValue().getProducerCall()
+                  .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue()
+                  .longValue(),
               entry.getValue().getProducerLatency().getAverage(),
               entry.getValue().getLifeTimeInQueue().getAverage(),
               entry.getValue().getExecutionTime().getAverage(),
diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java
similarity index 97%
rename from metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java
rename to metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java
index bf9170f..d8f661f 100644
--- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java
+++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.core;
+package io.servicecomb.metrics.common;
 
 import io.servicecomb.foundation.common.exceptions.ServiceCombException;
 
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 f3e82d5..d313acf 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
@@ -31,11 +31,15 @@ public class CallMetric {
 
   private final List<DoubleMetricValue> tpsValues;
 
-  public List<LongMetricValue> getTotalValues() {
+  public String getPrefix() {
+    return prefix;
+  }
+
+  public List<LongMetricValue> getTotalValue() {
     return totalValues;
   }
 
-  public LongMetricValue getTotalValues(String dimensionKey, String dimensionValue) {
+  public LongMetricValue getTotalValue(String dimensionKey, String dimensionValue) {
     for (LongMetricValue value : totalValues) {
       if (value.containDimension(dimensionKey, dimensionValue)) {
         return value;
@@ -71,7 +75,7 @@ public class CallMetric {
 
   public CallMetric merge(CallMetric metric) {
     return new CallMetric(this.prefix,
-        LongMetricValue.merge(metric.getTotalValues(), this.getTotalValues()),
+        LongMetricValue.merge(metric.getTotalValue(), this.getTotalValue()),
         DoubleMetricValue.merge(metric.getTpsValues(), this.getTpsValues()));
   }
 
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
index 9e2d687..a802a49 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
@@ -20,7 +20,7 @@ package io.servicecomb.metrics.core.event;
 import io.servicecomb.core.metrics.InvocationFinishedEvent;
 import io.servicecomb.foundation.common.event.Event;
 import io.servicecomb.foundation.common.event.EventListener;
-import io.servicecomb.metrics.core.MetricsDimension;
+import io.servicecomb.metrics.common.MetricsDimension;
 import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
 import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
 import io.servicecomb.metrics.core.monitor.RegistryMonitor;
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java
index f7516bb..2ea0fee 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java
@@ -20,7 +20,7 @@ package io.servicecomb.metrics.core.event;
 import io.servicecomb.core.metrics.InvocationStartedEvent;
 import io.servicecomb.foundation.common.event.Event;
 import io.servicecomb.foundation.common.event.EventListener;
-import io.servicecomb.metrics.core.MetricsDimension;
+import io.servicecomb.metrics.common.MetricsDimension;
 import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
 import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
 import io.servicecomb.metrics.core.monitor.RegistryMonitor;
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 bd2829f..986592d 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
@@ -29,7 +29,7 @@ import com.netflix.servo.monitor.StepCounter;
 import io.servicecomb.metrics.common.CallMetric;
 import io.servicecomb.metrics.common.DoubleMetricValue;
 import io.servicecomb.metrics.common.LongMetricValue;
-import io.servicecomb.metrics.core.MetricsDimension;
+import io.servicecomb.metrics.common.MetricsDimension;
 import io.servicecomb.metrics.core.utils.MonitorUtils;
 
 public class CallMonitor {
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 4f8f7df..076ecd1 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
@@ -20,7 +20,7 @@ package io.servicecomb.metrics.core.monitor;
 
 import io.servicecomb.metrics.common.ConsumerInvocationMetric;
 import io.servicecomb.metrics.common.MetricsConst;
-import io.servicecomb.metrics.core.MetricsDimension;
+import io.servicecomb.metrics.common.MetricsDimension;
 
 public class ConsumerInvocationMonitor extends InvocationMonitor {
   private final TimerMonitor consumerLatency;
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 a5cb7c4..82d426f 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
@@ -21,8 +21,8 @@ import com.netflix.servo.monitor.BasicCounter;
 import com.netflix.servo.monitor.MonitorConfig;
 
 import io.servicecomb.metrics.common.MetricsConst;
+import io.servicecomb.metrics.common.MetricsDimension;
 import io.servicecomb.metrics.common.ProducerInvocationMetric;
-import io.servicecomb.metrics.core.MetricsDimension;
 
 public class ProducerInvocationMonitor extends InvocationMonitor {
   private final BasicCounter waitInQueue;
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 fc797cb..c897bf1 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
@@ -37,6 +37,7 @@ 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.MetricsDimension;
 import io.servicecomb.metrics.common.RegistryMetric;
 import io.servicecomb.metrics.core.event.DefaultEventListenerManager;
 import io.servicecomb.metrics.core.monitor.DefaultSystemMonitor;
@@ -164,11 +165,11 @@ public class TestEventAndRunner {
         .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
     Assert.assertEquals(4, model.getInstanceMetric().getProducerMetric().getProducerCall()
-        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+        .getTotalValue(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);
+        .getTotalValue(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);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
     Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getCount());
     Assert.assertEquals(300, model.getInstanceMetric().getConsumerMetric().getConsumerLatency().getTotal(),
@@ -188,11 +189,11 @@ public class TestEventAndRunner {
         .getTpsValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
     Assert.assertEquals(1, model.getInstanceMetric().getConsumerMetric().getConsumerCall()
-        .getTotalValues(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL).getValue(), 0);
+        .getTotalValue(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);
+        .getTotalValue(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);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
     //check ProducerMetrics
     Assert.assertEquals(0, model.getProducerMetrics().get("fun1").getWaitInQueue());
@@ -222,11 +223,11 @@ public class TestEventAndRunner {
         .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);
+        .getTotalValue(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);
+        .getTotalValue(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);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
     //fun3
     Assert.assertEquals(0, model.getProducerMetrics().get("fun3").getWaitInQueue());
@@ -256,11 +257,11 @@ public class TestEventAndRunner {
         .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);
+        .getTotalValue(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);
+        .getTotalValue(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);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
     //check ConsumerMetrics
     //no need
@@ -278,11 +279,11 @@ public class TestEventAndRunner {
         .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);
+        .getTotalValue(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);
+        .getTotalValue(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);
+        .getTotalValue(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_FAILED).getValue(), 0);
 
     Map<String, Number> metrics = model.toMap();
     Assert.assertEquals(120, metrics.size());
diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
index a17310b..bad097b 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
@@ -15,23 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.metrics.prometheus;
+package io.servicecomb.metrics.prometheus;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
-import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric;
-import org.apache.servicecomb.metrics.common.ProducerInvocationMetric;
-import org.apache.servicecomb.metrics.common.RegistryMetric;
-import org.apache.servicecomb.metrics.core.publish.DataSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import io.prometheus.client.Collector;
 import io.prometheus.client.Collector.MetricFamilySamples.Sample;
+import io.servicecomb.metrics.common.CallMetric;
+import io.servicecomb.metrics.common.ConsumerInvocationMetric;
+import io.servicecomb.metrics.common.DoubleMetricValue;
+import io.servicecomb.metrics.common.LongMetricValue;
+import io.servicecomb.metrics.common.ProducerInvocationMetric;
+import io.servicecomb.metrics.common.RegistryMetric;
+import io.servicecomb.metrics.core.publish.DataSource;
 
 @Component
 public class MetricsCollector extends Collector implements Collector.Describable {
@@ -56,24 +58,70 @@ public class MetricsCollector extends Collector implements Collector.Describable
   private List<MetricFamilySamples> load() {
     RegistryMetric registryMetric = dataSource.getRegistryMetric();
     List<MetricFamilySamples> familySamples = new ArrayList<>();
-    familySamples.add(getFamilySamples("Instance Level", registryMetric.getInstanceMetric().toMap()));
-    for (Entry<String, ConsumerInvocationMetric> consumerMetric : registryMetric.getConsumerMetrics().entrySet()) {
-      familySamples
-          .add(getFamilySamples(consumerMetric.getKey() + " Consumer Side", consumerMetric.getValue().toMap()));
+
+    List<Sample> samples = new ArrayList<>();
+    samples.addAll(convertMetricValues(registryMetric.getInstanceMetric().getSystemMetric().toMap()));
+    samples.addAll(convertConsumerMetric(registryMetric.getInstanceMetric().getConsumerMetric()));
+    samples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getConsumerMetric().getConsumerCall()));
+    samples.addAll(convertProducerMetric(registryMetric.getInstanceMetric().getProducerMetric()));
+    samples.addAll(convertCallMetric(registryMetric.getInstanceMetric().getProducerMetric().getProducerCall()));
+    familySamples.add(new MetricFamilySamples("Instance Level", Type.UNTYPED, "Instance Level Metrics", samples));
+
+    if (registryMetric.getConsumerMetrics().size() != 0) {
+      samples = new ArrayList<>();
+      for (ConsumerInvocationMetric metric : registryMetric.getConsumerMetrics().values()) {
+        samples.addAll(convertConsumerMetric(metric));
+        samples.addAll(convertCallMetric(metric.getConsumerCall()));
+      }
+      familySamples.add(new MetricFamilySamples("Consumer Side", Type.UNTYPED, "Consumer Side Metrics", samples));
     }
-    for (Entry<String, ProducerInvocationMetric> producerMetric : registryMetric.getProducerMetrics().entrySet()) {
-      familySamples
-          .add(getFamilySamples(producerMetric.getKey() + " Producer Side", producerMetric.getValue().toMap()));
+
+    if (registryMetric.getProducerMetrics().size() != 0) {
+      samples = new ArrayList<>();
+      for (ProducerInvocationMetric metric : registryMetric.getProducerMetrics().values()) {
+        samples.addAll(convertProducerMetric(metric));
+        samples.addAll(convertCallMetric(metric.getProducerCall()));
+      }
+      familySamples.add(new MetricFamilySamples("Producer Side", Type.UNTYPED, "Producer Side Metrics", samples));
     }
+
     return familySamples;
   }
 
-  private MetricFamilySamples getFamilySamples(String name, Map<String, Number> metrics) {
-    List<Sample> samples = metrics.entrySet()
-        .stream()
-        .map((entry) -> new Sample(entry.getKey().replace(".", "_"),
-            new ArrayList<>(), new ArrayList<>(), entry.getValue().doubleValue()))
-        .collect(Collectors.toList());
-    return new MetricFamilySamples(name, Type.UNTYPED, name + " Metrics", samples);
+  private List<Sample> convertConsumerMetric(ConsumerInvocationMetric metric) {
+    return convertMetricValues(metric.getConsumerLatency().toMap());
+  }
+
+  private List<Sample> convertProducerMetric(ProducerInvocationMetric metric) {
+    List<Sample> samples = new ArrayList<>();
+    samples.addAll(convertMetricValues(metric.getExecutionTime().toMap()));
+    samples.addAll(convertMetricValues(metric.getLifeTimeInQueue().toMap()));
+    samples.addAll(convertMetricValues(metric.getProducerLatency().toMap()));
+    samples.add(new Sample(metric.getPrefix() + ".waitInQueue.count", new ArrayList<>(), new ArrayList<>(),
+        (double) metric.getWaitInQueue()));
+    return samples;
+  }
+
+  private List<Sample> convertMetricValues(Map<String, Number> metrics) {
+    return metrics.entrySet().stream().map((entry) ->
+        new Sample(entry.getKey().replace(".", "_"),
+            new ArrayList<>(), new ArrayList<>(), entry.getValue().doubleValue())).collect(Collectors.toList());
+  }
+
+  private List<Sample> convertCallMetric(CallMetric metric) {
+    List<Sample> samples = new ArrayList<>();
+    String totalName = (metric.getPrefix() + ".total").replace(".", "_");
+    for (LongMetricValue value : metric.getTotalValue()) {
+      samples.add(new Sample(totalName,
+          new ArrayList<>(value.getDimensions().keySet()), new ArrayList<>(value.getDimensions().values()),
+          (double) value.getValue()));
+    }
+    String tpsName = (metric.getPrefix() + ".tps").replace(".", "_");
+    for (DoubleMetricValue value : metric.getTpsValues()) {
+      samples.add(new Sample(tpsName,
+          new ArrayList<>(value.getDimensions().keySet()), new ArrayList<>(value.getDimensions().values()),
+          value.getValue()));
+    }
+    return samples;
   }
 }
diff --git a/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java b/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java
index 6cf6ab2..d73d30d 100644
--- a/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java
+++ b/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java
@@ -15,32 +15,35 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.samples.mwf;
+package io.servicecomb.samples.mwf;
 
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.servicecomb.metrics.common.CallMetric;
-import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric;
-import org.apache.servicecomb.metrics.common.RegistryMetric;
-import org.apache.servicecomb.metrics.common.SystemMetric;
-import org.apache.servicecomb.metrics.common.TimerMetric;
-import org.apache.servicecomb.metrics.core.publish.DataSource;
-import org.apache.servicecomb.serviceregistry.Features;
-import org.apache.servicecomb.serviceregistry.RegistryUtils;
-import org.apache.servicecomb.serviceregistry.ServiceRegistry;
-import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
-import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
-import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager;
-import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
-import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
-import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import io.servicecomb.metrics.common.CallMetric;
+import io.servicecomb.metrics.common.ConsumerInvocationMetric;
+import io.servicecomb.metrics.common.DoubleMetricValue;
+import io.servicecomb.metrics.common.LongMetricValue;
+import io.servicecomb.metrics.common.RegistryMetric;
+import io.servicecomb.metrics.common.SystemMetric;
+import io.servicecomb.metrics.common.TimerMetric;
+import io.servicecomb.metrics.core.publish.DataSource;
+import io.servicecomb.serviceregistry.Features;
+import io.servicecomb.serviceregistry.RegistryUtils;
+import io.servicecomb.serviceregistry.ServiceRegistry;
+import io.servicecomb.serviceregistry.api.registry.Microservice;
+import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import io.servicecomb.serviceregistry.cache.InstanceCacheManager;
+import io.servicecomb.serviceregistry.client.ServiceRegistryClient;
+import io.servicecomb.serviceregistry.client.http.MicroserviceInstances;
+import io.servicecomb.serviceregistry.consumer.AppManager;
 import mockit.Expectations;
 
 public class TestWriteFile {
@@ -134,20 +137,22 @@ public class TestWriteFile {
 
     StringBuilder builder = new StringBuilder();
 
-    MetricsFileWriter writer =
-        (loggerName, filePrefix, content) -> builder.append(loggerName).append(filePrefix).append(content);
+    MetricsFileWriter writer = (loggerName, filePrefix, content) ->
+        builder.append(loggerName).append(filePrefix).append(content);
 
     SystemMetric systemMetric = new SystemMetric(50, 10, 1, 2, 3,
         4, 5, 6, 7, 8);
 
     Map<String, ConsumerInvocationMetric> consumerInvocationMetricMap = new HashMap<>();
-    consumerInvocationMetricMap.put("A",
-        new ConsumerInvocationMetric("A", "A",
-            new TimerMetric("A1", 1, 2, 3, 4), new CallMetric("A2", 100, 999.44444)));
-
-    consumerInvocationMetricMap.put("B",
-        new ConsumerInvocationMetric("B", "B",
-            new TimerMetric("B1", 1, 2, 3, 4), new CallMetric("B2", 100, 888.66666)));
+    consumerInvocationMetricMap.put("A", new ConsumerInvocationMetric("A", "A",
+        new TimerMetric("A1", 1, 2, 3, 4),
+        new CallMetric("A2", Arrays.asList(new LongMetricValue("A2", 100L, new HashMap<>())),
+            Arrays.asList(new DoubleMetricValue("A2", 999.44444, new HashMap<>())))));
+
+    consumerInvocationMetricMap.put("B", new ConsumerInvocationMetric("B", "B",
+        new TimerMetric("B1", 1, 2, 3, 4),
+        new CallMetric("B2", Arrays.asList(new LongMetricValue("B2", 100L, new HashMap<>())),
+            Arrays.asList(new DoubleMetricValue("B2", 888.66666, new HashMap<>())))));
 
     RegistryMetric metric = new RegistryMetric(systemMetric, consumerInvocationMetricMap, new HashMap<>());
 

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

[incubator-servicecomb-java-chassis] 01/10: SCB-150 add success/failed dimension for call count and tps

Posted by ni...@apache.org.
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 37a2d03a0c523b3dd7c65bbebff6d0e39973dd5d
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Thu Jan 11 14:14:09 2018 +0800

    SCB-150 add success/failed dimension for call count and tps
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 metrics/metrics-common/pom.xml                     |  4 +-
 .../metrics/common/DoubleMetricValue.java          | 60 ++++++++++++++++++++
 .../metrics/common/LongMetricValue.java            | 60 ++++++++++++++++++++
 .../io/servicecomb/metrics/common/MetricValue.java | 65 ++++++++++++++++++++++
 .../servicecomb/metrics/common/CallMetric.java     | 37 +++++++-----
 .../servicecomb/metrics/core/MetricsDimension.java | 39 +++++++++++++
 .../metrics/core/monitor/CallMonitor.java          | 65 ++++++++++++++++++----
 7 files changed, 304 insertions(+), 26 deletions(-)

diff --git a/metrics/metrics-common/pom.xml b/metrics/metrics-common/pom.xml
index 21dddbd..5987595 100644
--- a/metrics/metrics-common/pom.xml
+++ b/metrics/metrics-common/pom.xml
@@ -31,8 +31,8 @@
 
   <dependencies>
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
+      <groupId>io.servicecomb</groupId>
+      <artifactId>foundation-common</artifactId>
     </dependency>
   </dependencies>
 
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
new file mode 100644
index 0000000..c116562
--- /dev/null
+++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.servicecomb.metrics.common;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.servicecomb.foundation.common.exceptions.ServiceCombException;
+
+public class DoubleMetricValue extends MetricValue<Double> {
+  public DoubleMetricValue(Double value, Map<String, String> dimensions) {
+    super(value, dimensions);
+  }
+
+  public DoubleMetricValue(@JsonProperty("key") String key,
+      @JsonProperty("value") Double value,
+      @JsonProperty("dimensions") Map<String, String> dimensions) {
+    super(key, value, dimensions);
+  }
+
+  public DoubleMetricValue merge(DoubleMetricValue value) {
+    if (this.getKey().equals(value.getKey())) {
+      return new DoubleMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions());
+    }
+    throw new ServiceCombException("unable merge different key values,source key :" + value.getKey() +
+        " target key :" + this.getKey());
+  }
+
+  public static List<DoubleMetricValue> merge(List<DoubleMetricValue> source, List<DoubleMetricValue> target) {
+    Map<String, DoubleMetricValue> finalValues = new HashMap<>();
+    for (DoubleMetricValue t : target) {
+      finalValues.put(t.getKey(), t);
+    }
+    for (DoubleMetricValue s : source) {
+      if (finalValues.containsKey(s.getKey())) {
+        finalValues.put(s.getKey(), finalValues.get(s.getKey()).merge(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
new file mode 100644
index 0000000..eb0ac8d
--- /dev/null
+++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.servicecomb.metrics.common;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import io.servicecomb.foundation.common.exceptions.ServiceCombException;
+
+public class LongMetricValue extends MetricValue<Long> {
+  public LongMetricValue(Long value, Map<String, String> dimensions) {
+    super(value, dimensions);
+  }
+
+  public LongMetricValue(@JsonProperty("key") String key,
+      @JsonProperty("value") Long value,
+      @JsonProperty("dimensions") Map<String, String> dimensions) {
+    super(key, value, dimensions);
+  }
+
+  public LongMetricValue merge(LongMetricValue value) {
+    if (this.getKey().equals(value.getKey())) {
+      return new LongMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions());
+    }
+    throw new ServiceCombException("unable merge different key values,source key :" + value.getKey() +
+        " target key :" + this.getKey());
+  }
+
+  public static List<LongMetricValue> merge(List<LongMetricValue> source, List<LongMetricValue> target) {
+    Map<String, LongMetricValue> finalValues = new HashMap<>();
+    for (LongMetricValue t : target) {
+      finalValues.put(t.getKey(), t);
+    }
+    for (LongMetricValue s : source) {
+      if (finalValues.containsKey(s.getKey())) {
+        finalValues.put(s.getKey(), finalValues.get(s.getKey()).merge(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
new file mode 100644
index 0000000..c368aba
--- /dev/null
+++ b/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.servicecomb.metrics.common;
+
+import java.util.Arrays;
+import java.util.Map;
+
+public class MetricValue<T extends Number> {
+  private final String key;
+
+  private final T value;
+
+  private final Map<String, String> dimensions;
+
+  public String getKey() {
+    return key;
+  }
+
+  public T getValue() {
+    return value;
+  }
+
+  public Map<String, String> getDimensions() {
+    return dimensions;
+  }
+
+  public MetricValue(T value, Map<String, String> dimensions) {
+    String finalKey = "{}";
+    if (dimensions != null && dimensions.size() != 0) {
+      String[] keys = dimensions.keySet().toArray(new String[0]);
+      Arrays.sort(keys);
+      StringBuilder builder = new StringBuilder("{");
+      for (String key : keys) {
+        builder.append(String.format("%s=%s,", key, dimensions.get(key)));
+      }
+      builder.deleteCharAt(dimensions.size() - 1);
+      builder.append("}");
+      finalKey = builder.toString();
+    }
+    this.key = finalKey;
+    this.value = value;
+    this.dimensions = dimensions;
+  }
+
+  public MetricValue(String key, T value, Map<String, String> dimensions) {
+    this.key = key;
+    this.value = value;
+    this.dimensions = dimensions;
+  }
+}
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 5e0d63b..a65ee92 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
@@ -17,7 +17,9 @@
 
 package org.apache.servicecomb.metrics.common;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -25,37 +27,44 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 public class CallMetric {
   private final String prefix;
 
-  private final long total;
+  private final List<LongMetricValue> totalValues;
 
-  private final double tps;
+  private final List<DoubleMetricValue> tpsValues;
 
-  public long getTotal() {
-    return total;
+  public List<LongMetricValue> getTotalValues() {
+    return totalValues;
   }
 
-  public double getTps() {
-    return tps;
+  public List<DoubleMetricValue> getTpsValues() {
+    return tpsValues;
   }
 
   public CallMetric(String prefix) {
-    this(prefix, 0, 0);
+    this(prefix, new ArrayList<>(), new ArrayList<>());
   }
 
-  public CallMetric(@JsonProperty("prefix") String prefix, @JsonProperty("total") long total,
-      @JsonProperty("tps") double tps) {
+  public CallMetric(@JsonProperty("prefix") String prefix,
+      @JsonProperty("totalValues") List<LongMetricValue> totalValues,
+      @JsonProperty("tpsValues") List<DoubleMetricValue> tpsValues) {
     this.prefix = prefix;
-    this.total = total;
-    this.tps = tps;
+    this.totalValues = totalValues;
+    this.tpsValues = tpsValues;
   }
 
   public CallMetric merge(CallMetric metric) {
-    return new CallMetric(this.prefix, this.total + metric.total, this.tps + metric.tps);
+    return new CallMetric(this.prefix,
+        LongMetricValue.merge(metric.getTotalValues(), this.getTotalValues()),
+        DoubleMetricValue.merge(metric.getTpsValues(), this.getTpsValues()));
   }
 
   public Map<String, Number> toMap() {
     Map<String, Number> metrics = new HashMap<>();
-    metrics.put(prefix + ".total", total);
-    metrics.put(prefix + ".tps", tps);
+    for (MetricValue totalValue : totalValues) {
+      metrics.put(prefix + ".total." + totalValue.getKey(), totalValue.getValue());
+    }
+    for (MetricValue tpsValue : tpsValues) {
+      metrics.put(prefix + ".tps." + tpsValue.getKey(), tpsValue.getValue());
+    }
     return metrics;
   }
 }
diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java
new file mode 100644
index 0000000..bf9170f
--- /dev/null
+++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/MetricsDimension.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.servicecomb.metrics.core;
+
+import io.servicecomb.foundation.common.exceptions.ServiceCombException;
+
+public class MetricsDimension {
+  public static final String DIMENSION_STATUS = "Status";
+
+  public static final String DIMENSION_STATUS_ALL = "all";
+
+  public static final String DIMENSION_STATUS_SUCCESS = "success";
+
+  public static final String DIMENSION_STATUS_FAILED = "failed";
+
+  public static String[] getDimensionOptions(String dimension) {
+    if (DIMENSION_STATUS.equals(dimension)) {
+      return new String[] {MetricsDimension.DIMENSION_STATUS_ALL,
+          MetricsDimension.DIMENSION_STATUS_SUCCESS,
+          MetricsDimension.DIMENSION_STATUS_FAILED};
+    }
+    throw new ServiceCombException("illegal dimension key : " + dimension);
+  }
+}
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 1e68201..7174e33 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
@@ -19,37 +19,82 @@ package org.apache.servicecomb.metrics.core.monitor;
 
 import org.apache.servicecomb.metrics.common.CallMetric;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import com.netflix.servo.monitor.BasicCounter;
 import com.netflix.servo.monitor.MonitorConfig;
 import com.netflix.servo.monitor.StepCounter;
+import com.netflix.servo.tag.Tag;
+import com.netflix.servo.tag.TagList;
+
+import io.servicecomb.metrics.common.CallMetric;
+import io.servicecomb.metrics.common.DoubleMetricValue;
+import io.servicecomb.metrics.common.LongMetricValue;
+import io.servicecomb.metrics.core.MetricsDimension;
 
 public class CallMonitor {
   private final String prefix;
 
-  private final BasicCounter total;
+  private final List<BasicCounter> totalCounters;
 
-  private final StepCounter tps;
+  private final List<StepCounter> tpsCounters;
 
-  public CallMonitor(String prefix) {
+  public CallMonitor(String prefix, String... dimensions) {
     this.prefix = prefix;
-    this.total = new BasicCounter(MonitorConfig.builder(prefix + ".total").build());
-    this.tps = new StepCounter(MonitorConfig.builder(prefix + ".tps").build());
+    this.totalCounters = new ArrayList<>();
+    this.tpsCounters = new ArrayList<>();
+    if (dimensions.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)) {
+          this.totalCounters
+              .add(new BasicCounter(MonitorConfig.builder(prefix + ".total").withTag(dimension, option).build()));
+          this.tpsCounters
+              .add(new StepCounter(MonitorConfig.builder(prefix + ".tps").withTag(dimension, option).build()));
+        }
+      }
+    }
   }
 
   public void increment() {
-    total.increment();
-    tps.increment();
+    for (int i = 0; i < totalCounters.size(); i++) {
+      totalCounters.get(i).increment();
+      tpsCounters.get(i).increment();
+    }
   }
 
   public CallMetric toMetric(int windowTimeIndex) {
-    return new CallMetric(this.prefix, total.getValue(windowTimeIndex).longValue(),
-        this.adjustValue(tps.getValue(windowTimeIndex).doubleValue()));
+    List<LongMetricValue> totalValues = new ArrayList<>();
+    List<DoubleMetricValue> tpsValues = new ArrayList<>();
+    for (int i = 0; i < totalCounters.size(); i++) {
+      totalValues.add(new LongMetricValue(totalCounters.get(i).getValue(windowTimeIndex).longValue(),
+          convertTags(totalCounters.get(i).getConfig().getTags())));
+      tpsValues.add(new DoubleMetricValue(adjustValue(tpsCounters.get(i).getValue(windowTimeIndex).doubleValue()),
+          convertTags(tpsCounters.get(i).getConfig().getTags())));
+    }
+    return new CallMetric(this.prefix, totalValues, tpsValues);
   }
 
   //for time-related monitor type, if stop poll value over one window time,
   //the value may return -1 because servo can't known precise value of previous step
   //so must change to return 0
-  public double adjustValue(double value) {
+  private double adjustValue(double value) {
     return value < 0 ? 0 : value;
   }
+
+  private Map<String, String> convertTags(TagList tags) {
+    if (tags.size() != 0) {
+      Map<String, String> tagMap = new HashMap<>();
+      for (Tag tag : tags) {
+        tagMap.put(tag.getKey(), tag.getValue());
+      }
+      return tagMap;
+    }
+    return null;
+  }
 }

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

[incubator-servicecomb-java-chassis] 08/10: SCB-150 update package name and resolve conflicts

Posted by ni...@apache.org.
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 cbd7092a004eb54827f88792f3cd692e2279e5f7
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Mon Jan 15 09:22:02 2018 +0800

    SCB-150 update package name and resolve conflicts
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../demo/springmvc/client/SpringmvcClient.java     |  3 +-
 .../demo/perf/PerfMetricsFilePublisher.java        |  1 +
 metrics/metrics-common/pom.xml                     |  2 +-
 .../metrics/common/DoubleMetricValue.java          |  8 ++--
 .../metrics/common/LongMetricValue.java            |  8 ++--
 .../servicecomb/metrics/common/MetricValue.java    |  2 +-
 .../metrics/common/MetricsDimension.java           |  4 +-
 .../event/InvocationFinishedEventListener.java     | 18 ++++-----
 .../core/event/InvocationStartedEventListener.java | 18 ++++-----
 .../metrics/core/monitor/CallMonitor.java          | 14 +++----
 .../core/monitor/ConsumerInvocationMonitor.java    |  8 ++--
 .../core/monitor/ProducerInvocationMonitor.java    | 10 ++---
 .../metrics/core/monitor/TimerMonitor.java         |  8 ++--
 .../metrics/core/utils/MonitorUtils.java           |  2 +-
 .../metrics/core/TestEventAndRunner.java           | 25 ++++++------
 .../metrics/prometheus/MetricsCollector.java       | 16 ++++----
 .../servicecomb/samples/mwf/TestWriteFile.java     | 45 +++++++++++-----------
 17 files changed, 96 insertions(+), 96 deletions(-)

diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
index 7ee9c14..08eec9b 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
@@ -29,6 +29,7 @@ import org.apache.servicecomb.demo.controller.Person;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.foundation.common.utils.JsonUtils;
 import org.apache.servicecomb.foundation.common.utils.Log4jUtils;
+import org.apache.servicecomb.metrics.common.MetricsDimension;
 import org.apache.servicecomb.metrics.common.MetricsPublisher;
 import org.apache.servicecomb.metrics.common.RegistryMetric;
 import org.apache.servicecomb.provider.springmvc.reference.CseRestTemplate;
@@ -58,7 +59,7 @@ public class SpringmvcClient {
     TestMgr.summary();
   }
 
-  public static void run() throws Exception {
+  public static void run() {
     templateUrlWithServiceName.setRequestFactory(new UrlWithServiceNameClientHttpRequestFactory());
     restTemplate = RestTemplateBuilder.create();
     controller = BeanUtils.getBean("controller");
diff --git a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java
index 8a490a0..f04fdcd 100644
--- a/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java
+++ b/demo/perf/src/main/java/org/apache/servicecomb/demo/perf/PerfMetricsFilePublisher.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.demo.perf;
 import java.util.Map.Entry;
 
 import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric;
+import org.apache.servicecomb.metrics.common.MetricsDimension;
 import org.apache.servicecomb.metrics.common.ProducerInvocationMetric;
 import org.apache.servicecomb.metrics.common.RegistryMetric;
 import org.apache.servicecomb.metrics.core.publish.DataSource;
diff --git a/metrics/metrics-common/pom.xml b/metrics/metrics-common/pom.xml
index 5987595..3ac7fae 100644
--- a/metrics/metrics-common/pom.xml
+++ b/metrics/metrics-common/pom.xml
@@ -31,7 +31,7 @@
 
   <dependencies>
     <dependency>
-      <groupId>io.servicecomb</groupId>
+      <groupId>org.apache.servicecomb</groupId>
       <artifactId>foundation-common</artifactId>
     </dependency>
   </dependencies>
diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java
similarity index 92%
rename from metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java
rename to metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java
index 8b83191..30a7790 100644
--- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/DoubleMetricValue.java
+++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/DoubleMetricValue.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.common;
+package org.apache.servicecomb.metrics.common;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 
-import io.servicecomb.foundation.common.exceptions.ServiceCombException;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class DoubleMetricValue extends MetricValue<Double> {
   public DoubleMetricValue(Double value, Map<String, String> dimensions) {
@@ -37,7 +37,7 @@ public class DoubleMetricValue extends MetricValue<Double> {
     super(key, value, dimensions);
   }
 
-  public DoubleMetricValue merge(DoubleMetricValue value) {
+  private DoubleMetricValue merge(DoubleMetricValue value) {
     if (this.getKey().equals(value.getKey())) {
       return new DoubleMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions());
     }
diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java
similarity index 92%
rename from metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java
rename to metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java
index 6f7429c..84babff 100644
--- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/LongMetricValue.java
+++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/LongMetricValue.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.common;
+package org.apache.servicecomb.metrics.common;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 
-import io.servicecomb.foundation.common.exceptions.ServiceCombException;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class LongMetricValue extends MetricValue<Long> {
   public LongMetricValue(Long value, Map<String, String> dimensions) {
@@ -37,7 +37,7 @@ public class LongMetricValue extends MetricValue<Long> {
     super(key, value, dimensions);
   }
 
-  public LongMetricValue merge(LongMetricValue value) {
+  private LongMetricValue merge(LongMetricValue value) {
     if (this.getKey().equals(value.getKey())) {
       return new LongMetricValue(this.getKey(), this.getValue() + value.getValue(), this.getDimensions());
     }
diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricValue.java
similarity index 97%
rename from metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java
rename to metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricValue.java
index f1f95e3..0a8d364 100644
--- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricValue.java
+++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricValue.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.common;
+package org.apache.servicecomb.metrics.common;
 
 import java.util.Arrays;
 import java.util.Map;
diff --git a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java
similarity index 91%
rename from metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java
rename to metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java
index d8f661f..23f1f40 100644
--- a/metrics/metrics-common/src/main/java/io/servicecomb/metrics/common/MetricsDimension.java
+++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/MetricsDimension.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.common;
+package org.apache.servicecomb.metrics.common;
 
-import io.servicecomb.foundation.common.exceptions.ServiceCombException;
+import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 
 public class MetricsDimension {
   public static final String DIMENSION_STATUS = "Status";
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
index a802a49..8d15eac 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.core.event;
+package org.apache.servicecomb.metrics.core.event;
 
-import io.servicecomb.core.metrics.InvocationFinishedEvent;
-import io.servicecomb.foundation.common.event.Event;
-import io.servicecomb.foundation.common.event.EventListener;
-import io.servicecomb.metrics.common.MetricsDimension;
-import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
-import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
-import io.servicecomb.metrics.core.monitor.RegistryMonitor;
-import io.servicecomb.swagger.invocation.InvocationType;
+import org.apache.servicecomb.core.metrics.InvocationFinishedEvent;
+import org.apache.servicecomb.foundation.common.event.Event;
+import org.apache.servicecomb.foundation.common.event.EventListener;
+import org.apache.servicecomb.metrics.common.MetricsDimension;
+import org.apache.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
+import org.apache.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
+import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor;
+import org.apache.servicecomb.swagger.invocation.InvocationType;
 
 public class InvocationFinishedEventListener implements EventListener {
 
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java
index 2ea0fee..c13d173 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.core.event;
+package org.apache.servicecomb.metrics.core.event;
 
-import io.servicecomb.core.metrics.InvocationStartedEvent;
-import io.servicecomb.foundation.common.event.Event;
-import io.servicecomb.foundation.common.event.EventListener;
-import io.servicecomb.metrics.common.MetricsDimension;
-import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
-import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
-import io.servicecomb.metrics.core.monitor.RegistryMonitor;
-import io.servicecomb.swagger.invocation.InvocationType;
+import org.apache.servicecomb.core.metrics.InvocationStartedEvent;
+import org.apache.servicecomb.foundation.common.event.Event;
+import org.apache.servicecomb.foundation.common.event.EventListener;
+import org.apache.servicecomb.metrics.common.MetricsDimension;
+import org.apache.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
+import org.apache.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
+import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor;
+import org.apache.servicecomb.swagger.invocation.InvocationType;
 
 public class InvocationStartedEventListener implements EventListener {
 
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 986592d..068776e 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
@@ -17,21 +17,19 @@
 
 package org.apache.servicecomb.metrics.core.monitor;
 
-import org.apache.servicecomb.metrics.common.CallMetric;
-
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.servicecomb.metrics.common.CallMetric;
+import org.apache.servicecomb.metrics.common.DoubleMetricValue;
+import org.apache.servicecomb.metrics.common.LongMetricValue;
+import org.apache.servicecomb.metrics.common.MetricsDimension;
+import org.apache.servicecomb.metrics.core.utils.MonitorUtils;
+
 import com.netflix.servo.monitor.BasicCounter;
 import com.netflix.servo.monitor.MonitorConfig;
 import com.netflix.servo.monitor.StepCounter;
 
-import io.servicecomb.metrics.common.CallMetric;
-import io.servicecomb.metrics.common.DoubleMetricValue;
-import io.servicecomb.metrics.common.LongMetricValue;
-import io.servicecomb.metrics.common.MetricsDimension;
-import io.servicecomb.metrics.core.utils.MonitorUtils;
-
 public class CallMonitor {
   private final String prefix;
 
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 076ecd1..9a09551 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,12 +15,12 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.core.monitor;
+package org.apache.servicecomb.metrics.core.monitor;
 
 
-import io.servicecomb.metrics.common.ConsumerInvocationMetric;
-import io.servicecomb.metrics.common.MetricsConst;
-import io.servicecomb.metrics.common.MetricsDimension;
+import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric;
+import org.apache.servicecomb.metrics.common.MetricsConst;
+import org.apache.servicecomb.metrics.common.MetricsDimension;
 
 public class ConsumerInvocationMonitor extends InvocationMonitor {
   private final TimerMonitor consumerLatency;
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 82d426f..50a508c 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,15 +15,15 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.core.monitor;
+package org.apache.servicecomb.metrics.core.monitor;
+
+import org.apache.servicecomb.metrics.common.MetricsConst;
+import org.apache.servicecomb.metrics.common.MetricsDimension;
+import org.apache.servicecomb.metrics.common.ProducerInvocationMetric;
 
 import com.netflix.servo.monitor.BasicCounter;
 import com.netflix.servo.monitor.MonitorConfig;
 
-import io.servicecomb.metrics.common.MetricsConst;
-import io.servicecomb.metrics.common.MetricsDimension;
-import io.servicecomb.metrics.common.ProducerInvocationMetric;
-
 public class ProducerInvocationMonitor extends InvocationMonitor {
   private final BasicCounter waitInQueue;
 
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java
index 33ba8ab..a88a604 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java
@@ -15,16 +15,16 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.core.monitor;
+package org.apache.servicecomb.metrics.core.monitor;
+
+import org.apache.servicecomb.metrics.common.TimerMetric;
+import org.apache.servicecomb.metrics.core.utils.MonitorUtils;
 
 import com.netflix.servo.monitor.MaxGauge;
 import com.netflix.servo.monitor.MinGauge;
 import com.netflix.servo.monitor.MonitorConfig;
 import com.netflix.servo.monitor.StepCounter;
 
-import io.servicecomb.metrics.common.TimerMetric;
-import io.servicecomb.metrics.core.utils.MonitorUtils;
-
 public class TimerMonitor {
   private final String prefix;
 
diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java
similarity index 98%
rename from metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java
rename to metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java
index 741cdd5..31be367 100644
--- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/utils/MonitorUtils.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.core.utils;
+package org.apache.servicecomb.metrics.core.utils;
 
 import java.util.HashMap;
 import java.util.Map;
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 c897bf1..8e87439 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 io.servicecomb.metrics.core;
+package org.apache.servicecomb.metrics.core;
 
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.mockito.Mockito.when;
@@ -29,22 +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.MetricsDimension;
+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.MetricsDimension;
-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
diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
index f784722..290d383 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
@@ -15,25 +15,25 @@
  * limitations under the License.
  */
 
-package io.servicecomb.metrics.prometheus;
+package org.apache.servicecomb.metrics.prometheus;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import org.apache.servicecomb.metrics.common.CallMetric;
+import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric;
+import org.apache.servicecomb.metrics.common.DoubleMetricValue;
+import org.apache.servicecomb.metrics.common.LongMetricValue;
+import org.apache.servicecomb.metrics.common.ProducerInvocationMetric;
+import org.apache.servicecomb.metrics.common.RegistryMetric;
+import org.apache.servicecomb.metrics.core.publish.DataSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import io.prometheus.client.Collector;
 import io.prometheus.client.Collector.MetricFamilySamples.Sample;
-import io.servicecomb.metrics.common.CallMetric;
-import io.servicecomb.metrics.common.ConsumerInvocationMetric;
-import io.servicecomb.metrics.common.DoubleMetricValue;
-import io.servicecomb.metrics.common.LongMetricValue;
-import io.servicecomb.metrics.common.ProducerInvocationMetric;
-import io.servicecomb.metrics.common.RegistryMetric;
-import io.servicecomb.metrics.core.publish.DataSource;
 
 @Component
 public class MetricsCollector extends Collector implements Collector.Describable {
diff --git a/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java b/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java
index d73d30d..d550f77 100644
--- a/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java
+++ b/samples/metrics-write-file-sample/metrics-write-file/src/test/java/org/apache/servicecomb/samples/mwf/TestWriteFile.java
@@ -15,35 +15,36 @@
  * limitations under the License.
  */
 
-package io.servicecomb.samples.mwf;
+package org.apache.servicecomb.samples.mwf;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.servicecomb.metrics.common.CallMetric;
+import org.apache.servicecomb.metrics.common.ConsumerInvocationMetric;
+import org.apache.servicecomb.metrics.common.DoubleMetricValue;
+import org.apache.servicecomb.metrics.common.LongMetricValue;
+import org.apache.servicecomb.metrics.common.RegistryMetric;
+import org.apache.servicecomb.metrics.common.SystemMetric;
+import org.apache.servicecomb.metrics.common.TimerMetric;
+import org.apache.servicecomb.metrics.core.publish.DataSource;
+import org.apache.servicecomb.serviceregistry.Features;
+import org.apache.servicecomb.serviceregistry.RegistryUtils;
+import org.apache.servicecomb.serviceregistry.ServiceRegistry;
+import org.apache.servicecomb.serviceregistry.api.registry.Microservice;
+import org.apache.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
+import org.apache.servicecomb.serviceregistry.cache.InstanceCacheManager;
+import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient;
+import org.apache.servicecomb.serviceregistry.client.http.MicroserviceInstances;
+import org.apache.servicecomb.serviceregistry.consumer.AppManager;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
 
-import io.servicecomb.metrics.common.CallMetric;
-import io.servicecomb.metrics.common.ConsumerInvocationMetric;
-import io.servicecomb.metrics.common.DoubleMetricValue;
-import io.servicecomb.metrics.common.LongMetricValue;
-import io.servicecomb.metrics.common.RegistryMetric;
-import io.servicecomb.metrics.common.SystemMetric;
-import io.servicecomb.metrics.common.TimerMetric;
-import io.servicecomb.metrics.core.publish.DataSource;
-import io.servicecomb.serviceregistry.Features;
-import io.servicecomb.serviceregistry.RegistryUtils;
-import io.servicecomb.serviceregistry.ServiceRegistry;
-import io.servicecomb.serviceregistry.api.registry.Microservice;
-import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
-import io.servicecomb.serviceregistry.cache.InstanceCacheManager;
-import io.servicecomb.serviceregistry.client.ServiceRegistryClient;
-import io.servicecomb.serviceregistry.client.http.MicroserviceInstances;
-import io.servicecomb.serviceregistry.consumer.AppManager;
 import mockit.Expectations;
 
 public class TestWriteFile {
@@ -146,13 +147,13 @@ public class TestWriteFile {
     Map<String, ConsumerInvocationMetric> consumerInvocationMetricMap = new HashMap<>();
     consumerInvocationMetricMap.put("A", new ConsumerInvocationMetric("A", "A",
         new TimerMetric("A1", 1, 2, 3, 4),
-        new CallMetric("A2", Arrays.asList(new LongMetricValue("A2", 100L, new HashMap<>())),
-            Arrays.asList(new DoubleMetricValue("A2", 999.44444, new HashMap<>())))));
+        new CallMetric("A2", Collections.singletonList(new LongMetricValue("A2", 100L, new HashMap<>())),
+            Collections.singletonList(new DoubleMetricValue("A2", 999.44444, new HashMap<>())))));
 
     consumerInvocationMetricMap.put("B", new ConsumerInvocationMetric("B", "B",
         new TimerMetric("B1", 1, 2, 3, 4),
-        new CallMetric("B2", Arrays.asList(new LongMetricValue("B2", 100L, new HashMap<>())),
-            Arrays.asList(new DoubleMetricValue("B2", 888.66666, new HashMap<>())))));
+        new CallMetric("B2", Collections.singletonList(new LongMetricValue("B2", 100L, new HashMap<>())),
+            Collections.singletonList(new DoubleMetricValue("B2", 888.66666, new HashMap<>())))));
 
     RegistryMetric metric = new RegistryMetric(systemMetric, consumerInvocationMetricMap, new HashMap<>());
 

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

[incubator-servicecomb-java-chassis] 02/10: SCB-150 impl success /failed in invocation and event

Posted by ni...@apache.org.
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 98a141bbc5873f6f38c6be1e535ac683ce30d635
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Fri Jan 12 10:15:43 2018 +0800

    SCB-150 impl success /failed in invocation and event
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../common/rest/AbstractRestInvocation.java        |  2 +-
 .../org/apache/servicecomb/core/Invocation.java    |  4 +-
 .../core/metrics/InvocationFinishedEvent.java      | 10 +++-
 .../core/provider/consumer/InvokerUtils.java       | 12 ++--
 .../metrics/core/utils/MonitorUtils.java           | 66 ++++++++++++++++++++++
 .../event/InvocationFinishedEventListener.java     | 21 ++++---
 .../core/event/InvocationStartedEventListener.java | 21 +++----
 .../metrics/core/monitor/CallMonitor.java          | 47 +++++++--------
 .../metrics/core/monitor/DefaultSystemMonitor.java |  6 +-
 .../metrics/core/monitor/TimerMonitor.java         | 30 +++-------
 .../transport/highway/HighwayServerInvoke.java     |  2 +-
 11 files changed, 144 insertions(+), 77 deletions(-)

diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
index 2efcdd1..0ee7999 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/AbstractRestInvocation.java
@@ -189,7 +189,7 @@ public abstract class AbstractRestInvocation {
     invocation.next(resp -> {
       sendResponseQuietly(resp);
 
-      invocation.triggerFinishedEvent();
+      invocation.triggerFinishedEvent(resp.isSuccessed());
       endMetrics();
     });
   }
diff --git a/core/src/main/java/org/apache/servicecomb/core/Invocation.java b/core/src/main/java/org/apache/servicecomb/core/Invocation.java
index ea5e811..19241b8 100644
--- a/core/src/main/java/org/apache/servicecomb/core/Invocation.java
+++ b/core/src/main/java/org/apache/servicecomb/core/Invocation.java
@@ -202,12 +202,12 @@ public class Invocation extends SwaggerInvocation {
         operationMeta.getMicroserviceQualifiedName(), this.invocationType, startProcessingTime - startTime));
   }
 
-  public void triggerFinishedEvent() {
+  public void triggerFinishedEvent(boolean success) {
     long finishedTime = System.nanoTime();
     EventUtils
         .triggerEvent(new InvocationFinishedEvent(operationMeta.getMicroserviceQualifiedName(),
             this.invocationType, finishedTime - startProcessingTime,
-            finishedTime - startTime));
+            finishedTime - startTime, success));
   }
 
   public boolean isSync() {
diff --git a/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java b/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java
index 4ecf2ad..ea54d67 100644
--- a/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java
+++ b/core/src/main/java/org/apache/servicecomb/core/metrics/InvocationFinishedEvent.java
@@ -29,6 +29,8 @@ public class InvocationFinishedEvent implements Event {
 
   private final long totalElapsedNanoTime;
 
+  private final boolean success;
+
   public String getOperationName() {
     return operationName;
   }
@@ -45,12 +47,18 @@ public class InvocationFinishedEvent implements Event {
     return totalElapsedNanoTime;
   }
 
+  public boolean isSuccess() {
+    return success;
+  }
+
   public InvocationFinishedEvent(String operationName, InvocationType invocationType,
       long processElapsedNanoTime,
-      long totalElapsedNanoTime) {
+      long totalElapsedNanoTime,
+      boolean success) {
     this.operationName = operationName;
     this.invocationType = invocationType;
     this.processElapsedNanoTime = processElapsedNanoTime;
     this.totalElapsedNanoTime = totalElapsedNanoTime;
+    this.success = success;
   }
 }
diff --git a/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java b/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java
index cabc7fb..e8b8247 100644
--- a/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java
+++ b/core/src/main/java/org/apache/servicecomb/core/provider/consumer/InvokerUtils.java
@@ -62,6 +62,7 @@ public final class InvokerUtils {
   }
 
   public static Response innerSyncInvoke(Invocation invocation) {
+    boolean success = false;
     try {
       triggerStartedEvent(invocation);
       SyncResponseExecutor respExecutor = new SyncResponseExecutor();
@@ -69,14 +70,16 @@ public final class InvokerUtils {
 
       invocation.next(respExecutor::setResponse);
 
-      return respExecutor.waitResponse();
+      Response response = respExecutor.waitResponse();
+      success = response.isSuccessed();
+      return response;
     } catch (Throwable e) {
       String msg =
           String.format("invoke failed, %s", invocation.getOperationMeta().getMicroserviceQualifiedName());
       LOGGER.debug(msg, e);
       return Response.createConsumerFail(e);
     } finally {
-      invocation.triggerFinishedEvent();
+      invocation.triggerFinishedEvent(success);
     }
   }
 
@@ -89,12 +92,11 @@ public final class InvokerUtils {
       invocation.setResponseExecutor(respExecutor);
 
       invocation.next(ar -> {
-        invocation.triggerFinishedEvent();
+        invocation.triggerFinishedEvent(ar.isSuccessed());
         asyncResp.handle(ar);
       });
-
     } catch (Throwable e) {
-      invocation.triggerFinishedEvent();
+      invocation.triggerFinishedEvent(false);
       LOGGER.error("invoke failed, {}", invocation.getOperationMeta().getMicroserviceQualifiedName());
       asyncResp.consumerFail(e);
     }
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
new file mode 100644
index 0000000..7091724
--- /dev/null
+++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/utils/MonitorUtils.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.servicecomb.metrics.core.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import com.netflix.servo.monitor.Monitor;
+import com.netflix.servo.tag.Tag;
+import com.netflix.servo.tag.TagList;
+
+public class MonitorUtils {
+
+  //for time-related monitor type, if stop poll value over one window time,
+  //the value may return -1 or NaN because servo can't known precise value of previous step
+  //so must change to return 0
+  public static double adjustValue(double value) {
+    return Double.isNaN(value) || value < 0 ? 0 : value;
+  }
+
+  //for time-related monitor type, if stop poll value over one window time,
+  //the value may return -1 because servo can't known precise value of previous step
+  //so must change to return 0
+  public static long adjustValue(long value) {
+    return value < 0 ? 0 : value;
+  }
+
+  public static boolean containsTagValue(Monitor monitor, String tagKey, String tagValue) {
+    TagList tags = monitor.getConfig().getTags();
+    return tags.containsKey(tagKey) && tagValue.equals(tags.getTag(tagKey).getValue());
+  }
+
+  public static Map<String, String> convertTags(Monitor monitor) {
+    TagList tags = monitor.getConfig().getTags();
+    if (tags.size() != 0) {
+      Map<String, String> tagMap = new HashMap<>();
+      for (Tag tag : tags) {
+        tagMap.put(tag.getKey(), tag.getValue());
+      }
+      return tagMap;
+    }
+    return null;
+  }
+
+  //Counting use System.nano get more precise time
+  //so we need change unit to millisecond when ouput
+  public static long convertNanosecondToMillisecond(long nanoValue) {
+    return TimeUnit.NANOSECONDS.toMillis(nanoValue);
+  }
+}
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
index ff356f9..9e2d687 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationFinishedEventListener.java
@@ -15,15 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.metrics.core.event;
+package io.servicecomb.metrics.core.event;
 
-import org.apache.servicecomb.core.metrics.InvocationFinishedEvent;
-import org.apache.servicecomb.foundation.common.event.Event;
-import org.apache.servicecomb.foundation.common.event.EventListener;
-import org.apache.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
-import org.apache.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
-import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor;
-import org.apache.servicecomb.swagger.invocation.InvocationType;
+import io.servicecomb.core.metrics.InvocationFinishedEvent;
+import io.servicecomb.foundation.common.event.Event;
+import io.servicecomb.foundation.common.event.EventListener;
+import io.servicecomb.metrics.core.MetricsDimension;
+import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
+import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
+import io.servicecomb.metrics.core.monitor.RegistryMonitor;
+import io.servicecomb.swagger.invocation.InvocationType;
 
 public class InvocationFinishedEventListener implements EventListener {
 
@@ -45,9 +46,13 @@ public class InvocationFinishedEventListener implements EventListener {
       ProducerInvocationMonitor monitor = registryMonitor.getProducerInvocationMonitor(event.getOperationName());
       monitor.getExecutionTime().update(event.getProcessElapsedNanoTime());
       monitor.getProducerLatency().update(event.getTotalElapsedNanoTime());
+      monitor.getProducerCall().increment(MetricsDimension.DIMENSION_STATUS,
+          event.isSuccess() ? MetricsDimension.DIMENSION_STATUS_SUCCESS : MetricsDimension.DIMENSION_STATUS_FAILED);
     } else {
       ConsumerInvocationMonitor monitor = registryMonitor.getConsumerInvocationMonitor(event.getOperationName());
       monitor.getConsumerLatency().update(event.getTotalElapsedNanoTime());
+      monitor.getConsumerCall().increment(MetricsDimension.DIMENSION_STATUS,
+          event.isSuccess() ? MetricsDimension.DIMENSION_STATUS_SUCCESS : MetricsDimension.DIMENSION_STATUS_FAILED);
     }
   }
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java
index 166f5ce..f7516bb 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/event/InvocationStartedEventListener.java
@@ -15,15 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.metrics.core.event;
+package io.servicecomb.metrics.core.event;
 
-import org.apache.servicecomb.core.metrics.InvocationStartedEvent;
-import org.apache.servicecomb.foundation.common.event.Event;
-import org.apache.servicecomb.foundation.common.event.EventListener;
-import org.apache.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
-import org.apache.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
-import org.apache.servicecomb.metrics.core.monitor.RegistryMonitor;
-import org.apache.servicecomb.swagger.invocation.InvocationType;
+import io.servicecomb.core.metrics.InvocationStartedEvent;
+import io.servicecomb.foundation.common.event.Event;
+import io.servicecomb.foundation.common.event.EventListener;
+import io.servicecomb.metrics.core.MetricsDimension;
+import io.servicecomb.metrics.core.monitor.ConsumerInvocationMonitor;
+import io.servicecomb.metrics.core.monitor.ProducerInvocationMonitor;
+import io.servicecomb.metrics.core.monitor.RegistryMonitor;
+import io.servicecomb.swagger.invocation.InvocationType;
 
 public class InvocationStartedEventListener implements EventListener {
 
@@ -44,10 +45,10 @@ public class InvocationStartedEventListener implements EventListener {
     if (InvocationType.PRODUCER.equals(event.getInvocationType())) {
       ProducerInvocationMonitor monitor = registryMonitor.getProducerInvocationMonitor(event.getOperationName());
       monitor.getWaitInQueue().increment();
-      monitor.getProducerCall().increment();
+      monitor.getProducerCall().increment(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL);
     } else {
       ConsumerInvocationMonitor monitor = registryMonitor.getConsumerInvocationMonitor(event.getOperationName());
-      monitor.getConsumerCall().increment();
+      monitor.getConsumerCall().increment(MetricsDimension.DIMENSION_STATUS, MetricsDimension.DIMENSION_STATUS_ALL);
     }
   }
 }
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 7174e33..fb47b9b 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
@@ -20,20 +20,17 @@ package org.apache.servicecomb.metrics.core.monitor;
 import org.apache.servicecomb.metrics.common.CallMetric;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import com.netflix.servo.monitor.BasicCounter;
 import com.netflix.servo.monitor.MonitorConfig;
 import com.netflix.servo.monitor.StepCounter;
-import com.netflix.servo.tag.Tag;
-import com.netflix.servo.tag.TagList;
 
 import io.servicecomb.metrics.common.CallMetric;
 import io.servicecomb.metrics.common.DoubleMetricValue;
 import io.servicecomb.metrics.common.LongMetricValue;
 import io.servicecomb.metrics.core.MetricsDimension;
+import io.servicecomb.metrics.core.utils.MonitorUtils;
 
 public class CallMonitor {
   private final String prefix;
@@ -68,33 +65,31 @@ public class CallMonitor {
     }
   }
 
+  public void increment(String dimensionKey, String dimensionValue) {
+    for (int i = 0; i < totalCounters.size(); i++) {
+      BasicCounter totalCounter = totalCounters.get(i);
+      if (MonitorUtils.containsTagValue(totalCounter, dimensionKey, dimensionValue)) {
+        totalCounter.increment();
+      }
+      StepCounter tpsCounter = tpsCounters.get(i);
+      if (MonitorUtils.containsTagValue(tpsCounter, dimensionKey, dimensionValue)) {
+        tpsCounter.increment();
+      }
+    }
+  }
+
   public CallMetric toMetric(int windowTimeIndex) {
     List<LongMetricValue> totalValues = new ArrayList<>();
     List<DoubleMetricValue> tpsValues = new ArrayList<>();
     for (int i = 0; i < totalCounters.size(); i++) {
-      totalValues.add(new LongMetricValue(totalCounters.get(i).getValue(windowTimeIndex).longValue(),
-          convertTags(totalCounters.get(i).getConfig().getTags())));
-      tpsValues.add(new DoubleMetricValue(adjustValue(tpsCounters.get(i).getValue(windowTimeIndex).doubleValue()),
-          convertTags(tpsCounters.get(i).getConfig().getTags())));
+      BasicCounter totalCounter = totalCounters.get(i);
+      totalValues.add(new LongMetricValue(totalCounter.getValue(windowTimeIndex).longValue(),
+          MonitorUtils.convertTags(totalCounter)));
+      StepCounter tpsCounter = tpsCounters.get(i);
+      tpsValues.add(
+          new DoubleMetricValue(MonitorUtils.adjustValue(tpsCounter.getValue(windowTimeIndex).doubleValue()),
+              MonitorUtils.convertTags(tpsCounter)));
     }
     return new CallMetric(this.prefix, totalValues, tpsValues);
   }
-
-  //for time-related monitor type, if stop poll value over one window time,
-  //the value may return -1 because servo can't known precise value of previous step
-  //so must change to return 0
-  private double adjustValue(double value) {
-    return value < 0 ? 0 : value;
-  }
-
-  private Map<String, String> convertTags(TagList tags) {
-    if (tags.size() != 0) {
-      Map<String, String> tagMap = new HashMap<>();
-      for (Tag tag : tags) {
-        tagMap.put(tag.getKey(), tag.getValue());
-      }
-      return tagMap;
-    }
-    return null;
-  }
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java
index 12caaaa..3541d82 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java
@@ -98,8 +98,12 @@ public class DefaultSystemMonitor implements SystemMonitor {
 
   @Override
   public SystemMetric toMetric() {
-    return new SystemMetric(getCpuLoad(),
+    return new SystemMetric(adjustValue(getCpuLoad()),
         getCpuRunningThreads(), getHeapInit(), getHeapMax(), getHeapCommit(), getHeapUsed(),
         getNonHeapInit(), getNonHeapMax(), getNonHeapCommit(), getNonHeapUsed());
   }
+
+  private double adjustValue(double value) {
+    return value < 0 ? Double.NaN : value;
+  }
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java
index 7d4fffe..33ba8ab 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/TimerMonitor.java
@@ -15,17 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.metrics.core.monitor;
-
-import java.util.concurrent.TimeUnit;
-
-import org.apache.servicecomb.metrics.common.TimerMetric;
+package io.servicecomb.metrics.core.monitor;
 
 import com.netflix.servo.monitor.MaxGauge;
 import com.netflix.servo.monitor.MinGauge;
 import com.netflix.servo.monitor.MonitorConfig;
 import com.netflix.servo.monitor.StepCounter;
 
+import io.servicecomb.metrics.common.TimerMetric;
+import io.servicecomb.metrics.core.utils.MonitorUtils;
+
 public class TimerMonitor {
   private final String prefix;
 
@@ -59,22 +58,9 @@ public class TimerMonitor {
 
   public TimerMetric toMetric(int windowTimeIndex) {
     return new TimerMetric(this.prefix,
-        this.convertNanosecondToMillisecond(this.adjustValue(total.getCount(windowTimeIndex))),
-        this.adjustValue(count.getCount(windowTimeIndex)),
-        this.convertNanosecondToMillisecond(this.adjustValue(min.getValue(windowTimeIndex))),
-        this.convertNanosecondToMillisecond(this.adjustValue(max.getValue(windowTimeIndex))));
-  }
-
-  //for time-related monitor type, if stop poll value over one window time,
-  //the value may return -1 because servo can't known precise value of previous step
-  //so must change to return 0
-  public long adjustValue(long value) {
-    return value < 0 ? 0 : value;
-  }
-
-  //Counting use System.nano get more precise time
-  //so we need change unit to millisecond when ouput
-  public long convertNanosecondToMillisecond(long nanoValue) {
-    return TimeUnit.NANOSECONDS.toMillis(nanoValue);
+        MonitorUtils.convertNanosecondToMillisecond(MonitorUtils.adjustValue(total.getCount(windowTimeIndex))),
+        MonitorUtils.adjustValue(count.getCount(windowTimeIndex)),
+        MonitorUtils.convertNanosecondToMillisecond(MonitorUtils.adjustValue(min.getValue(windowTimeIndex))),
+        MonitorUtils.convertNanosecondToMillisecond(MonitorUtils.adjustValue(max.getValue(windowTimeIndex))));
   }
 }
diff --git a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java
index 4cebd32..ba8c126 100644
--- a/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java
+++ b/transports/transport-highway/src/main/java/org/apache/servicecomb/transport/highway/HighwayServerInvoke.java
@@ -134,7 +134,7 @@ public class HighwayServerInvoke {
     invocation.next(response -> {
       sendResponse(invocation.getContext(), response);
       endMetrics(invocation);
-      invocation.triggerFinishedEvent();
+      invocation.triggerFinishedEvent(response.isSuccessed());
     });
   }
 

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

[incubator-servicecomb-java-chassis] 05/10: SCB-150 minor refactor for prometheus

Posted by ni...@apache.org.
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 14521ec50bf5a10541a3967bff3a13cd4a08ef68
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Fri Jan 12 15:23:14 2018 +0800

    SCB-150 minor refactor for prometheus
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../metrics/core/monitor/DefaultSystemMonitor.java     |  9 ++-------
 .../metrics/prometheus/MetricsCollector.java           | 18 ++++++++++++------
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java
index 3541d82..5977521 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/DefaultSystemMonitor.java
@@ -98,12 +98,7 @@ public class DefaultSystemMonitor implements SystemMonitor {
 
   @Override
   public SystemMetric toMetric() {
-    return new SystemMetric(adjustValue(getCpuLoad()),
-        getCpuRunningThreads(), getHeapInit(), getHeapMax(), getHeapCommit(), getHeapUsed(),
-        getNonHeapInit(), getNonHeapMax(), getNonHeapCommit(), getNonHeapUsed());
-  }
-
-  private double adjustValue(double value) {
-    return value < 0 ? Double.NaN : value;
+    return new SystemMetric(getCpuLoad(), getCpuRunningThreads(), getHeapInit(), getHeapMax(), getHeapCommit(),
+        getHeapUsed(), getNonHeapInit(), getNonHeapMax(), getNonHeapCommit(), getNonHeapUsed());
   }
 }
diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
index bad097b..b22d8ea 100644
--- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
+++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/MetricsCollector.java
@@ -97,26 +97,27 @@ public class MetricsCollector extends Collector implements Collector.Describable
     samples.addAll(convertMetricValues(metric.getExecutionTime().toMap()));
     samples.addAll(convertMetricValues(metric.getLifeTimeInQueue().toMap()));
     samples.addAll(convertMetricValues(metric.getProducerLatency().toMap()));
-    samples.add(new Sample(metric.getPrefix() + ".waitInQueue.count", new ArrayList<>(), new ArrayList<>(),
-        (double) metric.getWaitInQueue()));
+    samples.add(
+        new Sample(formatMetricName(metric.getPrefix() + ".waitInQueue.count"), new ArrayList<>(), new ArrayList<>(),
+            (double) metric.getWaitInQueue()));
     return samples;
   }
 
   private List<Sample> convertMetricValues(Map<String, Number> metrics) {
     return metrics.entrySet().stream().map((entry) ->
-        new Sample(entry.getKey().replace(".", "_"),
-            new ArrayList<>(), new ArrayList<>(), entry.getValue().doubleValue())).collect(Collectors.toList());
+        new Sample(formatMetricName(entry.getKey()), new ArrayList<>(), new ArrayList<>(),
+            entry.getValue().doubleValue())).collect(Collectors.toList());
   }
 
   private List<Sample> convertCallMetric(CallMetric metric) {
     List<Sample> samples = new ArrayList<>();
-    String totalName = (metric.getPrefix() + ".total").replace(".", "_");
+    String totalName = formatMetricName(metric.getPrefix() + ".total");
     for (LongMetricValue value : metric.getTotalValue()) {
       samples.add(new Sample(totalName,
           new ArrayList<>(value.getDimensions().keySet()), new ArrayList<>(value.getDimensions().values()),
           (double) value.getValue()));
     }
-    String tpsName = (metric.getPrefix() + ".tps").replace(".", "_");
+    String tpsName = formatMetricName(metric.getPrefix() + ".tps");
     for (DoubleMetricValue value : metric.getTpsValues()) {
       samples.add(new Sample(tpsName,
           new ArrayList<>(value.getDimensions().keySet()), new ArrayList<>(value.getDimensions().values()),
@@ -124,4 +125,9 @@ public class MetricsCollector extends Collector implements Collector.Describable
     }
     return samples;
   }
+
+  //convert name for match prometheus
+  private String formatMetricName(String name) {
+    return name.replace(".", "_");
+  }
 }

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