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>.

Reply via email to