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