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 e4b97156bc7043c4f8bf16fa2261319451b74a91
Author: zhengyangyong <[email protected]>
AuthorDate: Wed Dec 20 11:12:22 2017 +0800

    JAV-544 & SC-10 Implement Runtime System Resources Usage Metrics
    
    Signed-off-by: zhengyangyong <[email protected]>
---
 .../metrics/core/extra/DefaultSystemResource.java  | 96 ++++++++++++++++++++++
 .../metrics/core/extra/SystemResource.java         | 39 +++++++++
 .../metrics/core/metric/InstanceMetric.java        | 13 ++-
 .../metrics/core/metric/RegistryMetric.java        | 13 ++-
 .../metrics/core/metric/SystemMetric.java          | 94 +++++++++++++++++++++
 .../metrics/core/publish/DefaultDataSource.java    | 15 ++--
 .../metrics/core/TestEventAndRunner.java           | 47 ++++++++++-
 7 files changed, 304 insertions(+), 13 deletions(-)

diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/extra/DefaultSystemResource.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/extra/DefaultSystemResource.java
new file mode 100644
index 0000000..4934551
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/extra/DefaultSystemResource.java
@@ -0,0 +1,96 @@
+/*
+ * 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.extra;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+import java.lang.management.OperatingSystemMXBean;
+import java.lang.management.ThreadMXBean;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class DefaultSystemResource implements SystemResource {
+
+  private final OperatingSystemMXBean systemMXBean;
+
+  private final ThreadMXBean threadMXBean;
+
+  private final MemoryMXBean memoryMXBean;
+
+  public DefaultSystemResource() {
+    this(ManagementFactory.getOperatingSystemMXBean(), 
ManagementFactory.getThreadMXBean(),
+        ManagementFactory.getMemoryMXBean());
+  }
+
+  public DefaultSystemResource(OperatingSystemMXBean systemMXBean, 
ThreadMXBean threadMXBean,
+      MemoryMXBean memoryMXBean) {
+    this.systemMXBean = systemMXBean;
+    this.threadMXBean = threadMXBean;
+    this.memoryMXBean = memoryMXBean;
+  }
+
+  @Override
+  public double getCpuLoad() {
+    return systemMXBean.getSystemLoadAverage();
+  }
+
+  @Override
+  public int getCpuRunningThreads() {
+    return threadMXBean.getThreadCount();
+  }
+
+  @Override
+  public long getHeapInit() {
+    return memoryMXBean.getHeapMemoryUsage().getInit();
+  }
+
+  @Override
+  public long getHeapMax() {
+    return memoryMXBean.getHeapMemoryUsage().getMax();
+  }
+
+  @Override
+  public long getHeapCommit() {
+    return memoryMXBean.getHeapMemoryUsage().getCommitted();
+  }
+
+  @Override
+  public long getHeapUsed() {
+    return memoryMXBean.getHeapMemoryUsage().getUsed();
+  }
+
+  @Override
+  public long getNonHeapInit() {
+    return memoryMXBean.getNonHeapMemoryUsage().getInit();
+  }
+
+  @Override
+  public long getNonHeapMax() {
+    return memoryMXBean.getNonHeapMemoryUsage().getMax();
+  }
+
+  @Override
+  public long getNonHeapCommit() {
+    return memoryMXBean.getNonHeapMemoryUsage().getCommitted();
+  }
+
+  @Override
+  public long getNonHeapUsed() {
+    return memoryMXBean.getNonHeapMemoryUsage().getUsed();
+  }
+}
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/extra/SystemResource.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/extra/SystemResource.java
new file mode 100644
index 0000000..abe1fe6
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/extra/SystemResource.java
@@ -0,0 +1,39 @@
+/*
+ * 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.extra;
+
+public interface SystemResource {
+  double getCpuLoad();
+
+  int getCpuRunningThreads();
+
+  long getHeapInit();
+
+  long getHeapMax();
+
+  long getHeapCommit();
+
+  long getHeapUsed();
+
+  long getNonHeapInit();
+
+  long getNonHeapMax();
+
+  long getNonHeapCommit();
+
+  long getNonHeapUsed();
+}
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 1bb5b63..c3e8fa1 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
@@ -18,8 +18,17 @@
 package io.servicecomb.metrics.core.metric;
 
 public class InstanceMetric extends ModelMetric {
-  public InstanceMetric(long waitInQueue, TimerMetric lifeTimeInQueue,
-      TimerMetric executionTime, TimerMetric consumerLatency, TimerMetric 
producerLatency) {
+
+  private final SystemMetric systemMetric;
+
+  public SystemMetric getSystemMetric() {
+    return systemMetric;
+  }
+
+  public InstanceMetric(long waitInQueue, SystemMetric systemMetric,
+      TimerMetric lifeTimeInQueue, TimerMetric executionTime, TimerMetric 
consumerLatency,
+      TimerMetric producerLatency) {
     super(waitInQueue, lifeTimeInQueue, executionTime, consumerLatency, 
producerLatency);
+    this.systemMetric = systemMetric;
   }
 }
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 4008251..7569420 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,6 +19,7 @@ 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 {
@@ -35,7 +36,7 @@ public class RegistryMetric {
     return invocationMetrics;
   }
 
-  public RegistryMetric(RegistryMonitor registryMonitor, int pollerIndex) {
+  public RegistryMetric(SystemResource systemResource, RegistryMonitor 
registryMonitor, int pollerIndex) {
     invocationMetrics = registryMonitor.toInvocationMetrics(pollerIndex);
 
     //sum instance level metric
@@ -51,6 +52,14 @@ public class RegistryMetric {
       consumerLatency = consumerLatency.merge(metric.getConsumerLatency());
       producerLatency = producerLatency.merge(metric.getProducerLatency());
     }
-    instanceMetric = new InstanceMetric(waitInQueue, lifeTimeInQueue, 
executionTime, consumerLatency, producerLatency);
+
+    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);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/SystemMetric.java
 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/SystemMetric.java
new file mode 100644
index 0000000..b5faa04
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/io/servicecomb/metrics/core/metric/SystemMetric.java
@@ -0,0 +1,94 @@
+/*
+ * 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 SystemMetric {
+  private final double cpuLoad;
+
+  private final int cpuRunningThreads;
+
+  private final long heapInit;
+
+  private final long heapMax;
+
+  private final long heapCommit;
+
+  private final long heapUsed;
+
+  private final long nonHeapInit;
+
+  private final long nonHeapMax;
+
+  private final long nonHeapCommit;
+
+  private final long nonHeapUsed;
+
+  public double getCpuLoad() {
+    return cpuLoad;
+  }
+
+  public int getCpuRunningThreads() {
+    return cpuRunningThreads;
+  }
+
+  public long getHeapInit() {
+    return heapInit;
+  }
+
+  public long getHeapMax() {
+    return heapMax;
+  }
+
+  public long getHeapCommit() {
+    return heapCommit;
+  }
+
+  public long getHeapUsed() {
+    return heapUsed;
+  }
+
+  public long getNonHeapInit() {
+    return nonHeapInit;
+  }
+
+  public long getNonHeapMax() {
+    return nonHeapMax;
+  }
+
+  public long getNonHeapCommit() {
+    return nonHeapCommit;
+  }
+
+  public long getNonHeapUsed() {
+    return nonHeapUsed;
+  }
+
+  public SystemMetric(double cpuLoad, int cpuRunningThreads,
+      long heapInit, long heapMax, long heapCommit, long heapUsed,
+      long nonHeapInit, long nonHeapMax, long nonHeapCommit, long nonHeapUsed) 
{
+    this.cpuLoad = cpuLoad;
+    this.cpuRunningThreads = cpuRunningThreads;
+    this.heapInit = heapInit;
+    this.heapMax = heapMax;
+    this.heapCommit = heapCommit;
+    this.heapUsed = heapUsed;
+    this.nonHeapInit = nonHeapInit;
+    this.nonHeapMax = nonHeapMax;
+    this.nonHeapCommit = nonHeapCommit;
+    this.nonHeapUsed = nonHeapUsed;
+  }
+}
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 bd84e54..70ddb18 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,6 +31,7 @@ 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;
 
@@ -44,15 +45,19 @@ public class DefaultDataSource implements DataSource {
 
   private final RegistryMonitor registryMonitor;
 
+  private final SystemResource systemResource;
+
   private final Map<Integer, RegistryMetric> registryMetrics;
 
   @Autowired
-  public DefaultDataSource(RegistryMonitor registryMonitor) {
-    this(registryMonitor, 
DynamicPropertyFactory.getInstance().getStringProperty(METRICS_POLLING_TIME, 
"10000").get());
+  public DefaultDataSource(SystemResource systemResource, RegistryMonitor 
registryMonitor) {
+    this(systemResource, registryMonitor,
+        
DynamicPropertyFactory.getInstance().getStringProperty(METRICS_POLLING_TIME, 
"10000").get());
   }
 
-  public DefaultDataSource(RegistryMonitor registryMonitor, String 
pollingSettings) {
+  public DefaultDataSource(SystemResource systemResource, 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();
@@ -74,7 +79,7 @@ public class DefaultDataSource implements DataSource {
 
   @Override
   public RegistryMetric getRegistryMetric(int pollerIndex) {
-    return registryMetrics.getOrDefault(pollerIndex, new 
RegistryMetric(registryMonitor, pollerIndex));
+    return registryMetrics.getOrDefault(pollerIndex, new 
RegistryMetric(systemResource, registryMonitor, pollerIndex));
   }
 
   @Override
@@ -83,6 +88,6 @@ public class DefaultDataSource implements DataSource {
   }
 
   private void reloadRegistryMetric(Integer pollingIndex) {
-    registryMetrics.put(pollingIndex, new RegistryMetric(registryMonitor, 
pollingIndex));
+    registryMetrics.put(pollingIndex, new RegistryMetric(systemResource, 
registryMonitor, pollingIndex));
   }
 }
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 02aeb63..1b28b95 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,16 +17,24 @@
 
 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;
@@ -36,8 +44,27 @@ 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();
-    DefaultDataSource dataSource = new DefaultDataSource(monitor,"2000");
+    DefaultSystemResource systemResource = new 
DefaultSystemResource(systemMXBean, threadMXBean, memoryMXBean);
+    DefaultDataSource dataSource = new DefaultDataSource(systemResource, 
monitor, "2000");
 
     DefaultEventListenerManager manager = new 
DefaultEventListenerManager(monitor);
 
@@ -104,7 +131,6 @@ public class TestEventAndRunner {
     Assert
         
.assertEquals(model.getInstanceMetric().getExecutionTime().getAverage(), 
TimeUnit.MILLISECONDS.toNanos(400), 0);
 
-
     Assert
         
.assertEquals(model.getInvocationMetrics().get("fun1").getProducerLatency().getMin(),
             TimeUnit.MILLISECONDS.toNanos(300), 0);
@@ -116,9 +142,11 @@ public class TestEventAndRunner {
             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);
+        .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(),
@@ -134,5 +162,16 @@ public class TestEventAndRunner {
     
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.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);
   }
 }

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to