From ad6f00716183ace30467fe368bf3388f272ee8fe Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Mon, 3 Apr 2023 18:46:50 +0300 Subject: [PATCH] Improvement to the System Info API --- .../system/DefaultSystemInfoService.java | 27 +++++------ .../controller/BaseHomePageApiTest.java | 5 +- common/cluster-api/src/main/proto/queue.proto | 9 ++-- .../server/common/data/SystemInfoData.java | 18 ++++---- .../DefaultTbServiceInfoProvider.java | 17 +++---- .../thingsboard/common/util/SystemUtil.java | 46 +++++++++---------- 6 files changed, 62 insertions(+), 60 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/service/system/DefaultSystemInfoService.java b/application/src/main/java/org/thingsboard/server/service/system/DefaultSystemInfoService.java index 8c4ca82783..caf3abefa0 100644 --- a/application/src/main/java/org/thingsboard/server/service/system/DefaultSystemInfoService.java +++ b/application/src/main/java/org/thingsboard/server/service/system/DefaultSystemInfoService.java @@ -30,7 +30,6 @@ import org.thingsboard.server.common.data.SystemInfo; import org.thingsboard.server.common.data.SystemInfoData; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.kv.BasicTsKvEntry; -import org.thingsboard.server.common.data.kv.DoubleDataEntry; import org.thingsboard.server.common.data.kv.JsonDataEntry; import org.thingsboard.server.common.data.kv.LongDataEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; @@ -58,10 +57,9 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import static org.thingsboard.common.util.SystemUtil.getCpuUsage; -import static org.thingsboard.common.util.SystemUtil.getFreeDiscSpace; -import static org.thingsboard.common.util.SystemUtil.getFreeMemory; import static org.thingsboard.common.util.SystemUtil.getMemoryUsage; -import static org.thingsboard.common.util.SystemUtil.getTotalCpuUsage; +import static org.thingsboard.common.util.SystemUtil.getDiscSpaceUsage; +import static org.thingsboard.common.util.SystemUtil.getCpuCount; import static org.thingsboard.common.util.SystemUtil.getTotalDiscSpace; import static org.thingsboard.common.util.SystemUtil.getTotalMemory; @@ -162,12 +160,13 @@ public class DefaultSystemInfoService extends TbApplicationEventListener tsList = new ArrayList<>(); - getMemoryUsage().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("memoryUsage", v)))); + + getCpuUsage().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("cpuUsage", (long) v)))); + getMemoryUsage().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("memoryUsage", (long) v)))); + getDiscSpaceUsage().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("discUsage", (long) v)))); + + getCpuCount().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("cpuCount", (long) v)))); getTotalMemory().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("totalMemory", v)))); - getFreeMemory().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("freeMemory", v)))); - getCpuUsage().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new DoubleDataEntry("cpuUsage", v)))); - getTotalCpuUsage().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new DoubleDataEntry("totalCpuUsage", v)))); - getFreeDiscSpace().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("freeDiscSpace", v)))); getTotalDiscSpace().ifPresent(v -> tsList.add(new BasicTsKvEntry(ts, new LongDataEntry("totalDiscSpace", v)))); doSave(tsList); @@ -193,13 +192,15 @@ public class DefaultSystemInfoService extends TbApplicationEventListener 1 ? "MONOLITH" : serviceTypes.get(0)); + + infoData.setCpuUsage(serviceInfo.getSystemInfo().getCpuUsage()); infoData.setMemoryUsage(serviceInfo.getSystemInfo().getMemoryUsage()); + infoData.setDiscUsage(serviceInfo.getSystemInfo().getDiskUsage()); + + infoData.setCpuCount(serviceInfo.getSystemInfo().getCpuCount()); infoData.setTotalMemory(serviceInfo.getSystemInfo().getTotalMemory()); - infoData.setFreeMemory(serviceInfo.getSystemInfo().getFreeMemory()); - infoData.setCpuUsage(serviceInfo.getSystemInfo().getCpuUsage()); - infoData.setTotalCpuUsage(serviceInfo.getSystemInfo().getTotalCpuUsage()); - infoData.setFreeDiscSpace(serviceInfo.getSystemInfo().getFreeDiscSpace()); infoData.setTotalDiscSpace(serviceInfo.getSystemInfo().getTotalDiscSpace()); + return infoData; } diff --git a/application/src/test/java/org/thingsboard/server/controller/BaseHomePageApiTest.java b/application/src/test/java/org/thingsboard/server/controller/BaseHomePageApiTest.java index 14fdfc4fac..f5904ecb82 100644 --- a/application/src/test/java/org/thingsboard/server/controller/BaseHomePageApiTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/BaseHomePageApiTest.java @@ -238,15 +238,16 @@ public abstract class BaseHomePageApiTest extends AbstractControllerTest { Assert.assertEquals(1, pageData.getData().size()); Assert.assertEquals(apiUsageState.getId(), pageData.getData().get(0).getEntityId()); + List metrics = List.of("cpuUsage", "memoryUsage", "discUsage", "cpuCount", "totalMemory", "totalDiscSpace"); update = getWsClient().subscribeTsUpdate( - List.of("memoryUsage", "totalMemory", "freeMemory", "cpuUsage", "totalCpuUsage", "freeDiscSpace", "totalDiscSpace"), + metrics, now, TimeUnit.HOURS.toMillis(1)); Assert.assertEquals(1, update.getCmdId()); List listData = update.getUpdate(); Assert.assertNotNull(listData); Assert.assertEquals(1, listData.size()); Assert.assertEquals(apiUsageState.getId(), listData.get(0).getEntityId()); - Assert.assertEquals(7, listData.get(0).getTimeseries().size()); + Assert.assertEquals(metrics.size(), listData.get(0).getTimeseries().size()); for (TsValue[] tsv : listData.get(0).getTimeseries().values()) { Assert.assertTrue(tsv.length > 0); diff --git a/common/cluster-api/src/main/proto/queue.proto b/common/cluster-api/src/main/proto/queue.proto index 4907d0f015..10d844ee78 100644 --- a/common/cluster-api/src/main/proto/queue.proto +++ b/common/cluster-api/src/main/proto/queue.proto @@ -31,13 +31,12 @@ message ServiceInfo { } message SystemInfoProto { - double cpuUsage = 1; - double totalCpuUsage = 2; + int64 cpuUsage = 1; + int64 cpuCount = 2; int64 memoryUsage = 3; int64 totalMemory = 4; - int64 freeMemory = 5; - int64 freeDiscSpace = 6; - int64 totalDiscSpace = 7; + int64 diskUsage = 5; + int64 totalDiscSpace = 6; } /** diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/SystemInfoData.java b/common/data/src/main/java/org/thingsboard/server/common/data/SystemInfoData.java index e4510e0f48..97845b789b 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/SystemInfoData.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/SystemInfoData.java @@ -17,6 +17,7 @@ package org.thingsboard.server.common.data; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.thingsboard.server.common.data.kv.LongDataEntry; import java.util.Map; @@ -26,18 +27,17 @@ public class SystemInfoData { private String serviceId; @ApiModelProperty(position = 2, value = "Service type.") private String serviceType; - @ApiModelProperty(position = 3, value = "CPU usage.") - private Double cpuUsage; + @ApiModelProperty(position = 3, value = "CPU usage, in percent.") + private Long cpuUsage; @ApiModelProperty(position = 4, value = "Total CPU usage.") - private Double totalCpuUsage; - @ApiModelProperty(position = 5, value = "Memory usage in bytes.") + private Long cpuCount; + @ApiModelProperty(position = 5, value = "Memory usage, in percent.") private Long memoryUsage; @ApiModelProperty(position = 6, value = "Total memory in bytes.") private Long totalMemory; - @ApiModelProperty(position = 6, value = "Free memory in bytes.") - private Long freeMemory; - @ApiModelProperty(position = 7, value = "Free disc space in bytes.") - private Long freeDiscSpace; - @ApiModelProperty(position = 7, value = "Total disc space in bytes.") + @ApiModelProperty(position = 7, value = "Disk usage, in percent.") + private Long discUsage; + @ApiModelProperty(position = 8, value = "Total disc space in bytes.") private Long totalDiscSpace; + } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/DefaultTbServiceInfoProvider.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/DefaultTbServiceInfoProvider.java index 47e3af6a24..c48064a6b1 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/DefaultTbServiceInfoProvider.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/DefaultTbServiceInfoProvider.java @@ -38,12 +38,13 @@ import java.util.List; import java.util.stream.Collectors; import static org.thingsboard.common.util.SystemUtil.getCpuUsage; -import static org.thingsboard.common.util.SystemUtil.getFreeDiscSpace; -import static org.thingsboard.common.util.SystemUtil.getFreeMemory; import static org.thingsboard.common.util.SystemUtil.getMemoryUsage; -import static org.thingsboard.common.util.SystemUtil.getTotalCpuUsage; -import static org.thingsboard.common.util.SystemUtil.getTotalDiscSpace; +import static org.thingsboard.common.util.SystemUtil.getDiscSpaceUsage; + +import static org.thingsboard.common.util.SystemUtil.getCpuCount; import static org.thingsboard.common.util.SystemUtil.getTotalMemory; +import static org.thingsboard.common.util.SystemUtil.getTotalDiscSpace; + @Component @Slf4j @@ -118,12 +119,12 @@ public class DefaultTbServiceInfoProvider implements TbServiceInfoProvider { private TransportProtos.SystemInfoProto getCurrentSystemInfoProto() { TransportProtos.SystemInfoProto.Builder builder = TransportProtos.SystemInfoProto.newBuilder(); + getCpuUsage().ifPresent(builder::setCpuUsage); getMemoryUsage().ifPresent(builder::setMemoryUsage); + getDiscSpaceUsage().ifPresent(builder::setDiskUsage); + + getCpuCount().ifPresent(builder::setCpuCount); getTotalMemory().ifPresent(builder::setTotalMemory); - getFreeMemory().ifPresent(builder::setFreeMemory); - getCpuUsage().ifPresent(builder::setCpuUsage); - getTotalCpuUsage().ifPresent(builder::setTotalCpuUsage); - getFreeDiscSpace().ifPresent(builder::setFreeDiscSpace); getTotalDiscSpace().ifPresent(builder::setTotalDiscSpace); return builder.build(); diff --git a/common/util/src/main/java/org/thingsboard/common/util/SystemUtil.java b/common/util/src/main/java/org/thingsboard/common/util/SystemUtil.java index 686cfb28f2..b05ac87ef7 100644 --- a/common/util/src/main/java/org/thingsboard/common/util/SystemUtil.java +++ b/common/util/src/main/java/org/thingsboard/common/util/SystemUtil.java @@ -17,10 +17,13 @@ package org.thingsboard.common.util; import lombok.extern.slf4j.Slf4j; import oshi.SystemInfo; +import oshi.hardware.GlobalMemory; import oshi.hardware.HardwareAbstractionLayer; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.nio.file.FileStore; import java.nio.file.Files; import java.nio.file.Paths; @@ -32,14 +35,15 @@ public class SystemUtil { private static final HardwareAbstractionLayer HARDWARE; static { - SystemInfo si = new SystemInfo(); - HARDWARE = si.getHardware(); + HARDWARE = new SystemInfo().getHardware(); } - public static Optional getMemoryUsage() { + public static Optional getMemoryUsage() { try { - MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); - return Optional.of(memoryMXBean.getHeapMemoryUsage().getUsed()); + GlobalMemory memory = HARDWARE.getMemory(); + long total = memory.getTotal(); + long available = memory.getAvailable(); + return Optional.of(toPercent(total - available, total)); } catch (Exception e) { log.debug("Failed to get memory usage!!!", e); } @@ -55,37 +59,30 @@ public class SystemUtil { return Optional.empty(); } - public static Optional getFreeMemory() { + public static Optional getCpuUsage() { try { - return Optional.of(HARDWARE.getMemory().getAvailable()); - } catch (Exception e) { - log.debug("Failed to get free memory!!!", e); - } - return Optional.empty(); - } - - public static Optional getCpuUsage() { - try { - return Optional.of(prepare(HARDWARE.getProcessor().getSystemLoadAverage())); + return Optional.of((int) (HARDWARE.getProcessor().getSystemCpuLoad() * 100.0)); } catch (Exception e) { log.debug("Failed to get cpu usage!!!", e); } return Optional.empty(); } - public static Optional getTotalCpuUsage() { + public static Optional getCpuCount() { try { - return Optional.of(prepare(HARDWARE.getProcessor().getSystemCpuLoad() * 100)); + return Optional.of(HARDWARE.getProcessor().getLogicalProcessorCount()); } catch (Exception e) { - log.debug("Failed to get total cpu usage!!!", e); + log.debug("Failed to get total cpu count!!!", e); } return Optional.empty(); } - public static Optional getFreeDiscSpace() { + public static Optional getDiscSpaceUsage() { try { FileStore store = Files.getFileStore(Paths.get("/")); - return Optional.of(store.getUsableSpace()); + long total = store.getTotalSpace(); + long available = store.getUsableSpace(); + return Optional.of(toPercent(total - available, total)); } catch (Exception e) { log.debug("Failed to get free disc space!!!", e); } @@ -102,7 +99,10 @@ public class SystemUtil { return Optional.empty(); } - private static Double prepare(Double d) { - return (int) (d * 100) / 100.0; + private static int toPercent(long used, long total) { + BigDecimal u = new BigDecimal(used); + BigDecimal t = new BigDecimal(total); + BigDecimal i = new BigDecimal(100); + return u.multiply(i).divide(t, RoundingMode.HALF_UP).intValue(); } }