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 2017/12/27 01:26:15 UTC
[incubator-servicecomb-java-chassis] 01/12: JAV-539 & SC-9
Implement CallCount and TPS Metrics
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 <ya...@huawei.com>
AuthorDate: Wed Dec 20 10:33:37 2017 +0800
JAV-539 & SC-9 Implement CallCount and TPS Metrics
Signed-off-by: zhengyangyong <ya...@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" <co...@servicecomb.apache.org>.