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 bc882a5d7b1e5cb418346360a8bc0e9b39152add Author: zhengyangyong <yangyong.zh...@huawei.com> AuthorDate: Wed Dec 20 10:33:37 2017 +0800 JAV-539 & SC-9 Implement CallCount and TPS Metrics Signed-off-by: zhengyangyong <yangyong.zh...@huawei.com> --- .../InvocationStartProcessingEventListener.java | 4 ++ .../core/event/InvocationStartedEventListener.java | 1 + .../metrics/core/metric/CallMetric.java | 44 ++++++++++++++++++ .../metrics/core/metric/InvocationMetric.java | 4 +- .../metrics/core/metric/ModelMetric.java | 16 ++++++- .../metrics/core/metric/RegistryMetric.java | 19 ++++---- .../metrics/core/metric/TimerMetric.java | 2 +- .../metrics/core/monitor/CallMonitor.java | 43 ++++++++++++++++++ .../metrics/core/monitor/InvocationMonitor.java | 29 +++++++++--- .../metrics/core/TestEventAndRunner.java | 53 ++++++---------------- .../src/main/resources/microservice.yaml | 2 +- 11 files changed, 157 insertions(+), 60 deletions(-) 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 1680ec3..1aabd22 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 @@ -41,9 +41,13 @@ public class InvocationStartProcessingEventListener implements EventListener { public void process(Event data) { InvocationStartProcessingEvent event = (InvocationStartProcessingEvent) data; 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); if (InvocationType.PRODUCER.equals(event.getInvocationType())) { monitor.getLifeTimeInQueue().update(event.getInQueueNanoTime()); + monitor.getProducerCall().increment(); + } else { + monitor.getConsumerCall().increment(); } } } diff --git a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/event/InvocationStartedEventListener.java b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/event/InvocationStartedEventListener.java index c9b7763..ffb97b1 100644 --- a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/event/InvocationStartedEventListener.java +++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/event/InvocationStartedEventListener.java @@ -38,6 +38,7 @@ public class InvocationStartedEventListener implements EventListener { @Override public void process(Event data) { InvocationStartedEvent event = (InvocationStartedEvent) data; + //TODO:current java chassis unable know invocation type before starting process,so all type WaitInQueue increment registryMonitor.getInvocationMonitor(event.getOperationName()).getWaitInQueue().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 new file mode 100644 index 0000000..210f7fb --- /dev/null +++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/CallMetric.java @@ -0,0 +1,44 @@ +/* + * Copyright 2017 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.servicecomb.metrics.core.metric; + +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); + } +} 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 d62ddc3..e1b5e3e 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 @@ -26,8 +26,8 @@ public class InvocationMetric extends ModelMetric { public InvocationMetric(String operationName, long waitInQueue, TimerMetric lifeTimeInQueue, TimerMetric executionTime, TimerMetric consumerLatency, - TimerMetric producerLatency) { - super(waitInQueue, lifeTimeInQueue, executionTime, consumerLatency, producerLatency); + TimerMetric producerLatency, CallMetric consumerCall, CallMetric producerCall) { + super(waitInQueue, lifeTimeInQueue, executionTime, consumerLatency, producerLatency, consumerCall, producerCall); this.operationName = operationName; } } 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/ModelMetric.java index 05436c9..7273171 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/ModelMetric.java @@ -28,6 +28,10 @@ public abstract class ModelMetric { private final TimerMetric producerLatency; + private final CallMetric consumerCall; + + private final CallMetric producerCall; + public long getWaitInQueue() { return waitInQueue; } @@ -48,13 +52,23 @@ public abstract class ModelMetric { return producerLatency; } + public CallMetric getConsumerCall() { + return consumerCall; + } + + public CallMetric getProducerCall() { + return producerCall; + } + public ModelMetric(long waitInQueue, TimerMetric lifeTimeInQueue, TimerMetric executionTime, TimerMetric consumerLatency, - TimerMetric producerLatency) { + TimerMetric producerLatency, CallMetric consumerCall, CallMetric producerCall) { this.waitInQueue = waitInQueue; this.lifeTimeInQueue = lifeTimeInQueue; this.executionTime = executionTime; this.consumerLatency = consumerLatency; this.producerLatency = producerLatency; + this.consumerCall = consumerCall; + this.producerCall = producerCall; } } 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 7569420..bf7b5e8 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 @@ -19,7 +19,6 @@ package io.servicecomb.metrics.core.metric; import java.util.Map; -import io.servicecomb.metrics.core.extra.SystemResource; import io.servicecomb.metrics.core.monitor.RegistryMonitor; public class RegistryMetric { @@ -36,7 +35,7 @@ public class RegistryMetric { return invocationMetrics; } - public RegistryMetric(SystemResource systemResource, RegistryMonitor registryMonitor, int pollerIndex) { + public RegistryMetric(RegistryMonitor registryMonitor, int pollerIndex) { invocationMetrics = registryMonitor.toInvocationMetrics(pollerIndex); //sum instance level metric @@ -45,21 +44,21 @@ public class RegistryMetric { TimerMetric executionTime = new TimerMetric(); TimerMetric consumerLatency = new TimerMetric(); TimerMetric producerLatency = new TimerMetric(); + + CallMetric consumerCall = new CallMetric(); + CallMetric producerCall = new CallMetric(); + 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()); } - SystemMetric systemMetric = new SystemMetric(systemResource.getCpuLoad(), systemResource.getCpuRunningThreads(), - systemResource.getHeapInit(), systemResource.getHeapMax(), systemResource.getHeapCommit(), - systemResource.getHeapUsed(), - systemResource.getNonHeapInit(), systemResource.getNonHeapMax(), systemResource.getNonHeapCommit(), - systemResource.getNonHeapUsed()); - - instanceMetric = new InstanceMetric(waitInQueue, systemMetric, lifeTimeInQueue, executionTime, consumerLatency, - producerLatency); + instanceMetric = new InstanceMetric(waitInQueue, lifeTimeInQueue, executionTime, consumerLatency, producerLatency, + consumerCall, producerCall); } } 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 8bd7297..40f82ff 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 @@ -74,6 +74,6 @@ public class TimerMetric { } private long getMax(long value1, long value2) { - return value1 == 0 || value2 > value1 ? value2 : value1; + return value2 > value1 ? value2 : value1; } } 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 new file mode 100644 index 0000000..9e89122 --- /dev/null +++ b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/monitor/CallMonitor.java @@ -0,0 +1,43 @@ +/* + * Copyright 2017 Huawei Technologies Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.servicecomb.metrics.core.monitor; + +import com.netflix.servo.monitor.BasicCounter; +import com.netflix.servo.monitor.MonitorConfig; +import com.netflix.servo.monitor.StepCounter; + +import io.servicecomb.metrics.core.metric.CallMetric; + +public class CallMonitor { + 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 void increment() { + total.increment(); + tps.increment(); + } + + public CallMetric toCallMetric(int pollerIndex) { + return new CallMetric(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 35a6ca8..d3588f5 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 @@ -35,6 +35,10 @@ public class InvocationMonitor { private final TimerMonitor producerLatency; + private final CallMonitor consumerCall; + + private final CallMonitor producerCall; + public String getOperationName() { return operationName; } @@ -59,13 +63,24 @@ public class InvocationMonitor { return producerLatency; } + public CallMonitor getConsumerCall() { + return consumerCall; + } + + public CallMonitor getProducerCall() { + return producerCall; + } + public InvocationMonitor(String operationName) { this.operationName = operationName; - this.waitInQueue = new BasicCounter(MonitorConfig.builder("waitInQueue").build()); - this.lifeTimeInQueue = new TimerMonitor("lifeTimeInQueue"); - this.executionTime = new TimerMonitor("executionTime"); - this.consumerLatency = new TimerMonitor("consumerLatency"); - this.producerLatency = new TimerMonitor("producerLatency"); + 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"); } public InvocationMetric toInvocationMetric(int pollerIndex) { @@ -73,6 +88,8 @@ public class InvocationMonitor { this.lifeTimeInQueue.toTimerMetric(pollerIndex), this.executionTime.toTimerMetric(pollerIndex), this.consumerLatency.toTimerMetric(pollerIndex), - this.producerLatency.toTimerMetric(pollerIndex)); + this.producerLatency.toTimerMetric(pollerIndex), + this.consumerCall.toCallMetric(pollerIndex), + this.producerCall.toCallMetric(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 f98f04f..da7f02e 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,24 +17,16 @@ package io.servicecomb.metrics.core; -import static org.mockito.Mockito.when; - -import java.lang.management.MemoryMXBean; -import java.lang.management.MemoryUsage; -import java.lang.management.OperatingSystemMXBean; -import java.lang.management.ThreadMXBean; import java.util.concurrent.TimeUnit; import org.junit.Assert; import org.junit.Test; -import org.mockito.Mockito; import io.servicecomb.core.metrics.InvocationFinishedEvent; import io.servicecomb.core.metrics.InvocationStartProcessingEvent; import io.servicecomb.core.metrics.InvocationStartedEvent; import io.servicecomb.foundation.common.utils.EventUtils; import io.servicecomb.metrics.core.event.DefaultEventListenerManager; -import io.servicecomb.metrics.core.extra.DefaultSystemResource; import io.servicecomb.metrics.core.metric.RegistryMetric; import io.servicecomb.metrics.core.monitor.RegistryMonitor; import io.servicecomb.metrics.core.publish.DefaultDataSource; @@ -44,27 +36,8 @@ public class TestEventAndRunner { @Test public void test() throws InterruptedException { - OperatingSystemMXBean systemMXBean = Mockito.mock(OperatingSystemMXBean.class); - when(systemMXBean.getSystemLoadAverage()).thenReturn(1.0); - ThreadMXBean threadMXBean = Mockito.mock(ThreadMXBean.class); - when(threadMXBean.getThreadCount()).thenReturn(2); - MemoryMXBean memoryMXBean = Mockito.mock(MemoryMXBean.class); - MemoryUsage heap = Mockito.mock(MemoryUsage.class); - when(memoryMXBean.getHeapMemoryUsage()).thenReturn(heap); - when(heap.getCommitted()).thenReturn(100L); - when(heap.getInit()).thenReturn(200L); - when(heap.getMax()).thenReturn(300L); - when(heap.getUsed()).thenReturn(400L); - MemoryUsage nonHeap = Mockito.mock(MemoryUsage.class); - when(memoryMXBean.getNonHeapMemoryUsage()).thenReturn(nonHeap); - when(nonHeap.getCommitted()).thenReturn(500L); - when(nonHeap.getInit()).thenReturn(600L); - when(nonHeap.getMax()).thenReturn(700L); - when(nonHeap.getUsed()).thenReturn(800L); - RegistryMonitor monitor = new RegistryMonitor(); - DefaultSystemResource systemResource = new DefaultSystemResource(systemMXBean, threadMXBean, memoryMXBean); - DefaultDataSource dataSource = new DefaultDataSource(systemResource, monitor, "2000"); + DefaultDataSource dataSource = new DefaultDataSource(monitor, "2000"); DefaultEventListenerManager manager = new DefaultEventListenerManager(monitor); @@ -163,15 +136,17 @@ public class TestEventAndRunner { Assert .assertEquals(model.getInstanceMetric().getConsumerLatency().getAverage(), TimeUnit.MILLISECONDS.toNanos(0), 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getCpuLoad(), 1.0, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getCpuRunningThreads(), 2, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapCommit(), 100, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapInit(), 200, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapMax(), 300, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getHeapUsed(), 400, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapCommit(), 500, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapInit(), 600, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapMax(), 700, 0); - Assert.assertEquals(model.getInstanceMetric().getSystemMetric().getNonHeapUsed(), 800, 0); + Assert.assertEquals(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); } -} \ No newline at end of file +} 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 0e12fde..5191703 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 @@ -31,5 +31,5 @@ servicecomb: metrics: #polling setting polling: - #Time Unit is MILLISECONDS + #Support Muti Polling Time (MILLISECONDS) like 10000,60000 (10s and 60s) 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>.