[ 
https://issues.apache.org/jira/browse/SCB-1044?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16709721#comment-16709721
 ] 

ASF GitHub Bot commented on SCB-1044:
-------------------------------------

liubao68 closed pull request #1012: [SCB-1044]add current process CPU rate  and 
net packets in the metrics
URL: https://github.com/apache/servicecomb-java-chassis/pull/1012
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git 
a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/net/NetUtils.java
 
b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/net/NetUtils.java
index c03061ab8..30f8e29db 100644
--- 
a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/net/NetUtils.java
+++ 
b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/net/NetUtils.java
@@ -238,10 +238,10 @@ public static boolean canTcpListen(InetAddress address, 
int port) {
   public static String humanReadableBytes(long bytes) {
     int unit = 1024;
     if (bytes < unit) {
-      return bytes + " B";
+      return bytes + "";
     }
     int exp = (int) (Math.log(bytes) / Math.log(unit));
     char pre = "KMGTPE".charAt(exp - 1);
-    return String.format("%.3f %cB", bytes / Math.pow(unit, exp), pre);
+    return String.format("%.3f%c", bytes / Math.pow(unit, exp), pre);
   }
 }
diff --git 
a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestNetUtils.java
 
b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestNetUtils.java
index 15c6a9ed5..15e157fc8 100644
--- 
a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestNetUtils.java
+++ 
b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/net/TestNetUtils.java
@@ -110,40 +110,39 @@ public void testCanTcpListenYes() throws IOException {
 
   @Test
   public void humanReadableBytes() throws IOException {
-    Assert.assertEquals("0 B", NetUtils.humanReadableBytes(0L));
-    Assert.assertEquals("1 B", NetUtils.humanReadableBytes(1L));
-    Assert.assertEquals("1023 B", NetUtils.humanReadableBytes(1023L));
-
-    Assert.assertEquals("1.000 KB", NetUtils.humanReadableBytes(1024L));
-    Assert.assertEquals("1.001 KB", NetUtils.humanReadableBytes(1025L));
-    Assert.assertEquals("1023.999 KB", NetUtils.humanReadableBytes(1024L * 
1024 - 1));
-
-    Assert.assertEquals("1.000 MB", NetUtils.humanReadableBytes(1024L * 1024));
-    Assert.assertEquals("1.000 MB", NetUtils.humanReadableBytes(1024L * 1024 + 
1));
-    Assert.assertEquals("1.001 MB", NetUtils.humanReadableBytes(1024L * 1024 + 
1024));
-    Assert.assertEquals("1023.999 MB", NetUtils.humanReadableBytes(1024L * 
1024 * 1024 - 1024));
-    Assert.assertEquals("1024.000 MB", NetUtils.humanReadableBytes(1024L * 
1024 * 1024 - 1));
-
-    Assert.assertEquals("1.000 GB", NetUtils.humanReadableBytes(1024L * 1024 * 
1024));
-    Assert.assertEquals("1.000 GB", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 + 1));
-    Assert.assertEquals("1.000 GB", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 + 1024));
-    Assert.assertEquals("1023.999 GB", NetUtils.humanReadableBytes(1024L * 
1024 * 1024 * 1024 - 1024 * 1024));
-    Assert.assertEquals("1024.000 GB", NetUtils.humanReadableBytes(1024L * 
1024 * 1024 * 1024 - 1024));
-    Assert.assertEquals("1.000 TB", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 * 1024));
-    Assert.assertEquals("1.001 TB", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 * 1024 + 1024 * 1024 * 1024));
-    Assert.assertEquals("1023.999 TB",
+    Assert.assertEquals("0", NetUtils.humanReadableBytes(0L));
+    Assert.assertEquals("1", NetUtils.humanReadableBytes(1L));
+    Assert.assertEquals("1023", NetUtils.humanReadableBytes(1023L));
+
+    Assert.assertEquals("1.000K", NetUtils.humanReadableBytes(1024L));
+    Assert.assertEquals("1.001K", NetUtils.humanReadableBytes(1025L));
+    Assert.assertEquals("1023.999K", NetUtils.humanReadableBytes(1024L * 1024 
- 1));
+
+    Assert.assertEquals("1.000M", NetUtils.humanReadableBytes(1024L * 1024));
+    Assert.assertEquals("1.000M", NetUtils.humanReadableBytes(1024L * 1024 + 
1));
+    Assert.assertEquals("1.001M", NetUtils.humanReadableBytes(1024L * 1024 + 
1024));
+    Assert.assertEquals("1023.999M", NetUtils.humanReadableBytes(1024L * 1024 
* 1024 - 1024));
+    Assert.assertEquals("1024.000M", NetUtils.humanReadableBytes(1024L * 1024 
* 1024 - 1));
+    Assert.assertEquals("1.000G", NetUtils.humanReadableBytes(1024L * 1024 * 
1024));
+    Assert.assertEquals("1.000G", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 + 1));
+    Assert.assertEquals("1.000G", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 + 1024));
+    Assert.assertEquals("1023.999G", NetUtils.humanReadableBytes(1024L * 1024 
* 1024 * 1024 - 1024 * 1024));
+    Assert.assertEquals("1024.000G", NetUtils.humanReadableBytes(1024L * 1024 
* 1024 * 1024 - 1024));
+    Assert.assertEquals("1.000T", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 * 1024));
+    Assert.assertEquals("1.001T", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 * 1024 + 1024 * 1024 * 1024));
+    Assert.assertEquals("1023.999T",
         NetUtils.humanReadableBytes(1024L * 1024 * 1024 * 1024 * 1024 - 1024L 
* 1024 * 1024));
 
-    Assert.assertEquals("1.000 PB", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 * 1024 * 1024));
-    Assert.assertEquals("1.001 PB",
+    Assert.assertEquals("1.000P", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 * 1024 * 1024));
+    Assert.assertEquals("1.001P",
         NetUtils.humanReadableBytes(1024L * 1024 * 1024 * 1024 * 1024 + 1024L 
* 1024 * 1024 * 1024));
-    Assert.assertEquals("1023.999 PB",
+    Assert.assertEquals("1023.999P",
         NetUtils.humanReadableBytes(1024L * 1024 * 1024 * 1024 * 1024 * 1024 - 
1024L * 1024 * 1024 * 1024));
 
-    Assert.assertEquals("1.000 EB", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 * 1024 * 1024 * 1024));
-    Assert.assertEquals("1.001 EB",
+    Assert.assertEquals("1.000E", NetUtils.humanReadableBytes(1024L * 1024 * 
1024 * 1024 * 1024 * 1024));
+    Assert.assertEquals("1.001E",
         NetUtils.humanReadableBytes(1024L * 1024 * 1024 * 1024 * 1024 * 1024 + 
1024L * 1024 * 1024 * 1024 * 1024));
-    Assert.assertEquals("8.000 EB", 
NetUtils.humanReadableBytes(Long.MAX_VALUE));
+    Assert.assertEquals("8.000E", NetUtils.humanReadableBytes(Long.MAX_VALUE));
   }
 
   @Test
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java
index 60f6cd25a..6edcf1b46 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java
@@ -16,92 +16,49 @@
  */
 package org.apache.servicecomb.metrics.core.meter.os;
 
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
 import java.util.List;
 
