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