From 8a059ced0b5104d53959a751704570d9b7e572e0 Mon Sep 17 00:00:00 2001 From: Rsl1122 <24460436+Rsl1122@users.noreply.github.com> Date: Mon, 13 Jan 2020 16:21:03 +0200 Subject: [PATCH] Added SystemUsage class This class is collection of some methods in TPSCounter that were refactored out of it. --- .../gathering/timed/BukkitTPSCounter.java | 3 +- .../gathering/timed/BungeeTPSCounter.java | 3 +- .../plan/gathering/SystemUsage.java | 81 +++++++++++++++++++ .../plan/gathering/timed/TPSCounter.java | 28 +------ .../gathering/timed/NukkitTPSCounter.java | 3 +- .../gathering/timed/SpongeTPSCounter.java | 3 +- .../gathering/timed/VelocityTPSCounter.java | 3 +- 7 files changed, 94 insertions(+), 30 deletions(-) create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/gathering/SystemUsage.java diff --git a/Plan/bukkit/src/main/java/com/djrapitops/plan/gathering/timed/BukkitTPSCounter.java b/Plan/bukkit/src/main/java/com/djrapitops/plan/gathering/timed/BukkitTPSCounter.java index cab47b560..54093ddd0 100644 --- a/Plan/bukkit/src/main/java/com/djrapitops/plan/gathering/timed/BukkitTPSCounter.java +++ b/Plan/bukkit/src/main/java/com/djrapitops/plan/gathering/timed/BukkitTPSCounter.java @@ -17,6 +17,7 @@ package com.djrapitops.plan.gathering.timed; import com.djrapitops.plan.Plan; +import com.djrapitops.plan.gathering.SystemUsage; import com.djrapitops.plan.gathering.domain.TPS; import com.djrapitops.plan.gathering.domain.builders.TPSBuilder; import com.djrapitops.plan.identification.ServerInfo; @@ -75,7 +76,7 @@ public class BukkitTPSCounter extends TPSCounter { */ private TPS calculateTPS(long diff, long now) { double averageCPUUsage = getCPUUsage(); - long usedMemory = getUsedMemory(); + long usedMemory = SystemUsage.getUsedMemory(); long freeDiskSpace = getFreeDiskSpace(); int playersOnline = serverProperties.getOnlinePlayers(); diff --git a/Plan/bungeecord/src/main/java/com/djrapitops/plan/gathering/timed/BungeeTPSCounter.java b/Plan/bungeecord/src/main/java/com/djrapitops/plan/gathering/timed/BungeeTPSCounter.java index 53f774e31..747e7ed11 100644 --- a/Plan/bungeecord/src/main/java/com/djrapitops/plan/gathering/timed/BungeeTPSCounter.java +++ b/Plan/bungeecord/src/main/java/com/djrapitops/plan/gathering/timed/BungeeTPSCounter.java @@ -16,6 +16,7 @@ */ package com.djrapitops.plan.gathering.timed; +import com.djrapitops.plan.gathering.SystemUsage; import com.djrapitops.plan.gathering.domain.TPS; import com.djrapitops.plan.gathering.domain.builders.TPSBuilder; import com.djrapitops.plan.identification.ServerInfo; @@ -51,7 +52,7 @@ public class BungeeTPSCounter extends TPSCounter { .date(now) .playersOnline(onlineCount) .usedCPU(getCPUUsage()) - .usedMemory(getUsedMemory()) + .usedMemory(SystemUsage.getUsedMemory()) .entities(-1) .chunksLoaded(-1) .freeDiskSpace(getFreeDiskSpace()) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/gathering/SystemUsage.java b/Plan/common/src/main/java/com/djrapitops/plan/gathering/SystemUsage.java new file mode 100644 index 000000000..17c7a2cf5 --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/gathering/SystemUsage.java @@ -0,0 +1,81 @@ +/* + * This file is part of Player Analytics (Plan). + * + * Plan is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License v3 as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Plan is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Plan. If not, see . + */ +package com.djrapitops.plan.gathering; + +import java.io.File; +import java.lang.management.ManagementFactory; +import java.lang.management.OperatingSystemMXBean; + +/** + * Utility class for obtaining System usage statistics. + * + * @author Rsl1122 + */ +public class SystemUsage { + + private SystemUsage() { + /* Static method class */ + } + + /** + * Check how much memory (in Mb) is in use. + * + * @return used memory (megabytes) at the time of fetching + */ + public static long getUsedMemory() { + Runtime runtime = Runtime.getRuntime(); + long totalMemory = runtime.totalMemory(); + return (totalMemory - runtime.freeMemory()) / 1000000L; + } + + /** + * Check how active the system is (CPU) or if not available, using system load average. + *

+ * - On some OSes CPU usage information is not available, and system load average is used instead. + * - On some OSes system load average is not available. + * + * @return 0.0 to 1.0 if CPU, or system load average, or -1 if nothing is available. + */ + public static double getAverageSystemLoad() { + double averageUsage; + + OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean(); + if (osBean instanceof com.sun.management.OperatingSystemMXBean) { + com.sun.management.OperatingSystemMXBean nativeOsBean = (com.sun.management.OperatingSystemMXBean) osBean; + averageUsage = nativeOsBean.getSystemCpuLoad(); + } else { + int availableProcessors = osBean.getAvailableProcessors(); + averageUsage = osBean.getSystemLoadAverage() / availableProcessors; + } + if (averageUsage < 0) { + averageUsage = -1; // If unavailable, getSystemLoadAverage() returns -1 + } + return averageUsage; + } + + /** + * Check how much disk space is available on the current partition. + * + * @return free disk space (megabytes) on the partition JVM working directory is in. + * @throws SecurityException if permission is required to see disk space. + */ + public static long getFreeDiskSpace() { + File file = new File(new File("").getAbsolutePath()); + return file.getFreeSpace() / 1000000L; + } + +} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/gathering/timed/TPSCounter.java b/Plan/common/src/main/java/com/djrapitops/plan/gathering/timed/TPSCounter.java index 354a998d6..91fc690af 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/gathering/timed/TPSCounter.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/gathering/timed/TPSCounter.java @@ -16,6 +16,7 @@ */ package com.djrapitops.plan.gathering.timed; +import com.djrapitops.plan.gathering.SystemUsage; import com.djrapitops.plan.gathering.domain.TPS; import com.djrapitops.plan.identification.ServerInfo; import com.djrapitops.plan.storage.database.DBSystem; @@ -25,9 +26,6 @@ import com.djrapitops.plugin.logging.console.PluginLogger; import com.djrapitops.plugin.logging.error.ErrorHandler; import com.djrapitops.plugin.task.AbsRunnable; -import java.io.File; -import java.lang.management.ManagementFactory; -import java.lang.management.OperatingSystemMXBean; import java.util.ArrayList; import java.util.List; @@ -90,33 +88,13 @@ public abstract class TPSCounter extends AbsRunnable { return latestPlayersOnline; } - protected long getUsedMemory() { - Runtime runtime = Runtime.getRuntime(); - long totalMemory = runtime.totalMemory(); - return (totalMemory - runtime.freeMemory()) / 1000000; - } - protected double getCPUUsage() { - double averageCPUUsage; - - OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean(); - if (osBean instanceof com.sun.management.OperatingSystemMXBean) { - com.sun.management.OperatingSystemMXBean nativeOsBean = (com.sun.management.OperatingSystemMXBean) osBean; - averageCPUUsage = nativeOsBean.getSystemCpuLoad(); - } else { - int availableProcessors = osBean.getAvailableProcessors(); - averageCPUUsage = osBean.getSystemLoadAverage() / availableProcessors; - } - if (averageCPUUsage < 0) { // If unavailable, getSystemLoadAverage() returns -1 - averageCPUUsage = -1; - } - return averageCPUUsage * 100.0; + return SystemUsage.getAverageSystemLoad() * 100.0; } protected long getFreeDiskSpace() { try { - File file = new File(new File("").getAbsolutePath()); - return file.getFreeSpace() / 1000000L; + return SystemUsage.getFreeDiskSpace(); } catch (SecurityException noPermission) { if (!diskErrored) { errorHandler.log(L.WARN, this.getClass(), noPermission); diff --git a/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/timed/NukkitTPSCounter.java b/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/timed/NukkitTPSCounter.java index 0d46e6e07..18c0354d9 100644 --- a/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/timed/NukkitTPSCounter.java +++ b/Plan/nukkit/src/main/java/com/djrapitops/plan/gathering/timed/NukkitTPSCounter.java @@ -18,6 +18,7 @@ package com.djrapitops.plan.gathering.timed; import cn.nukkit.level.Level; import com.djrapitops.plan.PlanNukkit; +import com.djrapitops.plan.gathering.SystemUsage; import com.djrapitops.plan.gathering.domain.TPS; import com.djrapitops.plan.gathering.domain.builders.TPSBuilder; import com.djrapitops.plan.identification.ServerInfo; @@ -75,7 +76,7 @@ public class NukkitTPSCounter extends TPSCounter { */ private TPS calculateTPS(long diff, long now) { double averageCPUUsage = getCPUUsage(); - long usedMemory = getUsedMemory(); + long usedMemory = SystemUsage.getUsedMemory(); long freeDiskSpace = getFreeDiskSpace(); int playersOnline = serverProperties.getOnlinePlayers(); diff --git a/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/timed/SpongeTPSCounter.java b/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/timed/SpongeTPSCounter.java index 8aac317d8..1543452f5 100644 --- a/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/timed/SpongeTPSCounter.java +++ b/Plan/sponge/src/main/java/com/djrapitops/plan/gathering/timed/SpongeTPSCounter.java @@ -17,6 +17,7 @@ package com.djrapitops.plan.gathering.timed; import com.djrapitops.plan.PlanSponge; +import com.djrapitops.plan.gathering.SystemUsage; import com.djrapitops.plan.gathering.domain.TPS; import com.djrapitops.plan.gathering.domain.builders.TPSBuilder; import com.djrapitops.plan.identification.ServerInfo; @@ -74,7 +75,7 @@ public class SpongeTPSCounter extends TPSCounter { private TPS calculateTPS(long now) { double averageCPUUsage = getCPUUsage(); - long usedMemory = getUsedMemory(); + long usedMemory = SystemUsage.getUsedMemory(); double tps = plugin.getGame().getServer().getTicksPerSecond(); int playersOnline = serverProperties.getOnlinePlayers(); diff --git a/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/timed/VelocityTPSCounter.java b/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/timed/VelocityTPSCounter.java index 0b514a768..d8ece9cf2 100644 --- a/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/timed/VelocityTPSCounter.java +++ b/Plan/velocity/src/main/java/com/djrapitops/plan/gathering/timed/VelocityTPSCounter.java @@ -16,6 +16,7 @@ */ package com.djrapitops.plan.gathering.timed; +import com.djrapitops.plan.gathering.SystemUsage; import com.djrapitops.plan.gathering.domain.TPS; import com.djrapitops.plan.gathering.domain.builders.TPSBuilder; import com.djrapitops.plan.identification.ServerInfo; @@ -51,7 +52,7 @@ public class VelocityTPSCounter extends TPSCounter { .date(now) .playersOnline(onlineCount) .usedCPU(getCPUUsage()) - .usedMemory(getUsedMemory()) + .usedMemory(SystemUsage.getUsedMemory()) .entities(-1) .chunksLoaded(-1) .freeDiskSpace(getFreeDiskSpace())