-import org.apache.commons.io.FileUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.servicecomb.metrics.core.meter.os.cpu.OsCpuUsage;
+import org.apache.servicecomb.metrics.core.meter.os.cpu.ProcessCpuUsage;
 
 import com.netflix.spectator.api.Id;
 import com.netflix.spectator.api.Measurement;
 
 public class CpuMeter {
-  private static final Logger LOGGER = LoggerFactory.getLogger(CpuMeter.class);
 
-  private double rate;
+  // read from /proc/stat
+  private OsCpuUsage allCpuUsage;
 
-  private long lastTotalTime;
-
-  private long lastIdleTime;
-
-  private int cpuNum;
-
-  private Id id;
+  // read from /proc/{pid}/stat
+  private ProcessCpuUsage processCpuUsage;
 
   public CpuMeter(Id id) {
-    this.id = id;
-    this.cpuNum = Runtime.getRuntime().availableProcessors();
-    refreshCpu();
-    rate = 0.0;
-  }
-
-  public void calcMeasurements(List<Measurement> measurements, long msNow) {
-    refreshCpu();
-    measurements.add(new Measurement(id, msNow, rate));
-  }
+    allCpuUsage = new OsCpuUsage(id.withTag(OsMeter.OS_TYPE, 
OsMeter.OS_TYPE_ALL_CPU));
+    processCpuUsage = new ProcessCpuUsage(id.withTag(OsMeter.OS_TYPE, 
OsMeter.OS_TYPE_PROCESS_CPU));
 
-  /*
-   * unit : 1 jiffies = 10ms = 0.01 s
-   * more details :
-   * http://man7.org/linux/man-pages/man5/proc.5.html
-   * cpu  2445171 599297 353967 24490633 11242   0    10780    2993            
 0      0
-   * cpu  user    nice   system idle     iowait  irq  softirq  stealstolen     
 guest  guest_nice
-   * 0    1       2      3      4        5        6   7        8
-   * cpuTotal = user + nice + system + idle + iowait + irq + softirq + 
stealstolen
-   */
-  protected void refreshCpu() {
-    try {
-      File file = new File("/proc/stat");
-      //just use first line
-      String cpuStr = FileUtils.readLines(file, StandardCharsets.UTF_8).get(0);
-      String[] cpuInfo = cpuStr.trim().split("\\s+");
-      long idle = Long.parseLong(cpuInfo[4]);
-      long total = 0L;
-      for (int i = 1; i <= 8; i++) {
-        total += Long.parseLong(cpuInfo[i]);
-      }
-      //just check, make sure it's safe
-      if (total != lastTotalTime) {
-        rate = 1.0 - (double) (idle - lastIdleTime) / (total - lastTotalTime);
-        rate *= cpuNum;
-      }
-      lastTotalTime = total;
-      lastIdleTime = idle;
-    } catch (IOException e) {
-      LOGGER.error("Failed to read current cpu info.", e);
-    }
+    //must refresh all first
+    update();
+    allCpuUsage.setUsage(0);
+    processCpuUsage.setUsage(0);
   }
 
-  public double getRate() {
-    return rate;
-  }
-
-  public long getLastTotalTime() {
-    return lastTotalTime;
+  public void calcMeasurements(List<Measurement> measurements, long msNow) {
+    update();
+    measurements.add(new Measurement(allCpuUsage.getId(), msNow, 
allCpuUsage.getUsage()));
+    measurements.add(new Measurement(processCpuUsage.getId(), msNow, 
processCpuUsage.getUsage()));
   }
 
-  public long getLastIdleTime() {
-    return lastIdleTime;
+  public void update() {
+    allCpuUsage.update();
+    processCpuUsage.setPeriodTotalTime(allCpuUsage.getPeriodTotalTime());
+    processCpuUsage.update();
   }
 
-  public int getCpuNum() {
-    return cpuNum;
+  public OsCpuUsage getAllCpuUsage() {
+    return allCpuUsage;
   }
 
-  public Id getId() {
-    return id;
+  public ProcessCpuUsage getProcessCpuUsage() {
+    return processCpuUsage;
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java
index 839661941..e6fa13e29 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java
@@ -26,6 +26,8 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.servicecomb.metrics.core.meter.os.net.InterfaceUsage;
+import org.apache.servicecomb.metrics.core.meter.os.net.NetStat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,101 +45,47 @@
 
   public static final Tag TAG_RECEIVE = new BasicTag(STATISTIC, "receive");
 
-  public static final Tag TAG_SEND = new BasicTag(STATISTIC, "send");
-
-  private final Id id;
-
-  private Map<String, InterfaceInfo> interfaceInfoMap = new 
ConcurrentHashMap<>();
-
-  public static class InterfaceInfo {
-    private final String name;
-
-    private Id sendId;
-
-    private Id receiveId;
-
-    //receive bytes
-    private long lastRxBytes;
-
-    //transmit bytes
-    private long lastTxBytes;
-
-    // bytes per second
-    private double sendRate;
-
-    private double receiveRate;
-
-    InterfaceInfo(Id id, String name) {
-      this.name = name;
-      id = id.withTag(INTERFACE, name);
-      this.sendId = id.withTag(TAG_SEND);
-      this.receiveId = id.withTag(TAG_RECEIVE);
-    }
-
-    public void update(String interfaceData, long secondInterval) {
-      String[] netInfo = interfaceData.trim().split("\\s+");
-      long rxBytes = Long.parseLong(netInfo[0]);
-      long txBytes = Long.parseLong(netInfo[8]);
-      sendRate = (double) (txBytes - lastTxBytes) / secondInterval;
-      receiveRate = (double) (rxBytes - lastRxBytes) / secondInterval;
-      lastRxBytes = rxBytes;
-      lastTxBytes = txBytes;
-    }
-
-    public String getName() {
-      return name;
-    }
+  public static final Tag TAG_PACKETS_RECEIVE = new BasicTag(STATISTIC, 
"receivePackets");
 
-    public long getLastRxBytes() {
-      return lastRxBytes;
-    }
+  public static final Tag TAG_SEND = new BasicTag(STATISTIC, "send");
 
-    public long getLastTxBytes() {
-      return lastTxBytes;
-    }
+  public static final Tag TAG_PACKETS_SEND = new BasicTag(STATISTIC, 
"sendPackets");
 
-    public double getSendRate() {
-      return sendRate;
-    }
+  private final Id id;
 
-    public double getReceiveRate() {
-      return receiveRate;
-    }
-  }
+  private Map<String, InterfaceUsage> interfaceUsageMap = new 
ConcurrentHashMap<>();
 
   public NetMeter(Id id) {
     this.id = id;
-
-    // init lastRxBytes and lastTxBytes
+    // init lastRxBytes, lastRxPackets, lastTxBytes, lastTxPackets
     refreshNet(1);
-    for (InterfaceInfo interfaceInfo : interfaceInfoMap.values()) {
-      interfaceInfo.sendRate = 0;
-      interfaceInfo.receiveRate = 0;
-    }
+    interfaceUsageMap.values().forEach(interfaceUsage -> {
+      interfaceUsage.getNetStats().forEach(NetStat::clearRate);
+    });
   }
 
   public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
     refreshNet(secondInterval);
 
-    for (InterfaceInfo interfaceInfo : interfaceInfoMap.values()) {
-      measurements.add(new Measurement(interfaceInfo.sendId, msNow, 
interfaceInfo.sendRate));
-      measurements.add(new Measurement(interfaceInfo.receiveId, msNow, 
interfaceInfo.receiveRate));
-    }
+    interfaceUsageMap.values().forEach(interfaceUsage -> {
+      interfaceUsage.calcMeasurements(measurements, msNow);
+    });
   }
 
+
   /*
    * Inter-|   Receive                                                         
   |  Transmit
    *  face |bytes      packets     errs drop fifo  frame      compressed 
multicast|bytes       packets     errs   drop  fifo colls carrier compressed
    *  eth0: 2615248100 32148518    0    0    0     0          0          0     
    87333034794 21420267    0      0     0     0    0    0
-   *        0          1           2    3    4     5          6          7     
     8
+   *        0          1           2    3    4     5          6          7     
     8          9
    */
   protected void refreshNet(long secondInterval) {
     try {
       File file = new File("/proc/net/dev");
       List<String> netInfo = FileUtils.readLines(file, StandardCharsets.UTF_8);
-      //the first two lines is useless
-
       Set<String> nameSet = new HashSet<>();
+
+      //the first two lines is useless
       for (int i = 2; i < netInfo.size(); i++) {
         String interfaceData = netInfo.get(i);
         String[] strings = interfaceData.split(":");
@@ -149,14 +97,14 @@ protected void refreshNet(long secondInterval) {
         String name = strings[0].trim();
         nameSet.add(name);
 
-        InterfaceInfo interfaceInfo = interfaceInfoMap.computeIfAbsent(name, 
key -> new InterfaceInfo(id, key));
-        interfaceInfo.update(strings[1], secondInterval);
+        InterfaceUsage interfaceUsage = 
interfaceUsageMap.computeIfAbsent(name, key -> new InterfaceUsage(id, key));
+        interfaceUsage.update(strings[1], secondInterval);
       }
 
       // clear deleted interfaces
-      for (String interfaceName : interfaceInfoMap.keySet()) {
+      for (String interfaceName : interfaceUsageMap.keySet()) {
         if (!nameSet.contains(interfaceName)) {
-          this.interfaceInfoMap.remove(interfaceName);
+          this.interfaceUsageMap.remove(interfaceName);
         }
       }
     } catch (IOException e) {
@@ -164,7 +112,7 @@ protected void refreshNet(long secondInterval) {
     }
   }
 
-  public Map<String, InterfaceInfo> getInterfaceInfoMap() {
-    return interfaceInfoMap;
+  public Map<String, InterfaceUsage> getInterfaceUsageMap() {
+    return interfaceUsageMap;
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java
index 257f8d9ff..b43566547 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java
@@ -26,16 +26,21 @@
 import com.netflix.spectator.api.Registry;
 
 /**
- * name=os type=cpu value=10.0
+ * name=os type=cpu value = 0
+ * name=os type=processCpu value = 0
  * name=os type=net interface=eth0 statistic=send value=100
  * name=os type=net interface=eth0 statistic=receive value=100
+ * name=os type=net interface=eth0 statistic=sendPackets value=100
+ * name=os type=net interface=eth0 statistic=receivePackets value=100
  */
 public class OsMeter extends AbstractPeriodMeter {
   public static final String OS_NAME = "os";
 
   public static final String OS_TYPE = "type";
 
-  public static final String OS_TYPE_CPU = "cpu";
+  public static final String OS_TYPE_ALL_CPU = "cpu";
+
+  public static final String OS_TYPE_PROCESS_CPU = "processCpu";
 
   public static final String OS_TYPE_NET = "net";
 
@@ -45,8 +50,7 @@
 
   public OsMeter(Registry registry) {
     this.id = registry.createId(OS_NAME);
-
-    cpuMeter = new CpuMeter(id.withTag(OS_TYPE, OS_TYPE_CPU));
+    cpuMeter = new CpuMeter(id);
     netMeter = new NetMeter(id.withTag(OS_TYPE, OS_TYPE_NET));
   }
 
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java
new file mode 100644
index 000000000..af4f51440
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.servicecomb.metrics.core.meter.os.cpu;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+import org.apache.commons.io.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.netflix.spectator.api.Id;
+
+public abstract class AbstractCpuUsage {
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(AbstractCpuUsage.class);
+
+  protected String filePath;
+
+  protected Id id;
+
+  protected long lastBusyTime;
+
+  protected long periodTotalTime;
+
+  protected double usage;
+
+  public AbstractCpuUsage(Id id, String filePath) {
+    this.id = id;
+    this.filePath = filePath;
+  }
+
+  public Id getId() {
+    return id;
+  }
+
+  public long getPeriodTotalTime() {
+    return periodTotalTime;
+  }
+
+  public long getLastBusyTime() {
+    return lastBusyTime;
+  }
+
+  public String getFilePath() {
+    return filePath;
+  }
+
+  public double getUsage() {
+    return usage;
+  }
+
+  public void setUsage(double usage) {
+    this.usage = usage;
+  }
+
+  public void setPeriodTotalTime(long periodTotalTime) {
+    this.periodTotalTime = periodTotalTime;
+  }
+
+  protected String[] readAndSplitStat() throws IOException {
+    File file = new File(filePath);
+    String stat = FileUtils.readLines(file, StandardCharsets.UTF_8).get(0);
+    return stat.trim().split("\\s+");
+  }
+
+  public void update() {
+    String[] stats;
+    try {
+      stats = readAndSplitStat();
+    } catch (IOException e) {
+      LOGGER.error(String.format("Failed to read cpu info/%s.", filePath), e);
+      return;
+    }
+
+    update(stats);
+  }
+
+  protected void update(String[] stats) {
+    long currentBusyTime = readCurrentBusyTime(stats);
+
+    usage = periodTotalTime == 0 ? 0 : (double) (currentBusyTime - 
lastBusyTime) / periodTotalTime;
+    usage *= Runtime.getRuntime().availableProcessors();
+
+    lastBusyTime = currentBusyTime;
+  }
+
+  protected abstract long readCurrentBusyTime(String[] stats);
+}
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java
new file mode 100644
index 000000000..48b9a8ce7
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.servicecomb.metrics.core.meter.os.cpu;
+
+import com.netflix.spectator.api.Id;
+
+/*
+ * unit : 1 jiffies = 10ms = 0.01 s
+ * more details :
+ * http://man7.org/linux/man-pages/man5/proc.5.html
+ * CMD :  /proc/stat
+ * cpu  2445171 599297 353967 24490633 11242   0    10780    2993             
0      0
+ * cpu  user    nice   system idle     iowait  irq  softirq  stealstolen      
guest  guest_nice
+ * 0    1       2      3      4        5        6   7        8
+ * total = user + nice + system + idle + iowait + irq + softirq + stealstolen
+ * busy = total - idle
+ */
+public class OsCpuUsage extends AbstractCpuUsage {
+  private long lastTotalTime;
+
+  private long currentTotalTime;
+
+  public OsCpuUsage(Id id) {
+    super(id, "/proc/stat");
+  }
+
+  @Override
+  protected void update(String[] stats) {
+    currentTotalTime = readCurrentTotalTime(stats);
+    periodTotalTime = currentTotalTime - lastTotalTime;
+    lastTotalTime = currentTotalTime;
+
+    super.update(stats);
+  }
+
+  private long readCurrentTotalTime(String[] stats) {
+    long total = 0L;
+    for (int i = 1; i <= 8; i++) {
+      total += Long.parseLong(stats[i]);
+    }
+    return total;
+  }
+
+  @Override
+  protected long readCurrentBusyTime(String[] stats) {
+    return currentTotalTime - Long.parseLong(stats[4]);
+  }
+
+  public long getLastTotalTime() {
+    return lastTotalTime;
+  }
+}
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java
new file mode 100644
index 000000000..57efd8579
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.servicecomb.metrics.core.meter.os.cpu;
+
+import java.lang.management.ManagementFactory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.netflix.spectator.api.Id;
+
+/*
+ * unit : 1 jiffies = 10ms = 0.01 s
+ * more details :
+ * http://man7.org/linux/man-pages/man5/proc.5.html
+ * CMD :  /proc/[pid]/stat
+ * 6754 (kubelet) S      1     995   995      0       -1     4202752   193281  
592501546 0       12       1152076 907044 87991  113319  ..
+ * pid  comm      state  ppid  pgrp  session  tty_nr  tpgid  flags     minflt  
cminflt   majflt  cmajflt  utime   stime  cutime cstime
+ * 0    1         2      3     4     5        6       7      8         9       
10        11      12       13      14     15     16
+ * busy = utime + stime + cutime + cstime
+ *
+ */
+public class ProcessCpuUsage extends AbstractCpuUsage {
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(ProcessCpuUsage.class);
+
+  public ProcessCpuUsage(Id id) {
+    super(id, String.format("/proc/%s/stat", getCurrentPid()));
+  }
+
+  private static String getCurrentPid() {
+    String name = ManagementFactory.getRuntimeMXBean().getName();
+    int idx = name.indexOf('@');
+    if (idx > 0) {
+      return name.substring(0, idx);
+    }
+
+    LOGGER.error("Failed to get current process id. {}", name);
+    throw new IllegalStateException("Failed to get current process Id");
+  }
+
+  @Override
+  protected long readCurrentBusyTime(String[] stats) {
+    long busy = 0L;
+    for (int i = 13; i <= 16; i++) {
+      busy += Long.parseLong(stats[i]);
+    }
+    return busy;
+  }
+}
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java
new file mode 100644
index 000000000..1fa8a7b03
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.servicecomb.metrics.core.meter.os.net;
+
+import static org.apache.servicecomb.metrics.core.meter.os.NetMeter.INTERFACE;
+import static 
org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_PACKETS_RECEIVE;
+import static 
org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_PACKETS_SEND;
+import static 
org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_RECEIVE;
+import static org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_SEND;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.netflix.spectator.api.Id;
+import com.netflix.spectator.api.Measurement;
+
+public class InterfaceUsage {
+  private final String name;
+
+  private List<NetStat> netStats = new ArrayList<>();
+
+  public InterfaceUsage(Id id, String name) {
+    this.name = name;
+    id = id.withTag(INTERFACE, name);
+    init(id);
+  }
+
+  private void init(Id id) {
+    // recv/Bps
+    netStats.add(new NetStat(id.withTag(TAG_RECEIVE), 0));
+    // send/Bps
+    netStats.add(new NetStat(id.withTag(TAG_SEND), 8));
+
+    // recv/pps
+    netStats.add(new NetStat(id.withTag(TAG_PACKETS_RECEIVE), 1));
+    // send/pps
+    netStats.add(new NetStat(id.withTag(TAG_PACKETS_SEND), 9));
+  }
+
+  public void calcMeasurements(List<Measurement> measurements, long msNow) {
+    netStats.forEach(netStat -> {
+      measurements.add(new Measurement(netStat.getId(), msNow, 
netStat.getRate()));
+    });
+  }
+
+  public void update(String interfaceData, long secondInterval) {
+    String[] netInfo = interfaceData.trim().split("\\s+");
+    netStats.forEach(netStat -> netStat.update(netInfo, secondInterval));
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public List<NetStat> getNetStats() {
+    return netStats;
+  }
+}
\ No newline at end of file
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java
new file mode 100644
index 000000000..f80a9088b
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.servicecomb.metrics.core.meter.os.net;
+
+import com.netflix.spectator.api.Id;
+
+public class NetStat {
+  private final int index;
+
+  private Id id;
+
+  // send/recv bytes/packets
+  private long lastValue;
+
+  // Bps/pps
+  private double rate;
+
+  public NetStat(Id id, int index) {
+    this.id = id;
+    this.index = index;
+  }
+
+  public void clearRate() {
+    rate = 0;
+  }
+
+  public void update(String[] netInfo, long secondInterval) {
+    long currentValue = Long.parseLong(netInfo[index]);
+    rate = (double) (currentValue - lastValue) / secondInterval;
+    lastValue = currentValue;
+  }
+
+  public long getLastValue() {
+    return lastValue;
+  }
+
+  public double getRate() {
+    return rate;
+  }
+
+  public int getIndex() {
+    return index;
+  }
+
+  public Id getId() {
+    return id;
+  }
+}
\ No newline at end of file
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ClientEndpointsLogPublisher.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ClientEndpointsLogPublisher.java
index 7bd9a874c..c49d4f054 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ClientEndpointsLogPublisher.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ClientEndpointsLogPublisher.java
@@ -32,7 +32,7 @@ public ClientEndpointsLogPublisher(MeasurementTree tree, 
StringBuilder sb, Strin
   @Override
   public void print(boolean printDetail) {
     appendLine(sb, "    client.endpoints:");
-    appendLine(sb, "      remote                connectCount    
disconnectCount connections     send         receive");
+    appendLine(sb, "      remote                connectCount    
disconnectCount connections     send(Bps)    receive(Bps)");
 
     double connect = 0;
     double disconnect = 0;
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
index 778a8bb53..7b3b48841 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
@@ -32,6 +32,7 @@
 import org.apache.servicecomb.foundation.vertx.VertxUtils;
 import org.apache.servicecomb.metrics.core.VertxMetersInitializer;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst;
+import org.apache.servicecomb.metrics.core.meter.os.CpuMeter;
 import org.apache.servicecomb.metrics.core.meter.os.NetMeter;
 import org.apache.servicecomb.metrics.core.meter.os.OsMeter;
 import org.apache.servicecomb.metrics.core.publish.model.DefaultPublishModel;
@@ -139,19 +140,23 @@ private void printNetLog(StringBuilder sb, 
MeasurementNode osNode) {
     }
 
     appendLine(sb, "  net:");
-    appendLine(sb, "    send         receive      interface");
+    appendLine(sb, "    send(Bps)    recv(Bps)    send(pps)    recv(pps)    
interface");
 
     StringBuilder tmpSb = new StringBuilder();
     for (MeasurementNode interfaceNode : netNode.getChildren().values()) {
       double sendRate = 
interfaceNode.findChild(NetMeter.TAG_SEND.value()).summary();
+      double sendPacketsRate = 
interfaceNode.findChild(NetMeter.TAG_PACKETS_SEND.value()).summary();
       double receiveRate = 
interfaceNode.findChild(NetMeter.TAG_RECEIVE.value()).summary();
-      if (sendRate == 0 && receiveRate == 0) {
+      double receivePacketsRate = 
interfaceNode.findChild(NetMeter.TAG_PACKETS_RECEIVE.value()).summary();
+      if (sendRate == 0 && receiveRate == 0 && receivePacketsRate == 0 && 
sendPacketsRate == 0) {
         continue;
       }
 
-      appendLine(tmpSb, "    %-12s %-12s %s",
+      appendLine(tmpSb, "    %-12s %-12s %-12s %-12s %s",
           NetUtils.humanReadableBytes((long) sendRate),
           NetUtils.humanReadableBytes((long) receiveRate),
+          NetUtils.humanReadableBytes((long) sendPacketsRate),
+          NetUtils.humanReadableBytes((long) receivePacketsRate),
           interfaceNode.getName());
     }
     if (tmpSb.length() != 0) {
@@ -160,10 +165,18 @@ private void printNetLog(StringBuilder sb, 
MeasurementNode osNode) {
   }
 
   private void printCpuLog(StringBuilder sb, MeasurementNode osNode) {
-    MeasurementNode cpuNode = osNode.findChild(OsMeter.OS_TYPE_CPU);
-    if (cpuNode != null && !cpuNode.getMeasurements().isEmpty()) {
-      appendLine(sb, "  cpu: %.2f%%", cpuNode.summary() * 100);
+    MeasurementNode cpuNode = osNode.findChild(OsMeter.OS_TYPE_ALL_CPU);
+    MeasurementNode processNode = 
osNode.findChild(OsMeter.OS_TYPE_PROCESS_CPU);
+    if (cpuNode == null || cpuNode.getMeasurements().isEmpty() ||
+        processNode == null || processNode.getMeasurements().isEmpty()) {
+      return;
     }
+
+    double allRate = cpuNode.summary();
+    double processRate = processNode.summary();
+
+    appendLine(sb, "  cpu:");
+    appendLine(sb, "    all: %.2f%%    process: %.2f%%", allRate * 100, 
processRate * 100);
   }
 
 
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ServerEndpointsLogPublisher.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ServerEndpointsLogPublisher.java
index 8edb940b0..5dc461a4b 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ServerEndpointsLogPublisher.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/ServerEndpointsLogPublisher.java
@@ -34,7 +34,7 @@ public ServerEndpointsLogPublisher(MeasurementTree tree, 
StringBuilder sb, Strin
   public void print(boolean printDetail) {
     appendLine(sb, "    server.endpoints:");
     appendLine(sb,
-        "      listen                connectCount    disconnectCount 
rejectByLimit   connections  send         receive");
+        "      listen                connectCount    disconnectCount 
rejectByLimit   connections  send(Bps)    receive(Bps)");
 
     double connect = 0;
     double disconnect = 0;
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestOsMeterInitializer.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestOsMeterInitializer.java
index bb73bd13e..8f2f60f86 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestOsMeterInitializer.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestOsMeterInitializer.java
@@ -17,6 +17,8 @@
 package org.apache.servicecomb.metrics.core;
 
 import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
@@ -28,8 +30,8 @@
 import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.apache.servicecomb.metrics.core.meter.os.CpuMeter;
 import org.apache.servicecomb.metrics.core.meter.os.NetMeter;
-import org.apache.servicecomb.metrics.core.meter.os.NetMeter.InterfaceInfo;
 import org.apache.servicecomb.metrics.core.meter.os.OsMeter;
+import org.apache.servicecomb.metrics.core.meter.os.net.InterfaceUsage;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -61,10 +63,10 @@ public void beforeTest() {
   }
 
   @Test
-  public void init(@Mocked Runtime runtime) {
+  public void init(@Mocked Runtime runtime, @Mocked RuntimeMXBean mxBean) {
     ReflectUtils.setField(SystemUtils.class, null, "IS_OS_LINUX", true);
     List<String> list = new ArrayList<>();
-    list.add("cpu  1 1 1 1 1 1 1 1 0 0");
+    list.add("cpu  1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1");
     list.add("useless");
     list.add("eth0: 0 0    0    0    0     0          0          0         0 0 
   0      0     0     0    0    0");
     new MockUp<FileUtils>() {
@@ -73,6 +75,13 @@ public void init(@Mocked Runtime runtime) {
         return list;
       }
     };
+    new MockUp<ManagementFactory>() {
+      @Mock
+      RuntimeMXBean getRuntimeMXBean() {
+        return mxBean;
+      }
+    };
+
     new MockUp<Runtime>() {
       @Mock
       public Runtime getRuntime() {
@@ -83,6 +92,8 @@ public Runtime getRuntime() {
       {
         runtime.availableProcessors();
         result = 2;
+        mxBean.getName();
+        result = "6666@desktop111";
       }
     };
     globalRegistry.add(registry);
@@ -94,16 +105,38 @@ public Runtime getRuntime() {
     Assert.assertNotNull(osMeter.getNetMeter());
     CpuMeter cpuMeter = osMeter.getCpuMeter();
     NetMeter netMeter = osMeter.getNetMeter();
-    Assert.assertEquals(2, cpuMeter.getCpuNum());
-    Assert.assertEquals(1L, cpuMeter.getLastIdleTime());
-    Assert.assertEquals(8L, cpuMeter.getLastTotalTime());
-    Map<String, InterfaceInfo> interfaceInfoMap = 
netMeter.getInterfaceInfoMap();
+    Assert.assertEquals(0.0, cpuMeter.getProcessCpuUsage().getUsage(), 0.0);
+    Assert.assertEquals("/proc/6666/stat", 
cpuMeter.getProcessCpuUsage().getFilePath());
+    Assert.assertEquals(4L, cpuMeter.getProcessCpuUsage().getLastBusyTime());
+    Assert.assertEquals(8L, 
cpuMeter.getProcessCpuUsage().getPeriodTotalTime());
+
+    Assert.assertEquals(0.0, cpuMeter.getAllCpuUsage().getUsage(), 0.0);
+    Assert.assertEquals(8L, cpuMeter.getAllCpuUsage().getPeriodTotalTime());
+    Assert.assertEquals(7L, cpuMeter.getAllCpuUsage().getLastBusyTime());
+    Assert.assertEquals("/proc/stat", cpuMeter.getAllCpuUsage().getFilePath());
+
+    Map<String, InterfaceUsage> interfaceInfoMap = 
netMeter.getInterfaceUsageMap();
     Assert.assertEquals(1, interfaceInfoMap.size());
-    InterfaceInfo eth0 = interfaceInfoMap.get("eth0");
-    Assert.assertEquals(0L, eth0.getLastRxBytes());
-    Assert.assertEquals(0L, eth0.getLastTxBytes());
-    Assert.assertEquals(0.0, eth0.getSendRate(), 0.0);
-    Assert.assertEquals(0.0, eth0.getReceiveRate(), 0.0);
+    InterfaceUsage eth0 = interfaceInfoMap.get("eth0");
+    Assert.assertEquals(4, eth0.getNetStats().size());
+    // recv Bps
+    Assert.assertEquals(0L, eth0.getNetStats().get(0).getLastValue());
+    Assert.assertEquals(0, eth0.getNetStats().get(0).getRate(), 0.0);
+    Assert.assertEquals(0, eth0.getNetStats().get(0).getIndex());
+    // send Bps
+    Assert.assertEquals(0L, eth0.getNetStats().get(1).getLastValue());
+    Assert.assertEquals(0, eth0.getNetStats().get(1).getRate(), 0.0);
+    Assert.assertEquals(8, eth0.getNetStats().get(1).getIndex());
+
+    // recv pps
+    Assert.assertEquals(0L, eth0.getNetStats().get(2).getLastValue());
+    Assert.assertEquals(0, eth0.getNetStats().get(2).getRate(), 0.0);
+    Assert.assertEquals(1, eth0.getNetStats().get(2).getIndex());
+
+    // send pps
+    Assert.assertEquals(0L, eth0.getNetStats().get(3).getLastValue());
+    Assert.assertEquals(0, eth0.getNetStats().get(3).getRate(), 0.0);
+    Assert.assertEquals(9, eth0.getNetStats().get(3).getIndex());
   }
 
   @Test
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java
index ba7c8c3c1..ad5573fd1 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java
@@ -160,17 +160,18 @@ private void testLog(LogCollector logCollector, 
List<Meter> meters, List<Measure
         + "    transport  4\n"
         + "  transport:\n"
         + "    client.endpoints:\n"
-        + "      remote                connectCount    disconnectCount 
connections     send         receive\n";
+        + "      remote                connectCount    disconnectCount 
connections     send(Bps)    receive(Bps)\n";
     if (printDetail) {
       expect += String.format(
-          "      127.0.0.1:%-5s       1               0               1        
       4 B          21 B        \n",
+          "      127.0.0.1:%-5s       1               0               1        
       4            21          \n",
           port);
     }
-    expect += "      (summary)             1               0               1   
            4 B          21 B        \n"
+    expect += "      (summary)             1               0               1   
            4            21          \n"
         + "    server.endpoints:\n"
-        + "      listen                connectCount    disconnectCount 
rejectByLimit   connections  send         receive\n"
-        + "      0.0.0.0:0             1               0               0       
        1            21 B         4 B         \n"
-        + "      (summary)             1               0               0       
        1            21 B         4 B         \n\n";
+        + "      listen                connectCount    disconnectCount 
rejectByLimit   connections  send(Bps)    receive(Bps)\n"
+        + "      0.0.0.0:0             1               0               0       
        1            21           4           \n"
+        + "      (summary)             1               0               0       
        1            21           4           \n\n";
+
     Assert.assertEquals(expect, actual);
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestCpuMeter.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestCpuMeter.java
index 1399cb65f..5b2819132 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestCpuMeter.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestCpuMeter.java
@@ -17,6 +17,8 @@
 package org.apache.servicecomb.metrics.core.meter.os;
 
 import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
@@ -36,54 +38,74 @@
 public class TestCpuMeter {
 
   @Test
-  public void testRefreshCpuSuccess(@Mocked Id id, @Mocked Runtime runtime) {
+  public void testRefreshCpuSuccess(@Mocked Id id, @Mocked Runtime runtime, 
@Mocked RuntimeMXBean mxBean) {
     List<String> list = new ArrayList<>();
-    list.add("cpu  1 1 1 1 1 1 1 1 0 0");
+    list.add("cpu  1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1");
     new MockUp<FileUtils>() {
       @Mock
       public List<String> readLines(File file, Charset encoding) {
         return list;
       }
     };
-    new Expectations() {
-      {
-        runtime.availableProcessors();
-        result = 2;
+    new MockUp<ManagementFactory>() {
+      @Mock
+      RuntimeMXBean getRuntimeMXBean() {
+        return mxBean;
       }
     };
+
     new MockUp<Runtime>() {
       @Mock
       public Runtime getRuntime() {
         return runtime;
       }
     };
+    new Expectations() {
+      {
+        runtime.availableProcessors();
+        result = 2;
+        mxBean.getName();
+        result = "6666@desktop111";
+      }
+    };
     CpuMeter cpuMeter = new CpuMeter(id);
-    Assert.assertEquals(0.0, cpuMeter.getRate(), 0.0);
-    Assert.assertEquals(8, cpuMeter.getLastTotalTime());
-    Assert.assertEquals(1, cpuMeter.getLastIdleTime());
-    Assert.assertEquals(2, cpuMeter.getCpuNum());
-    list.add(0, "cpu  2 2 2 2 2 2 2 2 0 0");
-    cpuMeter.refreshCpu();
-    Assert.assertEquals(1.75, cpuMeter.getRate(), 0.0);
-    Assert.assertEquals(16, cpuMeter.getLastTotalTime());
-    Assert.assertEquals(2, cpuMeter.getLastIdleTime());
-    Assert.assertEquals(2, cpuMeter.getCpuNum());
+    Assert.assertEquals(0.0, cpuMeter.getAllCpuUsage().getUsage(), 0.0);
+    Assert.assertEquals(0.0, cpuMeter.getProcessCpuUsage().getUsage(), 0.0);
+
+    Assert.assertEquals(4L, cpuMeter.getProcessCpuUsage().getLastBusyTime());
+    Assert.assertEquals(8L, cpuMeter.getAllCpuUsage().getPeriodTotalTime());
+    Assert.assertEquals(8L, cpuMeter.getAllCpuUsage().getLastTotalTime());
+    Assert.assertEquals(7L, cpuMeter.getAllCpuUsage().getLastBusyTime());
+
+    Assert.assertEquals("/proc/stat", cpuMeter.getAllCpuUsage().getFilePath());
+    Assert.assertEquals("/proc/6666/stat", 
cpuMeter.getProcessCpuUsage().getFilePath());
+
+    list.add(0, "cpu  2 2 2 2 2 2 2 2 0 0 2 2 2 2 2 2 2 2 2 2");
+    cpuMeter.update();
+    Assert.assertEquals(1.0, cpuMeter.getProcessCpuUsage().getUsage(), 0.0);
+    Assert.assertEquals(1.75, cpuMeter.getAllCpuUsage().getUsage(), 0.0);
+
+    Assert.assertEquals(8L, cpuMeter.getProcessCpuUsage().getLastBusyTime());
+    Assert.assertEquals(16L, cpuMeter.getAllCpuUsage().getLastTotalTime());
+    Assert.assertEquals(8L, cpuMeter.getAllCpuUsage().getPeriodTotalTime());
+    Assert.assertEquals(14L, cpuMeter.getAllCpuUsage().getLastBusyTime());
   }
 
   @Test
-  public void testRefreshError(@Mocked Id id, @Mocked Runtime runtime) {
+  public void testRefreshError(@Mocked Id id, @Mocked Runtime runtime, @Mocked 
RuntimeMXBean mxBean) {
     List<String> list = new ArrayList<>();
-    list.add("cpu  1 1 1 1 1 1 1 1 0 0");
+    list.add("cpu  1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1");
     new MockUp<FileUtils>() {
       @Mock
       public List<String> readLines(File file, Charset encoding) {
         return list;
       }
     };
-    new Expectations() {
-      {
-        runtime.availableProcessors();
-        result = 2;
+
+    new MockUp<ManagementFactory>() {
+      @Mock
+      RuntimeMXBean getRuntimeMXBean() {
+        return mxBean;
       }
     };
     new MockUp<Runtime>() {
@@ -92,33 +114,54 @@ public Runtime getRuntime() {
         return runtime;
       }
     };
+    new Expectations() {
+      {
+        runtime.availableProcessors();
+        result = 2;
+        mxBean.getName();
+        result = "6666@desktop111";
+      }
+    };
     CpuMeter cpuMeter = new CpuMeter(id);
-    Assert.assertEquals(0.0, cpuMeter.getRate(), 0.0);
-    Assert.assertEquals(8, cpuMeter.getLastTotalTime());
-    Assert.assertEquals(1, cpuMeter.getLastIdleTime());
-    Assert.assertEquals(2, cpuMeter.getCpuNum());
-    list.add(0, "cpu  1 1 1 1 1 1 1 1 0 0");
-    cpuMeter.refreshCpu();
-    Assert.assertEquals(0.0, cpuMeter.getRate(), 0.0);
-    Assert.assertEquals(8, cpuMeter.getLastTotalTime());
-    Assert.assertEquals(1, cpuMeter.getLastIdleTime());
+    Assert.assertEquals(0.0, cpuMeter.getAllCpuUsage().getUsage(), 0.0);
+    Assert.assertEquals(0.0, cpuMeter.getProcessCpuUsage().getUsage(), 0.0);
+
+    Assert.assertEquals(4L, cpuMeter.getProcessCpuUsage().getLastBusyTime());
+    Assert.assertEquals(8L, cpuMeter.getAllCpuUsage().getPeriodTotalTime());
+    Assert.assertEquals(8L, cpuMeter.getAllCpuUsage().getLastTotalTime());
+    Assert.assertEquals(7L, cpuMeter.getAllCpuUsage().getLastBusyTime());
+
+    Assert.assertEquals("/proc/stat", cpuMeter.getAllCpuUsage().getFilePath());
+    Assert.assertEquals("/proc/6666/stat", 
cpuMeter.getProcessCpuUsage().getFilePath());
+
+    list.add(0, "cpu  1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1");
+    cpuMeter.update();
+
+    Assert.assertEquals(0.0, cpuMeter.getAllCpuUsage().getUsage(), 0.0);
+    Assert.assertEquals(0.0, cpuMeter.getProcessCpuUsage().getUsage(), 0.0);
+
+    Assert.assertEquals(4L, cpuMeter.getProcessCpuUsage().getLastBusyTime());
+    Assert.assertEquals(0L, cpuMeter.getAllCpuUsage().getPeriodTotalTime());
+    Assert.assertEquals(8L, cpuMeter.getAllCpuUsage().getLastTotalTime());
+    Assert.assertEquals(7L, cpuMeter.getAllCpuUsage().getLastBusyTime());
   }
 
   @Test
-  public void testCalcMeasurements(@Mocked Id id, @Mocked Runtime runtime) {
+  public void testCalcMeasurements(@Mocked Id id, @Mocked Runtime runtime, 
@Mocked RuntimeMXBean mxBean) {
     List<Measurement> measurements = new ArrayList<>();
     List<String> list = new ArrayList<>();
-    list.add("cpu  1 1 1 1 1 1 1 1 0 0");
+    list.add("cpu  1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1");
     new MockUp<FileUtils>() {
       @Mock
       public List<String> readLines(File file, Charset encoding) {
         return list;
       }
     };
-    new Expectations() {
-      {
-        runtime.availableProcessors();
-        result = 2;
+
+    new MockUp<ManagementFactory>() {
+      @Mock
+      RuntimeMXBean getRuntimeMXBean() {
+        return mxBean;
       }
     };
     new MockUp<Runtime>() {
@@ -127,12 +170,23 @@ public Runtime getRuntime() {
         return runtime;
       }
     };
+    new Expectations() {
+      {
+        runtime.availableProcessors();
+        result = 2;
+        mxBean.getName();
+        result = "6666@desktop111";
+      }
+    };
     CpuMeter cpuMeter = new CpuMeter(id);
-    list.add(0, "cpu  2 2 2 2 2 2 2 2 0 0");
+    list.add(0, "cpu  2 2 2 2 2 2 2 2 0 0 2 2 2 2 2 2 2 2 2 2");
     cpuMeter.calcMeasurements(measurements, 0);
-    Assert.assertEquals(1, measurements.size());
+    Assert.assertEquals(2, measurements.size());
     Measurement measurement = measurements.get(0);
     Assert.assertEquals(0, measurement.timestamp());
     Assert.assertEquals(1.75, measurement.value(), 0.0);
+    measurement = measurements.get(1);
+    Assert.assertEquals(0, measurement.timestamp());
+    Assert.assertEquals(1.0, measurement.value(), 0.0);
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestNetMeter.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestNetMeter.java
index 8caa14d5e..b692c7a2f 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestNetMeter.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestNetMeter.java
@@ -23,7 +23,7 @@
 import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.servicecomb.metrics.core.meter.os.NetMeter.InterfaceInfo;
+import org.apache.servicecomb.metrics.core.meter.os.net.InterfaceUsage;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -51,14 +51,32 @@ public void testNetRefreshUnchanged(@Mocked Id id) {
     list.remove(2);
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
     netMeter.refreshNet(1);
-    Map<String, InterfaceInfo> meterInterfaceInfoMap = 
netMeter.getInterfaceInfoMap();
+    Map<String, InterfaceUsage> meterInterfaceInfoMap = 
netMeter.getInterfaceUsageMap();
     Assert.assertTrue(meterInterfaceInfoMap.containsKey("eth0"));
-    InterfaceInfo eth0 = meterInterfaceInfoMap.get("eth0");
+
+    InterfaceUsage eth0 = meterInterfaceInfoMap.get("eth0");
+
     Assert.assertEquals("eth0", eth0.getName());
-    Assert.assertEquals(1L, eth0.getLastRxBytes());
-    Assert.assertEquals(1L, eth0.getLastTxBytes());
-    Assert.assertEquals(1, eth0.getReceiveRate(), 0.0);
-    Assert.assertEquals(1, eth0.getSendRate(), 0.0);
+
+    Assert.assertEquals(4, eth0.getNetStats().size());
+    // recv Bps
+    Assert.assertEquals(1L, eth0.getNetStats().get(0).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(0).getRate(), 0.0);
+    Assert.assertEquals(0, eth0.getNetStats().get(0).getIndex());
+    // send Bps
+    Assert.assertEquals(1L, eth0.getNetStats().get(1).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(1).getRate(), 0.0);
+    Assert.assertEquals(8, eth0.getNetStats().get(1).getIndex());
+
+    // recv pps
+    Assert.assertEquals(1L, eth0.getNetStats().get(2).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(2).getRate(), 0.0);
+    Assert.assertEquals(1, eth0.getNetStats().get(2).getIndex());
+
+    // send pps
+    Assert.assertEquals(1L, eth0.getNetStats().get(3).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(3).getRate(), 0.0);
+    Assert.assertEquals(9, eth0.getNetStats().get(3).getIndex());
   }
 
 
@@ -75,25 +93,57 @@ public void testNetRefreshAdd(@Mocked Id id) {
       }
     };
     NetMeter netMeter = new NetMeter(id);
-    Map<String, InterfaceInfo> netMap = netMeter.getInterfaceInfoMap();
+    Map<String, InterfaceUsage> netMap = netMeter.getInterfaceUsageMap();
     Assert.assertEquals(1, netMap.size());
     list.remove(2);
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
     list.add("lo: 0 0    0    0    0     0          0          0         0 0   
 0      0     0     0    0    0");
     netMeter.refreshNet(1);
     Assert.assertEquals(2, netMap.size());
-    InterfaceInfo eth0 = netMap.get("eth0");
+    InterfaceUsage eth0 = netMap.get("eth0");
     Assert.assertEquals("eth0", eth0.getName());
-    Assert.assertEquals(1L, eth0.getLastRxBytes());
-    Assert.assertEquals(1L, eth0.getLastTxBytes());
-    Assert.assertEquals(1, eth0.getReceiveRate(), 0.0);
-    Assert.assertEquals(1, eth0.getSendRate(), 0.0);
-    InterfaceInfo lo = netMap.get("lo");
+    Assert.assertEquals(4, eth0.getNetStats().size());
+    // recv Bps
+    Assert.assertEquals(1L, eth0.getNetStats().get(0).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(0).getRate(), 0.0);
+    Assert.assertEquals(0, eth0.getNetStats().get(0).getIndex());
+    // send Bps
+    Assert.assertEquals(1L, eth0.getNetStats().get(1).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(1).getRate(), 0.0);
+    Assert.assertEquals(8, eth0.getNetStats().get(1).getIndex());
+
+    // recv pps
+    Assert.assertEquals(1L, eth0.getNetStats().get(2).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(2).getRate(), 0.0);
+    Assert.assertEquals(1, eth0.getNetStats().get(2).getIndex());
+
+    // send pps
+    Assert.assertEquals(1L, eth0.getNetStats().get(3).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(3).getRate(), 0.0);
+    Assert.assertEquals(9, eth0.getNetStats().get(3).getIndex());
+
+    InterfaceUsage lo = netMap.get("lo");
     Assert.assertEquals("lo", lo.getName());
-    Assert.assertEquals(0L, lo.getLastRxBytes());
-    Assert.assertEquals(0L, lo.getLastTxBytes());
-    Assert.assertEquals(0, lo.getReceiveRate(), 0.0);
-    Assert.assertEquals(0, lo.getSendRate(), 0.0);
+
+    Assert.assertEquals(4, lo.getNetStats().size());
+    // recv Bps
+    Assert.assertEquals(0L, lo.getNetStats().get(0).getLastValue());
+    Assert.assertEquals(0, lo.getNetStats().get(0).getRate(), 0.0);
+    Assert.assertEquals(0, lo.getNetStats().get(0).getIndex());
+    // send Bps
+    Assert.assertEquals(0L, lo.getNetStats().get(1).getLastValue());
+    Assert.assertEquals(0, lo.getNetStats().get(1).getRate(), 0.0);
+    Assert.assertEquals(8, lo.getNetStats().get(1).getIndex());
+
+    // recv pps
+    Assert.assertEquals(0L, lo.getNetStats().get(2).getLastValue());
+    Assert.assertEquals(0, lo.getNetStats().get(2).getRate(), 0.0);
+    Assert.assertEquals(1, lo.getNetStats().get(2).getIndex());
+
+    // send pps
+    Assert.assertEquals(0L, lo.getNetStats().get(3).getLastValue());
+    Assert.assertEquals(0, lo.getNetStats().get(3).getRate(), 0.0);
+    Assert.assertEquals(9, lo.getNetStats().get(3).getIndex());
   }
 
 
@@ -111,20 +161,51 @@ public void testNetRefreshRemove(@Mocked Id id) {
       }
     };
     NetMeter netMeter = new NetMeter(id);
-    Map<String, InterfaceInfo> netMap = netMeter.getInterfaceInfoMap();
+    Map<String, InterfaceUsage> netMap = netMeter.getInterfaceUsageMap();
     Assert.assertEquals(2, netMap.size());
-    InterfaceInfo lo = netMap.get("lo");
-    InterfaceInfo eth0 = netMap.get("eth0");
+    InterfaceUsage lo = netMap.get("lo");
+    InterfaceUsage eth0 = netMap.get("eth0");
     Assert.assertEquals("lo", lo.getName());
-    Assert.assertEquals(0L, lo.getLastRxBytes());
-    Assert.assertEquals(0L, lo.getLastTxBytes());
-    Assert.assertEquals(0, lo.getReceiveRate(), 0.0);
-    Assert.assertEquals(0, lo.getSendRate(), 0.0);
+    Assert.assertEquals(4, lo.getNetStats().size());
+    // recv Bps
+    Assert.assertEquals(0L, lo.getNetStats().get(0).getLastValue());
+    Assert.assertEquals(0, lo.getNetStats().get(0).getRate(), 0.0);
+    Assert.assertEquals(0, lo.getNetStats().get(0).getIndex());
+    // send Bps
+    Assert.assertEquals(0L, lo.getNetStats().get(1).getLastValue());
+    Assert.assertEquals(0, lo.getNetStats().get(1).getRate(), 0.0);
+    Assert.assertEquals(8, lo.getNetStats().get(1).getIndex());
+
+    // recv pps
+    Assert.assertEquals(0L, lo.getNetStats().get(2).getLastValue());
+    Assert.assertEquals(0, lo.getNetStats().get(2).getRate(), 0.0);
+    Assert.assertEquals(1, lo.getNetStats().get(2).getIndex());
+
+    // send pps
+    Assert.assertEquals(0L, lo.getNetStats().get(3).getLastValue());
+    Assert.assertEquals(0, lo.getNetStats().get(3).getRate(), 0.0);
+    Assert.assertEquals(9, lo.getNetStats().get(3).getIndex());
+
     Assert.assertEquals("eth0", eth0.getName());
-    Assert.assertEquals(0L, eth0.getLastTxBytes());
-    Assert.assertEquals(0L, eth0.getLastRxBytes());
-    Assert.assertEquals(0, eth0.getReceiveRate(), 0.0);
-    Assert.assertEquals(0, eth0.getSendRate(), 0.0);
+    Assert.assertEquals(4, eth0.getNetStats().size());
+    // recv Bps
+    Assert.assertEquals(0L, eth0.getNetStats().get(0).getLastValue());
+    Assert.assertEquals(0, eth0.getNetStats().get(0).getRate(), 0.0);
+    Assert.assertEquals(0, eth0.getNetStats().get(0).getIndex());
+    // send Bps
+    Assert.assertEquals(0L, eth0.getNetStats().get(1).getLastValue());
+    Assert.assertEquals(0, eth0.getNetStats().get(1).getRate(), 0.0);
+    Assert.assertEquals(8, eth0.getNetStats().get(1).getIndex());
+
+    // recv pps
+    Assert.assertEquals(0L, eth0.getNetStats().get(2).getLastValue());
+    Assert.assertEquals(0, eth0.getNetStats().get(2).getRate(), 0.0);
+    Assert.assertEquals(1, eth0.getNetStats().get(2).getIndex());
+
+    // send pps
+    Assert.assertEquals(0L, eth0.getNetStats().get(3).getLastValue());
+    Assert.assertEquals(0, eth0.getNetStats().get(3).getRate(), 0.0);
+    Assert.assertEquals(9, eth0.getNetStats().get(3).getIndex());
     list.remove(2);
     list.remove(2);
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
@@ -132,10 +213,25 @@ public void testNetRefreshRemove(@Mocked Id id) {
     Assert.assertNull(netMap.get("lo"));
     Assert.assertEquals(1, netMap.size());
     Assert.assertEquals("eth0", eth0.getName());
-    Assert.assertEquals(1L, eth0.getLastRxBytes());
-    Assert.assertEquals(1L, eth0.getLastTxBytes());
-    Assert.assertEquals(1, eth0.getReceiveRate(), 0.0);
-    Assert.assertEquals(1, eth0.getSendRate(), 0.0);
+    Assert.assertEquals(4, eth0.getNetStats().size());
+    // recv Bps
+    Assert.assertEquals(1L, eth0.getNetStats().get(0).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(0).getRate(), 0.0);
+    Assert.assertEquals(0, eth0.getNetStats().get(0).getIndex());
+    // send Bps
+    Assert.assertEquals(1L, eth0.getNetStats().get(1).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(1).getRate(), 0.0);
+    Assert.assertEquals(8, eth0.getNetStats().get(1).getIndex());
+
+    // recv pps
+    Assert.assertEquals(1L, eth0.getNetStats().get(2).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(2).getRate(), 0.0);
+    Assert.assertEquals(1, eth0.getNetStats().get(2).getIndex());
+
+    // send pps
+    Assert.assertEquals(1L, eth0.getNetStats().get(3).getLastValue());
+    Assert.assertEquals(1, eth0.getNetStats().get(3).getRate(), 0.0);
+    Assert.assertEquals(9, eth0.getNetStats().get(3).getIndex());
   }
 
 
@@ -153,13 +249,17 @@ public void testCalcMeasurements(@Mocked Id id) {
     };
     NetMeter netMeter = new NetMeter(id);
     list.remove(2);
-    list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
+    list.add("eth0: 3 1    0    0    0     0          0          1         3 1 
   1      0     0     0    0    0");
     List<Measurement> measurements = new ArrayList<>();
     netMeter.calcMeasurements(measurements, 0L, 1);
-    Assert.assertEquals(2, measurements.size());
-    Measurement send = measurements.get(0);
-    Measurement recv = measurements.get(1);
-    Assert.assertEquals(1.0, send.value(), 0.0);
-    Assert.assertEquals(1.0, recv.value(), 0.0);
+    Assert.assertEquals(4, measurements.size());
+    Measurement receive = measurements.get(0);
+    Measurement send = measurements.get(1);
+    Measurement receivePackets = measurements.get(2);
+    Measurement sendPackets = measurements.get(3);
+    Assert.assertEquals(3.0, send.value(), 0.0);
+    Assert.assertEquals(1.0, sendPackets.value(), 0.0);
+    Assert.assertEquals(3.0, receive.value(), 0.0);
+    Assert.assertEquals(1.0, receivePackets.value(), 0.0);
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestOsMeter.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestOsMeter.java
index a07f22916..79b20a718 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestOsMeter.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestOsMeter.java
@@ -18,6 +18,8 @@
 
 
 import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
@@ -41,9 +43,9 @@
   Registry registry = new DefaultRegistry(new ManualClock());
 
   @Test
-  public void testCalcMeasurement(@Mocked Runtime runtime) {
+  public void testCalcMeasurement(@Mocked Runtime runtime, @Mocked 
RuntimeMXBean mxBean) {
     List<String> list = new ArrayList<>();
-    list.add("cpu  1 1 1 1 1 1 1 1 0 0");
+    list.add("cpu  1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1");
     list.add("useless");
     list.add("eth0: 0 0    0    0    0     0          0          0         0 0 
   0      0     0     0    0    0");
     new MockUp<FileUtils>() {
@@ -52,6 +54,12 @@ public void testCalcMeasurement(@Mocked Runtime runtime) {
         return list;
       }
     };
+    new MockUp<ManagementFactory>() {
+      @Mock
+      RuntimeMXBean getRuntimeMXBean() {
+        return mxBean;
+      }
+    };
     new MockUp<Runtime>() {
       @Mock
       public Runtime getRuntime() {
@@ -62,19 +70,24 @@ public Runtime getRuntime() {
       {
         runtime.availableProcessors();
         result = 2;
+        mxBean.getName();
+        result = "6666@desktop111";
       }
     };
     OsMeter osMeter = new OsMeter(registry);
     list.clear();
-    list.add("cpu  2 2 2 2 2 2 2 2 0 0");
+    list.add("cpu  2 2 2 2 2 2 2 2 0 0 2 2 2 2 2 2 2 2 2 2");
     list.add("useless");
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
 
     osMeter.calcMeasurements(1, 1);
     ArrayList<Measurement> measurements = 
Lists.newArrayList(osMeter.measure());
-    Assert.assertEquals(3, measurements.size());
+    Assert.assertEquals(6, measurements.size());
     Assert.assertEquals(1.75, measurements.get(0).value(), 0.0);
     Assert.assertEquals(1.0, measurements.get(1).value(), 0.0);
     Assert.assertEquals(1.0, measurements.get(2).value(), 0.0);
+    Assert.assertEquals(1.0, measurements.get(3).value(), 0.0);
+    Assert.assertEquals(1.0, measurements.get(4).value(), 0.0);
+    Assert.assertEquals(1.0, measurements.get(5).value(), 0.0);
   }
 }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
index 81ab22c1f..81f29dc35 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java
@@ -180,31 +180,36 @@ public void onPolledEvent(@Mocked VertxImplEx 
vertxImplEx, @Mocked MeasurementTr
     model.getThreadPools().put("test", new ThreadPoolPublishModel());
     Measurement measurement = new Measurement(null, 0L, 1.0);
 
+    MeasurementNode measurementNodeCpuAll = new MeasurementNode("allProcess", 
new HashMap<>());
+    MeasurementNode measurementNodeCpuProcess = new 
MeasurementNode("currentProcess", new HashMap<>());
     MeasurementNode measurementNodeSend = new MeasurementNode("send", new 
HashMap<>());
-    MeasurementNode measurementNodeCpu = new MeasurementNode("cpu", new 
HashMap<>());
+    MeasurementNode measurementNodeSendPacket = new 
MeasurementNode("sendPackets", new HashMap<>());
     MeasurementNode measurementNodeRecv = new MeasurementNode("receive", new 
HashMap<>());
+    MeasurementNode measurementNodeRecvPacket = new 
MeasurementNode("receivePackets", new HashMap<>());
     MeasurementNode measurementNodeEth0 = new MeasurementNode("eth0", new 
HashMap<>());
     MeasurementNode measurementNodeNet = new MeasurementNode("net", new 
HashMap<>());
     MeasurementNode measurementNodeOs = new MeasurementNode("os", new 
HashMap<>());
 
     measurementNodeSend.getMeasurements().add(measurement);
     measurementNodeRecv.getMeasurements().add(measurement);
+    measurementNodeCpuAll.getMeasurements().add(measurement);
+    measurementNodeCpuProcess.getMeasurements().add(measurement);
+    measurementNodeRecvPacket.getMeasurements().add(measurement);
+    measurementNodeSendPacket.getMeasurements().add(measurement);
+
     measurementNodeEth0.getChildren().put("send", measurementNodeSend);
     measurementNodeEth0.getChildren().put("receive", measurementNodeRecv);
+    measurementNodeEth0.getChildren().put("receivePackets", 
measurementNodeRecvPacket);
+    measurementNodeEth0.getChildren().put("sendPackets", 
measurementNodeSendPacket);
+
     measurementNodeNet.getChildren().put("eth0", measurementNodeEth0);
-    measurementNodeOs.getChildren().put("cpu", measurementNodeCpu);
+    measurementNodeOs.getChildren().put("cpu", measurementNodeCpuAll);
+    measurementNodeOs.getChildren().put("processCpu", 
measurementNodeCpuProcess);
     measurementNodeOs.getChildren().put("net", measurementNodeNet);
 
     measurementNodeOs.getMeasurements().add(measurement);
     measurementNodeNet.getMeasurements().add(measurement);
-    measurementNodeCpu.getMeasurements().add(measurement);
     measurementNodeEth0.getMeasurements().add(measurement);
-    new Expectations() {
-      {
-        tree.findChild(OsMeter.OS_NAME);
-        result = measurementNodeOs;
-      }
-    };
 
     new MockUp<PublishModelFactory>() {
       @Mock
@@ -217,7 +222,12 @@ MeasurementTree getTree() {
         return tree;
       }
     };
-
+    new Expectations() {
+      {
+        tree.findChild(OsMeter.OS_NAME);
+        result = measurementNodeOs;
+      }
+    };
     publisher.onPolledEvent(new PolledEvent(Collections.emptyList(), 
Collections.emptyList()));
 
     List<LoggingEvent> events = collector.getEvents().stream().filter(e -> {
@@ -227,10 +237,11 @@ MeasurementTree getTree() {
     LoggingEvent event = events.get(0);
     Assert.assertEquals("\n"
             + "os:\n"
-            + "  cpu: 100.00%\n"
+            + "  cpu:\n"
+            + "    all: 100.00%    process: 100.00%\n"
             + "  net:\n"
-            + "    send         receive      interface\n"
-            + "    1 B          1 B          eth0\n"
+            + "    send(Bps)    recv(Bps)    send(pps)    recv(pps)    
interface\n"
+            + "    1            1            1            1            eth0\n"
             + "vertx:\n"
             + "  instances:\n"
             + "    name       eventLoopContext-created\n"


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


> add current process CPU rate  and net packets in the metrics
> ------------------------------------------------------------
>
>                 Key: SCB-1044
>                 URL: https://issues.apache.org/jira/browse/SCB-1044
>             Project: Apache ServiceComb
>          Issue Type: Improvement
>          Components: Java-Chassis
>            Reporter: 何一乐
>            Assignee: 何一乐
>            Priority: Major
>




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to