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.