You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/12/05 08:10:30 UTC

[servicecomb-java-chassis] 01/04: [SCB-1044]add current process CPU rate and net packets in the metrics

This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit bb2b8a88946f57d49a646aa9f61640bfe16b25fb
Author: heyile <25...@qq.com>
AuthorDate: Mon Nov 26 20:35:22 2018 +0800

    [SCB-1044]add current process CPU rate  and net packets in the metrics
---
 .../foundation/common/net/NetUtils.java            |  4 +-
 .../foundation/common/net/TestNetUtils.java        | 55 +++++++-------
 .../metrics/publish/spectator/MeasurementTree.java |  2 +-
 .../metrics/core/meter/os/CpuMeter.java            | 78 +++++++++++++++++--
 .../metrics/core/meter/os/NetMeter.java            | 51 ++++++++++++-
 .../servicecomb/metrics/core/meter/os/OsMeter.java |  5 +-
 .../core/publish/ClientEndpointsLogPublisher.java  |  2 +-
 .../metrics/core/publish/DefaultLogPublisher.java  | 21 ++++--
 .../core/publish/ServerEndpointsLogPublisher.java  |  2 +-
 .../metrics/core/TestOsMeterInitializer.java       | 22 +++++-
 .../metrics/core/TestVertxMetersInitializer.java   | 13 ++--
 .../metrics/core/meter/os/TestCpuMeter.java        | 88 ++++++++++++++++------
 .../metrics/core/meter/os/TestNetMeter.java        | 36 ++++++++-
 .../metrics/core/meter/os/TestOsMeter.java         | 21 +++++-
 .../core/publish/TestDefaultLogPublisher.java      | 37 ++++++---
 15 files changed, 341 insertions(+), 96 deletions(-)

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 c03061a..30f8e29 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 final class NetUtils {
   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 15c6a9e..15e157f 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 class TestNetUtils {
 
   @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/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementTree.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementTree.java
index 79101fa..5e18de6 100644
--- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementTree.java
+++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementTree.java
@@ -56,7 +56,7 @@ public class MeasurementTree extends MeasurementNode {
         Tag tag = tagFinder.find(id.tags());
         if (tag == null) {
           if (tagFinder.skipOnNull()) {
-            break;
+            continue;
           }
           throw new IllegalStateException(
               String.format("tag key \"%s\" not exist in %s",
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 60f6cd2..409fdc9 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
@@ -18,6 +18,7 @@ package org.apache.servicecomb.metrics.core.meter.os;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.management.ManagementFactory;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 
@@ -25,61 +26,118 @@ import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.netflix.spectator.api.BasicTag;
 import com.netflix.spectator.api.Id;
 import com.netflix.spectator.api.Measurement;
+import com.netflix.spectator.api.Tag;
 
 public class CpuMeter {
   private static final Logger LOGGER = LoggerFactory.getLogger(CpuMeter.class);
 
+  public static final String STATISTIC = "statistic";
+
+  public static final Tag TAG_All = new BasicTag(STATISTIC, "allProcess");
+
+  public static final Tag TAG_CURRENT = new BasicTag(STATISTIC, "currentProcess");
+
   private double rate;
 
+  private double processRate;
+
   private long lastTotalTime;
 
   private long lastIdleTime;
 
+  private long lastProcessTime;
+
   private int cpuNum;
 
-  private Id id;
+  // process id
+  private String pid;
+
+  // allProcess
+  private Id AId;
+
+  // currentProcess
+  private Id CId;
 
   public CpuMeter(Id id) {
-    this.id = id;
+    this.AId = id.withTag(TAG_All);
+    this.CId = id.withTag(TAG_CURRENT);
+
+    this.pid = getCurrentPid();
     this.cpuNum = Runtime.getRuntime().availableProcessors();
     refreshCpu();
     rate = 0.0;
+    processRate = 0.0;
+  }
+
+  private String getCurrentPid() {
+    String name = ManagementFactory.getRuntimeMXBean().getName();
+    if (name.contains("@")) {
+      return name.substring(0, name.indexOf("@"));
+    }
+    LOGGER.warn("Failed to get current process id. {}", name);
+    return null;
   }
 
   public void calcMeasurements(List<Measurement> measurements, long msNow) {
     refreshCpu();
-    measurements.add(new Measurement(id, msNow, rate));
+    measurements.add(new Measurement(AId, msNow, rate));
+    measurements.add(new Measurement(CId, msNow, processRate));
   }
 
   /*
    * 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
    * cpuTotal = user + nice + system + idle + iowait + irq + softirq + stealstolen
+   *
+   * 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
+   * processTotalTime = utime + stime + cutime + cstime
+   *
    */
   protected void refreshCpu() {
     try {
       File file = new File("/proc/stat");
+      File pFile = new File(String.format("/proc/%s/stat", pid));
       //just use first line
+
       String cpuStr = FileUtils.readLines(file, StandardCharsets.UTF_8).get(0);
+      String pCpuStr = FileUtils.readLines(pFile, StandardCharsets.UTF_8).get(0);
+
       String[] cpuInfo = cpuStr.trim().split("\\s+");
-      long idle = Long.parseLong(cpuInfo[4]);
+      String[] pCpuInfo = pCpuStr.trim().split("\\s+");
+
       long total = 0L;
+      long pTotal = 0L;
+      long idle = Long.parseLong(cpuInfo[4]);
+
       for (int i = 1; i <= 8; i++) {
         total += Long.parseLong(cpuInfo[i]);
       }
+      for (int i = 13; i <= 16; i++) {
+        pTotal += Long.parseLong(pCpuInfo[i]);
+      }
+
       //just check, make sure it's safe
       if (total != lastTotalTime) {
         rate = 1.0 - (double) (idle - lastIdleTime) / (total - lastTotalTime);
+        processRate = (double) (pTotal - lastProcessTime) / (total - lastTotalTime);
         rate *= cpuNum;
+        processRate *= cpuNum;
       }
+
       lastTotalTime = total;
       lastIdleTime = idle;
+      lastProcessTime = pTotal;
     } catch (IOException e) {
       LOGGER.error("Failed to read current cpu info.", e);
     }
@@ -97,11 +155,19 @@ public class CpuMeter {
     return lastIdleTime;
   }
 
+  public long getLastProcessTime() {
+    return lastProcessTime;
+  }
+
+  public double getProcessRate() {
+    return processRate;
+  }
+
   public int getCpuNum() {
     return cpuNum;
   }
 
-  public Id getId() {
-    return id;
+  public String getPid() {
+    return pid;
   }
 }
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 8396619..98f899d 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
@@ -43,8 +43,12 @@ public class NetMeter {
 
   public static final Tag TAG_RECEIVE = new BasicTag(STATISTIC, "receive");
 
+  public static final Tag TAG_PACKETS_RECEIVE = new BasicTag(STATISTIC, "receivePackets");
+
   public static final Tag TAG_SEND = new BasicTag(STATISTIC, "send");
 
+  public static final Tag TAG_PACKETS_SEND = new BasicTag(STATISTIC, "sendPackets");
+
   private final Id id;
 
   private Map<String, InterfaceInfo> interfaceInfoMap = new ConcurrentHashMap<>();
@@ -56,32 +60,55 @@ public class NetMeter {
 
     private Id receiveId;
 
+    private Id sendPacketId;
+
+    private Id receivePacketId;
+
     //receive bytes
     private long lastRxBytes;
 
     //transmit bytes
     private long lastTxBytes;
 
+    //receive packets
+    private long lastRxPackets;
+
+    //transmit packets
+    private long lastTxPackets;
+
     // bytes per second
     private double sendRate;
 
     private double receiveRate;
 
+    private double sendPacketsRate;
+
+    private double receivePacketsRate;
+
+
     InterfaceInfo(Id id, String name) {
       this.name = name;
       id = id.withTag(INTERFACE, name);
       this.sendId = id.withTag(TAG_SEND);
+      this.sendPacketId = id.withTag(TAG_PACKETS_SEND);
       this.receiveId = id.withTag(TAG_RECEIVE);
+      this.receivePacketId = id.withTag(TAG_PACKETS_RECEIVE);
     }
 
     public void update(String interfaceData, long secondInterval) {
       String[] netInfo = interfaceData.trim().split("\\s+");
       long rxBytes = Long.parseLong(netInfo[0]);
+      long rxPackets = Long.parseLong(netInfo[1]);
       long txBytes = Long.parseLong(netInfo[8]);
+      long txPackets = Long.parseLong(netInfo[9]);
       sendRate = (double) (txBytes - lastTxBytes) / secondInterval;
+      sendPacketsRate = (double) (txPackets - lastTxPackets) / secondInterval;
       receiveRate = (double) (rxBytes - lastRxBytes) / secondInterval;
+      receivePacketsRate = (double) (rxPackets - lastRxPackets) / secondInterval;
       lastRxBytes = rxBytes;
+      lastRxPackets = rxPackets;
       lastTxBytes = txBytes;
+      lastTxPackets = txPackets;
     }
 
     public String getName() {
@@ -103,16 +130,34 @@ public class NetMeter {
     public double getReceiveRate() {
       return receiveRate;
     }
+
+    public long getLastRxPackets() {
+      return lastRxPackets;
+    }
+
+    public long getLastTxPackets() {
+      return lastTxPackets;
+    }
+
+    public double getSendPacketsRate() {
+      return sendPacketsRate;
+    }
+
+    public double getReceivePacketsRate() {
+      return receivePacketsRate;
+    }
   }
 
   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.sendPacketsRate = 0;
       interfaceInfo.receiveRate = 0;
+      interfaceInfo.receivePacketsRate = 0;
     }
   }
 
@@ -121,7 +166,9 @@ public class NetMeter {
 
     for (InterfaceInfo interfaceInfo : interfaceInfoMap.values()) {
       measurements.add(new Measurement(interfaceInfo.sendId, msNow, interfaceInfo.sendRate));
+      measurements.add(new Measurement(interfaceInfo.sendPacketId, msNow, interfaceInfo.sendPacketsRate));
       measurements.add(new Measurement(interfaceInfo.receiveId, msNow, interfaceInfo.receiveRate));
+      measurements.add(new Measurement(interfaceInfo.receivePacketId, msNow, interfaceInfo.receivePacketsRate));
     }
   }
 
@@ -129,7 +176,7 @@ public class NetMeter {
    * 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 {
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 257f8d9..f3a97f0 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,9 +26,12 @@ import com.netflix.spectator.api.Measurement;
 import com.netflix.spectator.api.Registry;
 
 /**
- * name=os type=cpu value=10.0
+ * name=os type=cpu statistic=allProcess value = 0
+ * name=os type=cpu statistic=currentProcess 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=sendP value=100
+ * name=os type=net interface=eth0 statistic=receiveP value=100
  */
 public class OsMeter extends AbstractPeriodMeter {
   public static final String OS_NAME = "os";
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 7bd9a87..9bcd23d 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 class ClientEndpointsLogPublisher extends AbstractMeasurementNodeLogPubli
   @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(B)      receive(B)");
 
     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 778a8bb..a9058d8 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.metrics.registry.GlobalRegistry;
 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 @@ public class DefaultLogPublisher implements MetricsInitializer {
     }
 
     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 %-14s %s",
           NetUtils.humanReadableBytes((long) sendRate),
           NetUtils.humanReadableBytes((long) receiveRate),
+          NetUtils.humanReadableBytes((long) sendPacketsRate),
+          NetUtils.humanReadableBytes((long) receivePacketsRate),
           interfaceNode.getName());
     }
     if (tmpSb.length() != 0) {
@@ -161,8 +166,14 @@ public class DefaultLogPublisher implements MetricsInitializer {
 
   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);
+    if (cpuNode == null || cpuNode.getMeasurements().isEmpty()) {
+      return;
+    }
+    double allRate = cpuNode.findChild(CpuMeter.TAG_All.value()).summary();
+    double processRate = cpuNode.findChild(CpuMeter.TAG_CURRENT.value()).summary();
+    if (allRate != 0 || processRate != 0) {
+      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 8edb940..513d981 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 class ServerEndpointsLogPublisher extends AbstractMeasurementNodeLogPubli
   public void print(boolean printDetail) {
     appendLine(sb, "    server.endpoints:");
     appendLine(sb,
-        "      listen                connectCount    disconnectCount rejectByLimit   connections  send         receive");
+        "      listen                connectCount    disconnectCount rejectByLimit   connections  send(B)      receive(B)");
 
     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 bb73bd1..51c02ea 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;
@@ -61,10 +63,10 @@ public class TestOsMeterInitializer {
   }
 
   @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 class TestOsMeterInitializer {
         return list;
       }
     };
+    new MockUp<ManagementFactory>() {
+      @Mock
+      RuntimeMXBean getRuntimeMXBean() {
+        return mxBean;
+      }
+    };
+
     new MockUp<Runtime>() {
       @Mock
       public Runtime getRuntime() {
@@ -83,6 +92,8 @@ public class TestOsMeterInitializer {
       {
         runtime.availableProcessors();
         result = 2;
+        mxBean.getName();
+        result = "6666@desktop111";
       }
     };
     globalRegistry.add(registry);
@@ -94,6 +105,8 @@ public class TestOsMeterInitializer {
     Assert.assertNotNull(osMeter.getNetMeter());
     CpuMeter cpuMeter = osMeter.getCpuMeter();
     NetMeter netMeter = osMeter.getNetMeter();
+    Assert.assertEquals("6666", cpuMeter.getPid());
+    Assert.assertEquals(4L, cpuMeter.getLastProcessTime());
     Assert.assertEquals(2, cpuMeter.getCpuNum());
     Assert.assertEquals(1L, cpuMeter.getLastIdleTime());
     Assert.assertEquals(8L, cpuMeter.getLastTotalTime());
@@ -102,8 +115,13 @@ public class TestOsMeterInitializer {
     InterfaceInfo eth0 = interfaceInfoMap.get("eth0");
     Assert.assertEquals(0L, eth0.getLastRxBytes());
     Assert.assertEquals(0L, eth0.getLastTxBytes());
+    Assert.assertEquals(0L, eth0.getLastTxPackets());
+    Assert.assertEquals(0L, eth0.getLastRxPackets());
+
     Assert.assertEquals(0.0, eth0.getSendRate(), 0.0);
     Assert.assertEquals(0.0, eth0.getReceiveRate(), 0.0);
+    Assert.assertEquals(0.0, eth0.getReceivePacketsRate(), 0.0);
+    Assert.assertEquals(0.0, eth0.getSendPacketsRate(), 0.0);
   }
 
   @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 ba7c8c3..6c7509a 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 @@ public class TestVertxMetersInitializer {
         + "    transport  4\n"
         + "  transport:\n"
         + "    client.endpoints:\n"
-        + "      remote                connectCount    disconnectCount connections     send         receive\n";
+        + "      remote                connectCount    disconnectCount connections     send(B)      receive(B)\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(B)      receive(B)\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 1399cb6..1abc00d 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,70 @@ import mockit.Mocked;
 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(0.0, cpuMeter.getProcessRate(), 0.0);
+    Assert.assertEquals("6666", cpuMeter.getPid());
+    Assert.assertEquals(4L, cpuMeter.getLastProcessTime());
     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");
+    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.refreshCpu();
+    Assert.assertEquals(1.0, cpuMeter.getProcessRate(), 0.0);
     Assert.assertEquals(1.75, cpuMeter.getRate(), 0.0);
     Assert.assertEquals(16, cpuMeter.getLastTotalTime());
+    Assert.assertEquals(8, cpuMeter.getLastProcessTime());
     Assert.assertEquals(2, cpuMeter.getLastIdleTime());
     Assert.assertEquals(2, cpuMeter.getCpuNum());
+    Assert.assertEquals("6666", cpuMeter.getPid());
   }
 
   @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 +110,48 @@ public class TestCpuMeter {
         return runtime;
       }
     };
+    new Expectations() {
+      {
+        runtime.availableProcessors();
+        result = 2;
+        mxBean.getName();
+        result = "6666@desktop111";
+      }
+    };
     CpuMeter cpuMeter = new CpuMeter(id);
+    Assert.assertEquals(0.0, cpuMeter.getProcessRate(), 0.0);
+    Assert.assertEquals("6666", cpuMeter.getPid());
+    Assert.assertEquals(4L, cpuMeter.getLastProcessTime());
     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");
+    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.refreshCpu();
+    Assert.assertEquals(0.0, cpuMeter.getProcessRate(), 0.0);
+    Assert.assertEquals("6666", cpuMeter.getPid());
+    Assert.assertEquals(4L, cpuMeter.getLastProcessTime());
     Assert.assertEquals(0.0, cpuMeter.getRate(), 0.0);
     Assert.assertEquals(8, cpuMeter.getLastTotalTime());
     Assert.assertEquals(1, cpuMeter.getLastIdleTime());
   }
 
   @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 +160,23 @@ public class TestCpuMeter {
         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 8caa14d..9dbc5e9 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
@@ -57,6 +57,8 @@ public class TestNetMeter {
     Assert.assertEquals("eth0", eth0.getName());
     Assert.assertEquals(1L, eth0.getLastRxBytes());
     Assert.assertEquals(1L, eth0.getLastTxBytes());
+    Assert.assertEquals(1L, eth0.getLastRxPackets());
+    Assert.assertEquals(1L, eth0.getLastTxPackets());
     Assert.assertEquals(1, eth0.getReceiveRate(), 0.0);
     Assert.assertEquals(1, eth0.getSendRate(), 0.0);
   }
@@ -85,15 +87,24 @@ public class TestNetMeter {
     InterfaceInfo eth0 = netMap.get("eth0");
     Assert.assertEquals("eth0", eth0.getName());
     Assert.assertEquals(1L, eth0.getLastRxBytes());
+    Assert.assertEquals(1L, eth0.getLastRxPackets());
+    Assert.assertEquals(1L, eth0.getLastTxPackets());
     Assert.assertEquals(1L, eth0.getLastTxBytes());
     Assert.assertEquals(1, eth0.getReceiveRate(), 0.0);
     Assert.assertEquals(1, eth0.getSendRate(), 0.0);
+    Assert.assertEquals(1, eth0.getSendPacketsRate(), 0.0);
+    Assert.assertEquals(1, eth0.getReceivePacketsRate(), 0.0);
+
     InterfaceInfo lo = netMap.get("lo");
     Assert.assertEquals("lo", lo.getName());
     Assert.assertEquals(0L, lo.getLastRxBytes());
+    Assert.assertEquals(0L, lo.getLastRxPackets());
+    Assert.assertEquals(0L, lo.getLastTxPackets());
     Assert.assertEquals(0L, lo.getLastTxBytes());
     Assert.assertEquals(0, lo.getReceiveRate(), 0.0);
+    Assert.assertEquals(0, lo.getReceivePacketsRate(), 0.0);
     Assert.assertEquals(0, lo.getSendRate(), 0.0);
+    Assert.assertEquals(0, lo.getSendPacketsRate(), 0.0);
   }
 
 
@@ -118,13 +129,22 @@ public class TestNetMeter {
     Assert.assertEquals("lo", lo.getName());
     Assert.assertEquals(0L, lo.getLastRxBytes());
     Assert.assertEquals(0L, lo.getLastTxBytes());
+    Assert.assertEquals(0L, lo.getLastRxPackets());
+    Assert.assertEquals(0L, lo.getLastTxPackets());
     Assert.assertEquals(0, lo.getReceiveRate(), 0.0);
+    Assert.assertEquals(0, lo.getReceivePacketsRate(), 0.0);
     Assert.assertEquals(0, lo.getSendRate(), 0.0);
+    Assert.assertEquals(0, lo.getSendPacketsRate(), 0.0);
+
     Assert.assertEquals("eth0", eth0.getName());
-    Assert.assertEquals(0L, eth0.getLastTxBytes());
     Assert.assertEquals(0L, eth0.getLastRxBytes());
+    Assert.assertEquals(0L, eth0.getLastTxBytes());
+    Assert.assertEquals(0L, eth0.getLastRxPackets());
+    Assert.assertEquals(0L, eth0.getLastTxPackets());
     Assert.assertEquals(0, eth0.getReceiveRate(), 0.0);
+    Assert.assertEquals(0, eth0.getReceivePacketsRate(), 0.0);
     Assert.assertEquals(0, eth0.getSendRate(), 0.0);
+    Assert.assertEquals(0, eth0.getSendPacketsRate(), 0.0);
     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");
@@ -134,8 +154,12 @@ public class TestNetMeter {
     Assert.assertEquals("eth0", eth0.getName());
     Assert.assertEquals(1L, eth0.getLastRxBytes());
     Assert.assertEquals(1L, eth0.getLastTxBytes());
+    Assert.assertEquals(1L, eth0.getLastRxPackets());
+    Assert.assertEquals(1L, eth0.getLastTxPackets());
     Assert.assertEquals(1, eth0.getReceiveRate(), 0.0);
+    Assert.assertEquals(1, eth0.getReceivePacketsRate(), 0.0);
     Assert.assertEquals(1, eth0.getSendRate(), 0.0);
+    Assert.assertEquals(1, eth0.getSendPacketsRate(), 0.0);
   }
 
 
@@ -156,10 +180,14 @@ public class TestNetMeter {
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1    1      0     0     0    0    0");
     List<Measurement> measurements = new ArrayList<>();
     netMeter.calcMeasurements(measurements, 0L, 1);
-    Assert.assertEquals(2, measurements.size());
+    Assert.assertEquals(4, measurements.size());
     Measurement send = measurements.get(0);
-    Measurement recv = measurements.get(1);
+    Measurement sendPackets = measurements.get(1);
+    Measurement receive = measurements.get(0);
+    Measurement receivePackets = measurements.get(1);
     Assert.assertEquals(1.0, send.value(), 0.0);
-    Assert.assertEquals(1.0, recv.value(), 0.0);
+    Assert.assertEquals(1.0, sendPackets.value(), 0.0);
+    Assert.assertEquals(1.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 a07f229..79b20a7 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 @@ 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;
@@ -41,9 +43,9 @@ public class TestOsMeter {
   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 class TestOsMeter {
         return list;
       }
     };
+    new MockUp<ManagementFactory>() {
+      @Mock
+      RuntimeMXBean getRuntimeMXBean() {
+        return mxBean;
+      }
+    };
     new MockUp<Runtime>() {
       @Mock
       public Runtime getRuntime() {
@@ -62,19 +70,24 @@ public class TestOsMeter {
       {
         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 81ab22c..95e00db 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,17 +180,31 @@ public class TestDefaultLogPublisher {
     model.getThreadPools().put("test", new ThreadPoolPublishModel());
     Measurement measurement = new Measurement(null, 0L, 1.0);
 
-    MeasurementNode measurementNodeSend = new MeasurementNode("send", new HashMap<>());
     MeasurementNode measurementNodeCpu = new MeasurementNode("cpu", new HashMap<>());
+    MeasurementNode measurementNodeCpuAll = new MeasurementNode("allProcess", new HashMap<>());
+    MeasurementNode measurementNodeCpuProcess = new MeasurementNode("currentProcess", new HashMap<>());
+    MeasurementNode measurementNodeSend = new MeasurementNode("send", 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);
+
+    measurementNodeCpu.getChildren().put("allProcess", measurementNodeCpuAll);
+    measurementNodeCpu.getChildren().put("currentProcess", measurementNodeCpuProcess);
     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("net", measurementNodeNet);
@@ -199,12 +213,7 @@ public class TestDefaultLogPublisher {
     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 +226,12 @@ public class TestDefaultLogPublisher {
         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 +241,11 @@ public class TestDefaultLogPublisher {
     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"