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