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 <[email protected]> AuthorDate: Tue Jan 16 17:53:11 2018 +0800 SCB-12 fix and add comment Signed-off-by: zhengyangyong <[email protected]> --- .../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 [email protected].
