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 06:16:48 UTC

[incubator-servicecomb-java-chassis] 02/05: SCB-12 fix and add comment

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 d71f56473cbcd2ca29c7fa9068ed402e7126d488
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Tue Jan 16 17:53:11 2018 +0800

    SCB-12 fix and add comment
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../servicecomb/metrics/common/RegistryMetric.java |  8 ++++----
 .../metrics/core/custom/CounterService.java        |  3 +++
 .../metrics/core/custom/DefaultCounterService.java |  6 +++---
 .../metrics/core/custom/DefaultGaugeService.java   |  6 +++---
 .../core/custom/DefaultWindowCounterService.java   |  4 ++--
 .../metrics/core/custom/GaugeService.java          |  5 ++++-
 .../metrics/core/custom/WindowCounter.java         | 14 ++++----------
 .../metrics/core/custom/WindowCounterService.java  | 19 +++++++++++++++++++
 .../metrics/core/monitor/RegistryMonitor.java      |  2 +-
 .../metrics/core/TestCustomMetrics.java            | 22 ++++++++++++----------
 .../metrics/prometheus/MetricsCollector.java       |  7 +++++++
 .../samples/metrics/custom/ShopDemoService.java    | 18 +++++++++++++++---
 12 files changed, 77 insertions(+), 37 deletions(-)

