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


The following commit(s) were added to refs/heads/master by this push:
     new ee7fc0ecc [SCB-2813]use java api to calculate cpu usage (#4088)
ee7fc0ecc is described below

commit ee7fc0ecc6ba6e03b95d3bb88c25a9e6facb7aae
Author: liubao68 <[email protected]>
AuthorDate: Mon Dec 4 17:26:16 2023 +0800

    [SCB-2813]use java api to calculate cpu usage (#4088)
---
 .../metrics/meter/LatencyScopeMeter.java           |  61 -------
 .../metrics/core/OsMetersInitializer.java          |  19 --
 .../metrics/core/meter/os/CpuMeter.java            |  75 --------
 .../metrics/core/meter/os/NetMeter.java            |  15 +-
 .../servicecomb/metrics/core/meter/os/OsMeter.java |  14 +-
 .../metrics/core/meter/os/SystemMeter.java         |  73 ++++++++
 .../core/meter/os/cpu/AbstractCpuUsage.java        |  53 ------
 .../metrics/core/meter/os/cpu/CpuUtils.java        | 183 -------------------
 .../metrics/core/meter/os/cpu/OsCpuUsage.java      |  49 -----
 .../metrics/core/meter/os/cpu/ProcessCpuUsage.java |  52 ------
 .../metrics/core/publish/DefaultLogPublisher.java  |  18 +-
 .../metrics/core/TestOsMeterInitializer.java       |  71 +++----
 .../metrics/core/meter/os/TestCpuMeter.java        | 203 ---------------------
 .../metrics/core/meter/os/TestNetMeter.java        |   3 +
 .../os/{TestOsMeter.java => TestSystemMeter.java}  |  60 ++----
 .../core/publish/TestDefaultLogPublisher.java      |   8 +-
 16 files changed, 153 insertions(+), 804 deletions(-)

diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyScopeMeter.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyScopeMeter.java
deleted file mode 100644
index 506375d09..000000000
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyScopeMeter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.foundation.metrics.meter;
-
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.LongAdder;
-
-import io.micrometer.core.instrument.Measurement;
-import io.micrometer.core.instrument.Meter.Id;
-import io.micrometer.core.instrument.Statistic;
-import io.micrometer.core.instrument.Tag;
-
-public class LatencyScopeMeter {
-  private final Id scopeId;
-
-  private final LongAdder times = new LongAdder();
-
-  private long lastTimes = 0L;
-
-  private final long nanoMin;
-
-  private final long nanoMax;
-
-  public LatencyScopeMeter(Id latencyDistributionId, LatencyScopeConfig 
config) {
-    nanoMin = TimeUnit.MILLISECONDS.toNanos(config.getMsMin());
-    nanoMax = TimeUnit.MILLISECONDS.toNanos(config.getMsMax());
-    scopeId = latencyDistributionId.withTag(Tag.of("scope",
-        String.format("[%d,%s)", config.getMsMin(), config.getMsMax() == 
Long.MAX_VALUE ? "" : config.getMsMax())));
-  }
-
-  public boolean update(long nanoLatency) {
-    if (nanoMin <= nanoLatency && nanoMax > nanoLatency) {
-      times.increment();
-      return true;
-    }
-
-    return false;
-  }
-
-  public Measurement createMeasurement(long msNow) {
-    long currentTimes = times.longValue();
-    long deltaTimes = currentTimes - lastTimes;
-    this.lastTimes = currentTimes;
-
-    return new Measurement(() -> deltaTimes, Statistic.VALUE);
-  }
-}
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java
index 2c5b0e28a..f5486f780 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java
@@ -16,39 +16,20 @@
  */
 package org.apache.servicecomb.metrics.core;
 
-import org.apache.commons.lang3.SystemUtils;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
 import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
 import org.apache.servicecomb.metrics.core.meter.os.OsMeter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.eventbus.EventBus;
 
 import io.micrometer.core.instrument.MeterRegistry;
 
 public class OsMetersInitializer implements MetricsInitializer, PeriodMeter {
-  private static final Logger LOGGER = 
LoggerFactory.getLogger(OsMetersInitializer.class);
-
   private OsMeter osMeter;
 
-  private boolean isOsLinux = SystemUtils.IS_OS_LINUX;
-
-  @VisibleForTesting
-  OsMetersInitializer setOsLinux(boolean osLinux) {
-    isOsLinux = osLinux;
-    return this;
-  }
-
   @Override
   public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
-    if (!isOsLinux) {
-      LOGGER.info("only support linux os to collect cpu and net info");
-      return;
-    }
-
     osMeter = new OsMeter(meterRegistry);
   }
 
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
deleted file mode 100644
index 388a24d61..000000000
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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;
-
-import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
-import org.apache.servicecomb.metrics.core.meter.os.cpu.OsCpuUsage;
-import org.apache.servicecomb.metrics.core.meter.os.cpu.ProcessCpuUsage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import io.micrometer.core.instrument.Gauge;
-import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tags;
-
-public class CpuMeter implements PeriodMeter {
-  private static final Logger LOGGER = LoggerFactory.getLogger(CpuMeter.class);
-
-  // read from /proc/stat
-  private final OsCpuUsage allCpuUsage;
-
-  // read from /proc/self/stat /proc/uptime
-  private final ProcessCpuUsage processCpuUsage;
-
-  public CpuMeter(MeterRegistry meterRegistry, String name) {
-    allCpuUsage = new OsCpuUsage();
-    processCpuUsage = new ProcessCpuUsage();
-
-    Gauge.builder(name, allCpuUsage::getUsage).tags(Tags.of(OsMeter.OS_TYPE, 
OsMeter.OS_TYPE_ALL_CPU))
-        .register(meterRegistry);
-
-    Gauge.builder(name, 
processCpuUsage::getUsage).tags(Tags.of(OsMeter.OS_TYPE, 
OsMeter.OS_TYPE_PROCESS_CPU))
-        .register(meterRegistry);
-
-    // read initial data, and cannot calculate usage, set to 0 first.
-    poll(0, 0);
-    allCpuUsage.setUsage(0);
-    processCpuUsage.setUsage(0);
-  }
-
-  @Override
-  public void poll(long msNow, long secondInterval) {
-    try {
-      allCpuUsage.update();
-      processCpuUsage.update();
-    } catch (Throwable e) {
-      LOGGER.error("Failed to update cpu usage", e);
-    }
-  }
-
-  @VisibleForTesting
-  public OsCpuUsage getAllCpuUsage() {
-    return allCpuUsage;
-  }
-
-  @VisibleForTesting
-  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 9cdf72318..882fb6bf5 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
@@ -24,16 +24,18 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.SystemUtils;
 import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
 import org.apache.servicecomb.metrics.core.meter.os.net.InterfaceUsage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.VisibleForTesting;
+
 import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.Tag;
 import io.micrometer.core.instrument.Tags;
 
-
 public class NetMeter implements PeriodMeter {
   private static final Logger LOGGER = LoggerFactory.getLogger(NetMeter.class);
 
@@ -51,6 +53,8 @@ public class NetMeter implements PeriodMeter {
 
   private final Map<String, InterfaceUsage> interfaceUsageMap = new 
ConcurrentHashMap<>();
 
+  private boolean isOsLinux = SystemUtils.IS_OS_LINUX;
+
   protected final MeterRegistry meterRegistry;
 
   protected final String name;
@@ -64,9 +68,16 @@ public class NetMeter implements PeriodMeter {
     poll(0, 0);
   }
 
+  @VisibleForTesting
+  public void setOsLinux(boolean osLinux) {
+    isOsLinux = osLinux;
+  }
+
   @Override
   public void poll(long msNow, long secondInterval) {
-    refreshNet(secondInterval);
+    if (isOsLinux) {
+      refreshNet(secondInterval);
+    }
   }
 
   /*
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 832773012..9b74fd199 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
@@ -36,30 +36,26 @@ public class OsMeter implements PeriodMeter {
 
   public static final String OS_TYPE = "type";
 
-  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";
 
-  private final CpuMeter cpuMeter;
+  private final SystemMeter systemMeter;
 
   private final NetMeter netMeter;
 
   public OsMeter(MeterRegistry meterRegistry) {
-    cpuMeter = new CpuMeter(meterRegistry, OS_NAME);
+    systemMeter = new SystemMeter(meterRegistry, OS_NAME);
     netMeter = new NetMeter(meterRegistry, OS_NAME, Tags.of(OS_TYPE, 
OS_TYPE_NET));
   }
 
   @Override
   public void poll(long msNow, long secondInterval) {
-    cpuMeter.poll(msNow, secondInterval);
+    systemMeter.poll(msNow, secondInterval);
     netMeter.poll(msNow, secondInterval);
   }
 
   @VisibleForTesting
-  public CpuMeter getCpuMeter() {
-    return cpuMeter;
+  public SystemMeter getCpuMeter() {
+    return systemMeter;
   }
 
   @VisibleForTesting
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/SystemMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/SystemMeter.java
new file mode 100644
index 000000000..2b9ce7d47
--- /dev/null
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/SystemMeter.java
@@ -0,0 +1,73 @@
+/*
+ * 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;
+
+import java.lang.management.ManagementFactory;
+
+import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.sun.management.OperatingSystemMXBean;
+
+import io.micrometer.core.instrument.Gauge;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
+
+public class SystemMeter implements PeriodMeter {
+  public static final String SYSTEM_LOAD_AVERAGE = "sla";
+
+  public static final String CPU_USAGE = "cpu";
+
+  public static final String PROCESS_CPU_USAGE = "processCpu";
+
+  public static final String MEMORY_USAGE = "memory";
+
+  private OperatingSystemMXBean osBean = 
ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
+
+  public SystemMeter(MeterRegistry meterRegistry, String name) {
+    Gauge.builder(name, () -> getOsBean().getSystemLoadAverage())
+        .tags(Tags.of(OsMeter.OS_TYPE, SYSTEM_LOAD_AVERAGE))
+        .register(meterRegistry);
+
+    Gauge.builder(name, () -> getOsBean().getCpuLoad())
+        .tags(Tags.of(OsMeter.OS_TYPE, CPU_USAGE))
+        .register(meterRegistry);
+
+    Gauge.builder(name, () -> getOsBean().getProcessCpuLoad())
+        .tags(Tags.of(OsMeter.OS_TYPE, PROCESS_CPU_USAGE))
+        .register(meterRegistry);
+
+    Gauge.builder(name, () -> (getOsBean().getTotalMemorySize() - 
getOsBean().getFreeMemorySize())
+            / (double) getOsBean().getTotalMemorySize())
+        .tags(Tags.of(OsMeter.OS_TYPE, MEMORY_USAGE))
+        .register(meterRegistry);
+  }
+
+  @VisibleForTesting
+  public void setOsBean(OperatingSystemMXBean mock) {
+    this.osBean = mock;
+  }
+
+  private OperatingSystemMXBean getOsBean() {
+    return this.osBean;
+  }
+
+  @Override
+  public void poll(long msNow, long secondInterval) {
+
+  }
+}
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
deleted file mode 100644
index fb2eaa45b..000000000
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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;
-
-
-public abstract class AbstractCpuUsage {
-  protected double usage;
-
-  protected int cpuCount = Runtime.getRuntime().availableProcessors();
-
-  static class Period {
-    double last;
-
-    double period;
-
-    void update(double current) {
-      period = current - last;
-      last = current;
-    }
-  }
-
-  public double getUsage() {
-    return usage;
-  }
-
-  public void setUsage(double usage) {
-    this.usage = usage;
-  }
-
-  protected void updateUsage(double periodBusy, double periodTotal, boolean 
irixMode) {
-    usage = periodTotal == 0 ? 0 : periodBusy / periodTotal;
-    if (usage > 1) {
-      usage = 1;
-    }
-    if (irixMode) {
-      usage *= cpuCount;
-    }
-  }
-}
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/CpuUtils.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/CpuUtils.java
deleted file mode 100644
index 75eb83d9d..000000000
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/CpuUtils.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * 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.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.io.Files;
-
-public final class CpuUtils {
-  private static final Logger LOGGER = LoggerFactory.getLogger(CpuUtils.class);
-
-  public static final File PROC_STAT = new File("/proc/stat");
-
-  public static final File UPTIME = new File("/proc/uptime");
-
-  public static final File SELF_PROCESS = new File("/proc/self/stat");
-
-  private CpuUtils() {
-  }
-
-  public static String[] readAndSplitFirstLine(File file) throws IOException {
-    return Files.asCharSource(file, 
StandardCharsets.UTF_8).readFirstLine().trim().split("\\s+");
-  }
-
-  public static double summary(String[] stats, int start, int len) {
-    double total = 0;
-    for (int idx = start; idx < start + len; idx++) {
-      total += Double.parseDouble(stats[idx]);
-    }
-    return total;
-  }
-
-  public static double readProcSelfBusy() throws IOException {
-    String[] stats = readAndSplitFirstLine(SELF_PROCESS);
-    return summary(stats, 13, 2);
-  }
-
-  public static double readProcStatTotal() throws IOException {
-    String[] stats = readAndSplitFirstLine(PROC_STAT);
-    return summary(stats, 1, 8);
-  }
-
-  public static double readUptimeTotal() throws IOException {
-    String[] uptime = readAndSplitFirstLine(UPTIME);
-    return Double.parseDouble(uptime[0]);
-  }
-
-  private static boolean isBetween(long x, long lower, long upper) {
-    return lower <= x && x <= upper;
-  }
-
-  /**
-   *  unit of /proc/uptime is seconds
-   *  unit of /proc/self/stat is jiffies
-   *  hence, we should calculate userHZ to get process cpu rate
-   *
-   * @return userHZ
-   */
-  public static int calcHertz() {
-    double up1, up2, seconds;
-    double jiffies;
-
-    for (; ; ) {
-      try {
-        up1 = readUptimeTotal();
-        jiffies = readProcStatTotal();
-        up2 = readUptimeTotal();
-      } catch (Throwable e) {
-        LOGGER.error("Failed to calc hertz, should never happened, try 
again.", e);
-        continue;
-      }
-
-      if (0 == (long) ((up2 - up1) * 1000.0 / up1)) {
-        break;
-      }
-    }
-
-    seconds = (up1 + up2) / 2;
-    long hz = Math.round(jiffies / seconds / 
Runtime.getRuntime().availableProcessors());
-    /* S/390 (sometimes) */
-    if (isBetween(hz, 9, 11)) {
-      return 10;
-    }
-
-    /* user-mode Linux */
-    if (isBetween(hz, 18, 22)) {
-      return 20;
-    }
-
-    /* ia64 emulator */
-    if (isBetween(hz, 30, 34)) {
-      return 32;
-    }
-
-    if (isBetween(hz, 48, 52)) {
-      return 50;
-    }
-
-    if (isBetween(hz, 58, 61)) {
-      return 60;
-    }
-
-    /* StrongARM /Shark */
-    if (isBetween(hz, 62, 65)) {
-      return 64;
-    }
-
-    /* normal Linux */
-    if (isBetween(hz, 95, 105)) {
-      return 100;
-    }
-
-    /* MIPS, ARM */
-    if (isBetween(hz, 124, 132)) {
-      return 128;
-    }
-
-    /* normal << 1 */
-    if (isBetween(hz, 195, 204)) {
-      return 200;
-    }
-
-    if (isBetween(hz, 247, 252)) {
-      return 250;
-    }
-
-    if (isBetween(hz, 253, 260)) {
-      return 256;
-    }
-
-    /* normal << 2 */
-    if (isBetween(hz, 393, 408)) {
-      return 400;
-    }
-
-    /* SMP WinNT */
-    if (isBetween(hz, 410, 600)) {
-      return 500;
-    }
-
-    /* normal << 3 */
-    if (isBetween(hz, 790, 808)) {
-      return 800;
-    }
-
-    /* ARM */
-    if (isBetween(hz, 990, 1010)) {
-      return 1000;
-    }
-
-    /* Alpha, ia64 */
-    if (isBetween(hz, 1015, 1035)) {
-      return 1024;
-    }
-
-    /* Alpha */
-    if (isBetween(hz, 1180, 1220)) {
-      return 1200;
-    }
-
-    LOGGER.warn("Unknown HZ value! ({}) Assume {}.\n", hz, 100);
-    return 100;
-  }
-}
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
deleted file mode 100644
index 09ac5bc7b..000000000
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.IOException;
-
-/*
- * unit : 1 jiffies
- * 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                
9      10
- * total = user + nice + system + idle + iowait + irq + softirq + stealstolen
- * busy = total - idle
- */
-public class OsCpuUsage extends AbstractCpuUsage {
-
-  private final Period total = new Period();
-
-  private final Period idle = new Period();
-
-  public OsCpuUsage() {
-  }
-
-  public void update() throws IOException {
-    String[] stats = CpuUtils.readAndSplitFirstLine(CpuUtils.PROC_STAT);
-    long currentIdle = Long.parseLong(stats[4]);
-    double totalCpu = CpuUtils.summary(stats, 1, 8);
-    idle.update(currentIdle);
-    total.update(totalCpu);
-    updateUsage(total.period - idle.period, total.period, false);
-  }
-}
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
deleted file mode 100644
index 1e0f55e68..000000000
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.IOException;
-
-/*
- * unit : 1 jiffies
- * 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
- * CMD: /proc/uptime
- * total = uptime[0] * cpuNum * userHZ
- *
- */
-public class ProcessCpuUsage extends AbstractCpuUsage {
-
-  private final Period busy = new Period();
-
-  private final Period total = new Period();
-
-  private final int userHZ = CpuUtils.calcHertz();
-
-  public ProcessCpuUsage() {
-  }
-
-  public void update() throws IOException {
-    double processBusy = CpuUtils.readProcSelfBusy();
-    double uptime = CpuUtils.readUptimeTotal();
-    busy.update(processBusy);
-    total.update(uptime * userHZ * cpuCount);
-    updateUsage(busy.period, total.period, true);
-  }
-}
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 feaee2e22..99b1acd20 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
@@ -35,6 +35,7 @@ import org.apache.servicecomb.foundation.vertx.VertxUtils;
 import org.apache.servicecomb.metrics.core.VertxMetersInitializer;
 import org.apache.servicecomb.metrics.core.meter.os.NetMeter;
 import org.apache.servicecomb.metrics.core.meter.os.OsMeter;
+import org.apache.servicecomb.metrics.core.meter.os.SystemMeter;
 import org.apache.servicecomb.metrics.core.publish.model.DefaultPublishModel;
 import 
org.apache.servicecomb.metrics.core.publish.model.ThreadPoolPublishModel;
 import 
org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerf;
@@ -201,17 +202,14 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
   }
 
   private void printCpuLog(StringBuilder sb, MeasurementNode osNode) {
-    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();
+    MeasurementNode cpuNode = osNode.findChild(SystemMeter.CPU_USAGE);
+    MeasurementNode processNode = 
osNode.findChild(SystemMeter.PROCESS_CPU_USAGE);
+    MeasurementNode memoryNode = osNode.findChild(SystemMeter.MEMORY_USAGE);
+    MeasurementNode slaNode = 
osNode.findChild(SystemMeter.SYSTEM_LOAD_AVERAGE);
     appendLine(sb, "  cpu:");
-    appendLine(sb, "    all usage: %.2f%%    all idle: %.2f%%    process: 
%.2f%%", allRate * 100,
-        (1 - allRate) * 100, processRate * 100);
+    appendLine(sb, "    all usage: %.2f%%    process usage: %.2f%%    sla: 
%.2f    memory usage: %.2f%%",
+        cpuNode.summary() * 100, processNode.summary() * 100,
+        slaNode.summary(), memoryNode.summary() * 100);
   }
 
   protected void printThreadPoolMetrics(DefaultPublishModel model, 
StringBuilder sb) {
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 53bf98f9a..f83f41693 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,28 +17,28 @@
 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;
 import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.servicecomb.metrics.core.meter.os.CpuMeter;
+import 
org.apache.servicecomb.foundation.metrics.publish.MeasurementGroupConfig;
+import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree;
 import org.apache.servicecomb.metrics.core.meter.os.NetMeter;
 import org.apache.servicecomb.metrics.core.meter.os.OsMeter;
-import org.apache.servicecomb.metrics.core.meter.os.cpu.CpuUtils;
+import org.apache.servicecomb.metrics.core.meter.os.SystemMeter;
 import org.apache.servicecomb.metrics.core.meter.os.net.InterfaceUsage;
 import org.junit.Test;
 import org.junit.jupiter.api.Assertions;
+import org.mockito.Mockito;
 
 import com.google.common.eventbus.EventBus;
 import com.google.common.io.CharSource;
+import com.sun.management.OperatingSystemMXBean;
 
 import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
-import mockit.Expectations;
 import mockit.Mock;
 import mockit.MockUp;
 import mockit.Mocked;
@@ -50,7 +50,7 @@ public class TestOsMeterInitializer {
   EventBus eventBus;
 
   @Test
-  public void init(@Mocked Runtime runtime, @Mocked RuntimeMXBean mxBean) {
+  public void init() {
     List<String> list = new ArrayList<>();
     list.add("13  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");
@@ -68,45 +68,30 @@ public class TestOsMeterInitializer {
         return list;
       }
     };
-    new MockUp<CpuUtils>() {
-      @Mock
-      public int calcHertz() {
-        return 100;
-      }
-    };
-    new MockUp<ManagementFactory>() {
-      @Mock
-      RuntimeMXBean getRuntimeMXBean() {
-        return mxBean;
-      }
-    };
-
-    new MockUp<Runtime>() {
-      @Mock
-      public Runtime getRuntime() {
-        return runtime;
-      }
-    };
-    new Expectations() {
-      {
-        runtime.availableProcessors();
-        result = 2;
-      }
-    };
 
     OsMetersInitializer osMetersInitializer = new OsMetersInitializer();
-    osMetersInitializer.setOsLinux(true);
     osMetersInitializer.init(registry, eventBus, null);
-    osMetersInitializer.poll(System.currentTimeMillis(), 1000);
+
     OsMeter osMeter = osMetersInitializer.getOsMeter();
-    Assertions.assertNotNull(osMeter);
-    Assertions.assertNotNull(osMeter.getCpuMeter());
-    Assertions.assertNotNull(osMeter.getNetMeter());
-    CpuMeter cpuMeter = osMeter.getCpuMeter();
+    SystemMeter systemMeter = osMeter.getCpuMeter();
+    OperatingSystemMXBean osBean = Mockito.mock(OperatingSystemMXBean.class);
+    Mockito.when(osBean.getCpuLoad()).thenReturn(3.2D);
+    Mockito.when(osBean.getProcessCpuLoad()).thenReturn(1.2D);
+    systemMeter.setOsBean(osBean);
     NetMeter netMeter = osMeter.getNetMeter();
-    Assertions.assertEquals(0.0, cpuMeter.getProcessCpuUsage().getUsage(), 
0.0);
+    netMeter.setOsLinux(true);
+
+    osMetersInitializer.poll(System.currentTimeMillis(), 1000);
 
-    Assertions.assertEquals(0.0, cpuMeter.getAllCpuUsage().getUsage(), 0.0);
+    MeasurementTree tree = new MeasurementTree();
+    MeasurementGroupConfig group = new MeasurementGroupConfig();
+    group.addGroup(OsMeter.OS_NAME, OsMeter.OS_TYPE);
+    tree.from(registry.getMeters().iterator(), group);
+
+    Assertions.assertEquals(1.2D,
+        tree.findChild(OsMeter.OS_NAME, 
SystemMeter.PROCESS_CPU_USAGE).summary(), 0.0);
+    Assertions.assertEquals(3.2D,
+        tree.findChild(OsMeter.OS_NAME, SystemMeter.CPU_USAGE).summary(), 0.0);
 
     Map<String, InterfaceUsage> interfaceInfoMap = 
netMeter.getInterfaceUsageMap();
     Assertions.assertEquals(1, interfaceInfoMap.size());
@@ -130,12 +115,4 @@ public class TestOsMeterInitializer {
     Assertions.assertEquals(0, eth0.getPacketsSend().getRate(), 0.0);
     Assertions.assertEquals(9, eth0.getPacketsSend().getIndex());
   }
-
-  @Test
-  public void initFail() {
-    OsMetersInitializer osMetersInitializer = new OsMetersInitializer();
-    osMetersInitializer.setOsLinux(false);
-    osMetersInitializer.init(null, eventBus, null);
-    Assertions.assertNull(osMetersInitializer.getOsMeter());
-  }
 }
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
deleted file mode 100644
index 872dbe1fe..000000000
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestCpuMeter.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * 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;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.management.ManagementFactory;
-import java.lang.management.RuntimeMXBean;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.servicecomb.metrics.core.meter.os.cpu.CpuUtils;
-import org.junit.Test;
-import org.junit.jupiter.api.Assertions;
-
-import com.google.common.io.CharSource;
-import com.google.common.io.Files;
-
-import io.micrometer.core.instrument.Measurement;
-import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
-import mockit.Expectations;
-import mockit.Mock;
-import mockit.MockUp;
-import mockit.Mocked;
-
-public class TestCpuMeter {
-
-  @Test
-  public void testRefreshCpuSuccess(@Mocked Runtime runtime, @Mocked 
RuntimeMXBean mxBean,
-      @Mocked CharSource charSource) throws IOException {
-    new MockUp<Files>() {
-      @Mock
-      public CharSource asCharSource(File file, Charset encoding) {
-        return charSource;
-      }
-    };
-    new MockUp<ManagementFactory>() {
-      @Mock
-      RuntimeMXBean getRuntimeMXBean() {
-        return mxBean;
-      }
-    };
-    new MockUp<CpuUtils>() {
-      @Mock
-      public int calcHertz() {
-        return 4;
-      }
-    };
-    new MockUp<Runtime>() {
-      @Mock
-      public Runtime getRuntime() {
-        return runtime;
-      }
-    };
-    new Expectations() {
-      {
-        runtime.availableProcessors();
-        result = 2;
-        charSource.readFirstLine();
-        result = "1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1";
-      }
-    };
-    MeterRegistry meterRegistry = new SimpleMeterRegistry();
-    CpuMeter cpuMeter = new CpuMeter(meterRegistry, "cpu");
-    Assertions.assertEquals(0.0, cpuMeter.getAllCpuUsage().getUsage(), 0.0);
-    Assertions.assertEquals(0.0, cpuMeter.getProcessCpuUsage().getUsage(), 
0.0);
-
-    new Expectations() {
-      {
-        charSource.readFirstLine();
-        result = "2 2 2 2 2 2 2 2 2 0 0 2 2 2 2 2 2 2 2 2 2";
-      }
-    };
-    cpuMeter.poll(0, 0);
-
-    Assertions.assertEquals(0.875, cpuMeter.getAllCpuUsage().getUsage(), 0.0);
-    Assertions.assertEquals(0.5, cpuMeter.getProcessCpuUsage().getUsage(), 
0.0);
-  }
-
-  @Test
-  public void testRefreshError(@Mocked Runtime runtime, @Mocked RuntimeMXBean 
mxBean,
-      @Mocked CharSource charSource) throws IOException {
-
-    new MockUp<Files>() {
-      @Mock
-      public CharSource asCharSource(File file, Charset encoding) {
-        return charSource;
-      }
-    };
-    new MockUp<CpuUtils>() {
-      @Mock
-      public int calcHertz() {
-        return 4;
-      }
-    };
-    new MockUp<ManagementFactory>() {
-      @Mock
-      RuntimeMXBean getRuntimeMXBean() {
-        return mxBean;
-      }
-    };
-    new MockUp<Runtime>() {
-      @Mock
-      public Runtime getRuntime() {
-        return runtime;
-      }
-    };
-    new Expectations() {
-      {
-        runtime.availableProcessors();
-        result = 2;
-        charSource.readFirstLine();
-        result = "1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1";
-      }
-    };
-    MeterRegistry meterRegistry = new SimpleMeterRegistry();
-    CpuMeter cpuMeter = new CpuMeter(meterRegistry, "cpu");
-    Assertions.assertEquals(0.0, cpuMeter.getAllCpuUsage().getUsage(), 0.0);
-    Assertions.assertEquals(0.0, cpuMeter.getProcessCpuUsage().getUsage(), 
0.0);
-    new Expectations() {
-      {
-        charSource.readFirstLine();
-        result = "1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1";
-      }
-    };
-    cpuMeter.poll(0, 0);
-
-    Assertions.assertEquals(0.0, cpuMeter.getAllCpuUsage().getUsage(), 0.0);
-    Assertions.assertEquals(0.0, cpuMeter.getProcessCpuUsage().getUsage(), 
0.0);
-  }
-
-  @Test
-  public void testCalcMeasurements(@Mocked Runtime runtime, @Mocked 
RuntimeMXBean mxBean,
-      @Mocked CharSource charSource) throws IOException {
-    new MockUp<Files>() {
-      @Mock
-      public CharSource asCharSource(File file, Charset encoding) {
-        return charSource;
-      }
-    };
-    new MockUp<CpuUtils>() {
-      @Mock
-      public int calcHertz() {
-        return 4;
-      }
-    };
-    new MockUp<ManagementFactory>() {
-      @Mock
-      RuntimeMXBean getRuntimeMXBean() {
-        return mxBean;
-      }
-    };
-    new MockUp<Runtime>() {
-      @Mock
-      public Runtime getRuntime() {
-        return runtime;
-      }
-    };
-    new Expectations() {
-      {
-        runtime.availableProcessors();
-        result = 2;
-        charSource.readFirstLine();
-        result = "1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1";
-      }
-    };
-
-    MeterRegistry meterRegistry = new SimpleMeterRegistry();
-    CpuMeter cpuMeter = new CpuMeter(meterRegistry, "cpu");
-
-    new Expectations() {
-      {
-        charSource.readFirstLine();
-        result = "2 2 2 2 2 2 2 2 2 0 0 2 2 2 2 2 2 2 2 2 2";
-      }
-    };
-
-    cpuMeter.poll(System.currentTimeMillis(), 1000);
-
-    List<Measurement> measurements = new ArrayList<>();
-    meterRegistry.getMeters().forEach(meter -> 
meter.measure().forEach(measurement -> measurements.add(measurement)));
-    Measurement measurement = measurements.get(0);
-    Assertions.assertEquals(0.5, measurement.getValue(), 0.0);
-    measurement = measurements.get(1);
-    Assertions.assertEquals(0.875, measurement.getValue(), 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 33856505a..c81aaba8d 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
@@ -96,6 +96,7 @@ public class TestNetMeter {
     };
     MeterRegistry meterRegistry = new SimpleMeterRegistry();
     NetMeter netMeter = new NetMeter(meterRegistry, "net", Tags.empty());
+    netMeter.setOsLinux(true);
     netMeter.poll(0, 0);
     Map<String, InterfaceUsage> netMap = netMeter.getInterfaceUsageMap();
     Assertions.assertEquals(1, netMap.size());
@@ -165,6 +166,7 @@ public class TestNetMeter {
     };
     MeterRegistry meterRegistry = new SimpleMeterRegistry();
     NetMeter netMeter = new NetMeter(meterRegistry, "net", Tags.empty());
+    netMeter.setOsLinux(true);
     netMeter.poll(0, 1);
     Map<String, InterfaceUsage> netMap = netMeter.getInterfaceUsageMap();
     Assertions.assertEquals(2, netMap.size());
@@ -251,6 +253,7 @@ public class TestNetMeter {
     };
     MeterRegistry meterRegistry = new SimpleMeterRegistry();
     NetMeter netMeter = new NetMeter(meterRegistry, "net", Tags.empty());
+    netMeter.setOsLinux(true);
     list.remove(2);
     list.add("eth0: 3 1    0    0    0     0          0          1         3 1 
   1      0     0     0    0    0");
     netMeter.poll(0, 1);
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/TestSystemMeter.java
similarity index 74%
rename from 
metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestOsMeter.java
rename to 
metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestSystemMeter.java
index ebbf6c399..2e6bec05b 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/TestSystemMeter.java
@@ -16,11 +16,8 @@
  */
 package org.apache.servicecomb.metrics.core.meter.os;
 
-
 import java.io.File;
 import java.io.IOException;
-import java.lang.management.ManagementFactory;
-import java.lang.management.RuntimeMXBean;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
@@ -28,24 +25,23 @@ import java.util.List;
 import org.apache.commons.io.FileUtils;
 import 
org.apache.servicecomb.foundation.metrics.publish.MeasurementGroupConfig;
 import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree;
-import org.apache.servicecomb.metrics.core.meter.os.cpu.CpuUtils;
 import org.junit.Test;
 import org.junit.jupiter.api.Assertions;
+import org.mockito.Mockito;
 
 import com.google.common.io.CharSource;
 import com.google.common.io.Files;
+import com.sun.management.OperatingSystemMXBean;
 
 import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
-import mockit.Expectations;
 import mockit.Mock;
 import mockit.MockUp;
 import mockit.Mocked;
 
-public class TestOsMeter {
+public class TestSystemMeter {
   @Test
-  public void testCalcMeasurement(@Mocked Runtime runtime, @Mocked 
RuntimeMXBean mxBean,
-      @Mocked CharSource charSource) throws IOException {
+  public void testCalcMeasurement(@Mocked CharSource charSource) throws 
IOException {
     MeterRegistry meterRegistry = new SimpleMeterRegistry();
 
     List<String> list = new ArrayList<>();
@@ -58,49 +54,31 @@ public class TestOsMeter {
         return list;
       }
     };
-    new MockUp<CpuUtils>() {
-      @Mock
-      public int calcHertz() {
-        return 4;
-      }
-    };
+
     new MockUp<Files>() {
       @Mock
       public CharSource asCharSource(File file, Charset encoding) {
         return charSource;
       }
     };
-    new MockUp<ManagementFactory>() {
-      @Mock
-      RuntimeMXBean getRuntimeMXBean() {
-        return mxBean;
-      }
-    };
-    new MockUp<Runtime>() {
-      @Mock
-      public Runtime getRuntime() {
-        return runtime;
-      }
-    };
-    new Expectations() {
-      {
-        runtime.availableProcessors();
-        result = 2;
-        charSource.readFirstLine();
-        result = "1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1";
-      }
-    };
+
     OsMeter osMeter = new OsMeter(meterRegistry);
     list.clear();
     list.add("useless");
     list.add("useless");
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
-    new Expectations() {
-      {
-        charSource.readFirstLine();
-        result = "2 2 2 2 2 2 2 2 2 0 0 2 2 2 2 2 2 2 2 2 2";
-      }
-    };
+
+    SystemMeter systemMeter = osMeter.getCpuMeter();
+    OperatingSystemMXBean osBean = Mockito.mock(OperatingSystemMXBean.class);
+    Mockito.when(osBean.getSystemLoadAverage()).thenReturn(0.775);
+    Mockito.when(osBean.getCpuLoad()).thenReturn(0.875);
+    Mockito.when(osBean.getProcessCpuLoad()).thenReturn(0.5);
+    Mockito.when(osBean.getTotalMemorySize()).thenReturn(1000000000L);
+    Mockito.when(osBean.getFreeMemorySize()).thenReturn(300000000L);
+    systemMeter.setOsBean(osBean);
+    NetMeter netMeter = osMeter.getNetMeter();
+    netMeter.setOsLinux(true);
+
     osMeter.poll(0, 1);
 
     MeasurementTree tree = new MeasurementTree();
@@ -109,6 +87,8 @@ public class TestOsMeter {
 
     Assertions.assertEquals(0.875, tree.findChild("os", 
"cpu").getMeasurements().get(0).getValue(), 0.0);
     Assertions.assertEquals(0.5, tree.findChild("os", 
"processCpu").getMeasurements().get(0).getValue(), 0.0);
+    Assertions.assertEquals(0.7, tree.findChild("os", 
"memory").getMeasurements().get(0).getValue(), 0.0);
+    Assertions.assertEquals(0.775, tree.findChild("os", 
"sla").getMeasurements().get(0).getValue(), 0.0);
     Assertions.assertEquals(1.0, tree.findChild("os", 
"net").getMeasurements().get(0).getValue(), 0.0);
     Assertions.assertEquals(1.0, tree.findChild("os", 
"net").getMeasurements().get(1).getValue(), 0.0);
     Assertions.assertEquals(1.0, tree.findChild("os", 
"net").getMeasurements().get(2).getValue(), 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 bc1fd4df6..aa9270f4e 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
@@ -198,6 +198,8 @@ public class TestDefaultLogPublisher {
 
       MeasurementNode measurementNodeCpuAll = new 
MeasurementNode("allProcess", id, new HashMap<>());
       MeasurementNode measurementNodeCpuProcess = new 
MeasurementNode("currentProcess", id, new HashMap<>());
+      MeasurementNode measurementNodeSla = new MeasurementNode("sla", id, new 
HashMap<>());
+      MeasurementNode measurementNodeMemory = new MeasurementNode("memory", 
id, new HashMap<>());
       MeasurementNode measurementNodeSend = new MeasurementNode("send", id, 
new HashMap<>());
       MeasurementNode measurementNodeSendPacket = new 
MeasurementNode("sendPackets", id, new HashMap<>());
       MeasurementNode measurementNodeRecv = new MeasurementNode("receive", id, 
new HashMap<>());
@@ -210,6 +212,8 @@ public class TestDefaultLogPublisher {
       measurementNodeRecv.getMeasurements().add(measurement);
       measurementNodeCpuAll.getMeasurements().add(measurement);
       measurementNodeCpuProcess.getMeasurements().add(measurement);
+      measurementNodeSla.getMeasurements().add(measurement);
+      measurementNodeMemory.getMeasurements().add(measurement);
       measurementNodeRecvPacket.getMeasurements().add(measurement);
       measurementNodeSendPacket.getMeasurements().add(measurement);
 
@@ -221,6 +225,8 @@ public class TestDefaultLogPublisher {
       measurementNodeNet.getChildren().put("eth0", measurementNodeEth0);
       measurementNodeOs.getChildren().put("cpu", measurementNodeCpuAll);
       measurementNodeOs.getChildren().put("processCpu", 
measurementNodeCpuProcess);
+      measurementNodeOs.getChildren().put("sla", measurementNodeSla);
+      measurementNodeOs.getChildren().put("memory", measurementNodeMemory);
       measurementNodeOs.getChildren().put("net", measurementNodeNet);
 
       measurementNodeOs.getMeasurements().add(measurement);
@@ -251,7 +257,7 @@ public class TestDefaultLogPublisher {
       Assertions.assertEquals("""
               os:
                 cpu:
-                  all usage: 100.00%    all idle: 0.00%    process: 100.00%
+                  all usage: 100.00%    process usage: 100.00%    sla: 1.00    
memory usage: 100.00%
                 net:
                   send(Bps)    recv(Bps)    send(pps)    recv(pps)    interface
                   1            1            1            1            eth0

Reply via email to