Browse Source

Improvement to the System Info API

pull/8311/head
Andrii Shvaika 3 years ago
parent
commit
ad6f007161
  1. 27
      application/src/main/java/org/thingsboard/server/service/system/DefaultSystemInfoService.java
  2. 5
      application/src/test/java/org/thingsboard/server/controller/BaseHomePageApiTest.java
  3. 9
      common/cluster-api/src/main/proto/queue.proto
  4. 18
      common/data/src/main/java/org/thingsboard/server/common/data/SystemInfoData.java
  5. 17
      common/queue/src/main/java/org/thingsboard/server/queue/discovery/DefaultTbServiceInfoProvider.java
  6. 46
      common/util/src/main/java/org/thingsboard/common/util/SystemUtil.java

27
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<Partiti
private void saveCurrentMonolithSystemInfo() {
long ts = System.currentTimeMillis();
List<TsKvEntry> 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<Partiti
SystemInfoData infoData = new SystemInfoData();
infoData.setServiceId(serviceInfo.getServiceId());
infoData.setServiceType(serviceTypes.size() > 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;
}

5
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<String> 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<EntityData> 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);

9
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;
}
/**

18
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;
}

17
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();

46
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<Long> getMemoryUsage() {
public static Optional<Integer> 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<Long> getFreeMemory() {
public static Optional<Integer> 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<Double> 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<Double> getTotalCpuUsage() {
public static Optional<Integer> 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<Long> getFreeDiscSpace() {
public static Optional<Integer> 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();
}
}

Loading…
Cancel
Save