diff --git a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/RegistryMetric.java b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/RegistryMetric.java
index d838628..c03ad8f 100644
--- a/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/RegistryMetric.java
+++ b/metrics/metrics-common/src/main/java/org/apache/servicecomb/metrics/common/RegistryMetric.java
@@ -29,7 +29,7 @@ public class RegistryMetric {
 
   private final Map<String, ProducerInvocationMetric> producerMetrics;
 
-  private final Map<String, Number> customMetrics;
+  private final Map<String, Double> customMetrics;
 
   public InstanceMetric getInstanceMetric() {
     return instanceMetric;
@@ -43,14 +43,14 @@ public class RegistryMetric {
     return producerMetrics;
   }
 
-  public Map<String, Number> getCustomMetrics() {
+  public Map<String, Double> getCustomMetrics() {
     return customMetrics;
   }
 
   public RegistryMetric(@JsonProperty("instanceMetric") InstanceMetric instanceMetric,
       @JsonProperty("consumerMetrics") Map<String, ConsumerInvocationMetric> consumerMetrics,
       @JsonProperty("producerMetrics") Map<String, ProducerInvocationMetric> producerMetrics,
-      @JsonProperty("customMetrics") Map<String, Number> customMetrics) {
+      @JsonProperty("customMetrics") Map<String, Double> customMetrics) {
     this.consumerMetrics = consumerMetrics;
     this.producerMetrics = producerMetrics;
     this.instanceMetric = instanceMetric;
@@ -60,7 +60,7 @@ public class RegistryMetric {
   public RegistryMetric(SystemMetric systemMetric,
       Map<String, ConsumerInvocationMetric> consumerMetrics,
       Map<String, ProducerInvocationMetric> producerMetrics,
-      Map<String, Number> customMetrics) {
+      Map<String, Double> customMetrics) {
     this.consumerMetrics = consumerMetrics;
     this.producerMetrics = producerMetrics;
     this.customMetrics = customMetrics;
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/CounterService.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/CounterService.java
index 2dc8aa1..a67993f 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/CounterService.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/CounterService.java
@@ -17,6 +17,9 @@
 
 package org.apache.servicecomb.metrics.core.custom;
 
+/**
+ CounterService is simple service for manage basic counter,Window Time-unrelated,always get latest value
+ */
 public interface CounterService {
   void increment(String name);
 
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultCounterService.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultCounterService.java
index f9b9210..a41319c 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultCounterService.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultCounterService.java
@@ -61,10 +61,10 @@ public class DefaultCounterService implements CounterService {
     return counters.computeIfAbsent(name, n -> new BasicCounter(MonitorConfig.builder(n).build()));
   }
 
-  public Map<String, Number> toMetrics() {
-    Map<String, Number> metrics = new HashMap<>();
+  public Map<String, Double> toMetrics() {
+    Map<String, Double> metrics = new HashMap<>();
     for (Entry<String, BasicCounter> counter : counters.entrySet()) {
-      metrics.put(counter.getKey(), counter.getValue().getValue());
+      metrics.put(counter.getKey(), counter.getValue().getValue().doubleValue());
     }
     return metrics;
   }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultGaugeService.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultGaugeService.java
index edb9aff..4789ae5 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultGaugeService.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultGaugeService.java
@@ -26,18 +26,18 @@ import org.springframework.stereotype.Component;
 @Component
 public class DefaultGaugeService implements GaugeService {
 
-  private final Map<String, Number> gauges;
+  private final Map<String, Double> gauges;
 
   public DefaultGaugeService() {
     this.gauges = new ConcurrentHashMapEx<>();
   }
 
   @Override
-  public void update(String name, Number value) {
+  public void update(String name, double value) {
     this.gauges.put(name, value);
   }
 
-  public Map<String, Number> toMetrics() {
+  public Map<String, Double> toMetrics() {
     return new HashMap<>(gauges);
   }
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultWindowCounterService.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultWindowCounterService.java
index 227fd85..6f53ae6 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultWindowCounterService.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/DefaultWindowCounterService.java
@@ -39,8 +39,8 @@ public class DefaultWindowCounterService implements WindowCounterService {
     counter.update(value);
   }
 
-  public Map<String, Number> toMetrics(int windowTimeIndex) {
-    Map<String, Number> metrics = new HashMap<>();
+  public Map<String, Double> toMetrics(int windowTimeIndex) {
+    Map<String, Double> metrics = new HashMap<>();
     for (Entry<String, WindowCounter> counter : counters.entrySet()) {
       metrics.putAll(counter.getValue().toMetric(windowTimeIndex));
     }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/GaugeService.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/GaugeService.java
index 0b7c526..6aa8f89 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/GaugeService.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/GaugeService.java
@@ -17,6 +17,9 @@
 
 package org.apache.servicecomb.metrics.core.custom;
 
+/**
+ GaugeService is simple service for manage basic guage,Window Time-unrelated,always get latest value
+ */
 public interface GaugeService {
-  void update(String name, Number value);
+  void update(String name, double value);
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/WindowCounter.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/WindowCounter.java
index 7c7bd2b..9684f20 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/WindowCounter.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/WindowCounter.java
@@ -53,8 +53,8 @@ public class WindowCounter {
     }
   }
 
-  public Map<String, Number> toMetric(int windowTimeIndex) {
-    Map<String, Number> metrics = new HashMap<>();
+  public Map<String, Double> toMetric(int windowTimeIndex) {
+    Map<String, Double> metrics = new HashMap<>();
     metrics.put(name + ".total", this.adjustValue(total.getCount(windowTimeIndex)));
     metrics.put(name + ".count", this.adjustValue(count.getCount(windowTimeIndex)));
     metrics.put(name + ".max", this.adjustValue(max.getValue(windowTimeIndex)));
@@ -62,20 +62,14 @@ public class WindowCounter {
     double value = count.getCount(windowTimeIndex) == 0 ? 0 :
         (double) this.total.getCount(windowTimeIndex) / (double) this.count.getCount(windowTimeIndex);
     metrics.put(name + ".average", value);
-    metrics.put(name + ".tps", this.adjustValue(total.getValue(windowTimeIndex).doubleValue()));
+    metrics.put(name + ".rate", this.adjustValue(total.getValue(windowTimeIndex).doubleValue()));
+    metrics.put(name + ".tps", this.adjustValue(count.getValue(windowTimeIndex).doubleValue()));
     return metrics;
   }
 
   //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 long adjustValue(long value) {
-    return 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
   private double adjustValue(double value) {
     return value < 0 ? 0 : value;
   }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/WindowCounterService.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/WindowCounterService.java
index 4a15947..e510047 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/WindowCounterService.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/custom/WindowCounterService.java
@@ -17,6 +17,25 @@
 
 package org.apache.servicecomb.metrics.core.custom;
 
+/**
+ GaugeService is complex service for manage Window Time-related Step Counter,
+ It will output total,count,tps,rate,average,max and min
+ examples:
+ if record three time in one window,and window time = 2000 (2 seconds), like :
+ record("Order Amount",100)
+ record("Order Amount",200)
+ record("Order Amount",300)
+ record("Order Amount",400)
+
+ Output metrics include:
+ Order Amount.total = 1000
+ Order Amount.count = 4
+ Order Amount.tps = 2           count / time(second)
+ Order Amount.rate = 500        total / time(second
+ Order Amount.average = 250     total / count
+ Order Amount.max = 400
+ Order Amount.min = 100
+ */
 public interface WindowCounterService {
   void record(String name, long value);
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/RegistryMonitor.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/RegistryMonitor.java
index 7cdb1db..982e11b 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/RegistryMonitor.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/monitor/RegistryMonitor.java
@@ -75,7 +75,7 @@ public class RegistryMonitor {
       producerInvocationMetrics.put(monitor.getOperationName(), monitor.toMetric(windowTimeIndex));
     }
 
-    Map<String, Number> customMetrics = new HashMap<>(counterService.toMetrics());
+    Map<String, Double> customMetrics = new HashMap<>(counterService.toMetrics());
     customMetrics.putAll(gaugeService.toMetrics());
     customMetrics.putAll(windowCounterService.toMetrics(windowTimeIndex));
 
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestCustomMetrics.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestCustomMetrics.java
index c9ccc23..b0ac7e1 100644
--- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestCustomMetrics.java
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestCustomMetrics.java
@@ -39,7 +39,7 @@ public class TestCustomMetrics {
 
     RegistryMonitor registryMonitor = new RegistryMonitor(systemMonitor, counterService, gaugeService,
         windowCounterService);
-    DefaultDataSource dataSource = new DefaultDataSource(registryMonitor, "1000,2000,3000,3000,2000,1000");
+    DefaultDataSource dataSource = new DefaultDataSource(registryMonitor, "1000,2000,3000");
 
     counterService.increment("C1");
     counterService.increment("C1");
@@ -54,9 +54,10 @@ public class TestCustomMetrics {
     gaugeService.update("G1", 200);
     gaugeService.update("G2", 150);
 
-    windowCounterService.record("W1", 1);
-    windowCounterService.record("W1", 2);
-    windowCounterService.record("W1", 3);
+    windowCounterService.record("W1", 100);
+    windowCounterService.record("W1", 200);
+    windowCounterService.record("W1", 300);
+    windowCounterService.record("W1", 400);
 
     //sim lease one window time
     Thread.sleep(1000);
@@ -69,11 +70,12 @@ public class TestCustomMetrics {
     Assert.assertEquals(200, metric.getCustomMetrics().get("G1").intValue());
     Assert.assertEquals(150, metric.getCustomMetrics().get("G2").intValue());
 
-    Assert.assertEquals(6, metric.getCustomMetrics().get("W1.total").doubleValue(), 0);
-    Assert.assertEquals(3, metric.getCustomMetrics().get("W1.count").doubleValue(), 0);
-    Assert.assertEquals(6, metric.getCustomMetrics().get("W1.tps").doubleValue(), 0);
-    Assert.assertEquals(2, metric.getCustomMetrics().get("W1.average").doubleValue(), 0);
-    Assert.assertEquals(1, metric.getCustomMetrics().get("W1.min").doubleValue(), 0);
-    Assert.assertEquals(3, metric.getCustomMetrics().get("W1.max").doubleValue(), 0);
+    Assert.assertEquals(1000, metric.getCustomMetrics().get("W1.total"), 0);
+    Assert.assertEquals(4, metric.getCustomMetrics().get("W1.count"), 0);
+    Assert.assertEquals(4, metric.getCustomMetrics().get("W1.tps"), 0);
+    Assert.assertEquals(1000, metric.getCustomMetrics().get("W1.rate"), 0);
+    Assert.assertEquals(250, metric.getCustomMetrics().get("W1.average"), 0);
+    Assert.assertEquals(100, metric.getCustomMetrics().get("W1.min"), 0);
+    Assert.assertEquals(400, metric.getCustomMetrics().get("W1.max"), 0);
   }
 }
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 0b576fb..a640736 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
@@ -96,6 +96,13 @@ public class MetricsCollector extends Collector implements Collector.Describable
     return familySamples;
   }
 
+  private <T extends Number> MetricFamilySamples getFamilySamples(String name, Map<String, T> 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());
   }
diff --git a/samples/custom-business-metrics/src/main/java/org/apache/servicecomb/samples/metrics/custom/ShopDemoService.java b/samples/custom-business-metrics/src/main/java/org/apache/servicecomb/samples/metrics/custom/ShopDemoService.java
index f9f9986..1245339 100644
--- a/samples/custom-business-metrics/src/main/java/org/apache/servicecomb/samples/metrics/custom/ShopDemoService.java
+++ b/samples/custom-business-metrics/src/main/java/org/apache/servicecomb/samples/metrics/custom/ShopDemoService.java
@@ -17,6 +17,9 @@
 
 package org.apache.servicecomb.samples.metrics.custom;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
 import org.apache.servicecomb.metrics.core.custom.CounterService;
 import org.apache.servicecomb.metrics.core.custom.GaugeService;
 import org.apache.servicecomb.metrics.core.custom.WindowCounterService;
@@ -49,7 +52,7 @@ public class ShopDemoService {
     counterService.decrement("Active User");
   }
 
-  public void order(String orderInfo) throws InterruptedException {
+  public void order(double amount) throws InterruptedException {
     long start = System.currentTimeMillis();
     //sim  do order process
     Thread.sleep(100);
@@ -58,8 +61,9 @@ public class ShopDemoService {
     windowCounterService.record("Order Latency", System.currentTimeMillis() - start);
 
     windowCounterService.record("Order Count", 1);
-    //only support long
-    windowCounterService.record("Order Amount", 66);
+
+    //only support long,please do unit convert ,$99.00 -> $9900 , $59.99 -> 5999
+    windowCounterService.record("Order Amount", (long) round(amount * 100, 0));
   }
 
   public void discount(double value) {
@@ -67,4 +71,12 @@ public class ShopDemoService {
 
     gaugeService.update("Levis Jeans", value);
   }
+
+  private double round(double value, int places) {
+    if (!Double.isNaN(value)) {
+      BigDecimal decimal = new BigDecimal(value);
+      return decimal.setScale(places, RoundingMode.HALF_UP).doubleValue();
+    }
+    return 0;
+  }
 }

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