package tech.powerjob.server.web.response; import lombok.Data; import lombok.NoArgsConstructor; import tech.powerjob.common.model.SystemMetrics; import tech.powerjob.common.utils.CommonUtils; import tech.powerjob.server.common.module.WorkerInfo; import java.text.DecimalFormat; /** * Worker机器状态 * * @author tjq * @since 2020/4/14 */ @Data @NoArgsConstructor public class WorkerStatusVO { private String address; private String cpuLoad; private String memoryLoad; private String diskLoad; private String protocol; private String tag; private String lastActiveTime; private Integer lightTaskTrackerNum; private Integer heavyTaskTrackerNum; private long lastOverloadTime; private boolean overloading; /** * 1 -> 健康,绿色,2 -> 一般,橙色,3 -> 糟糕,红色,9999 -> 非在线机器 */ private int status; /** * 12.3%(4 cores) */ private static final String CPU_FORMAT = "%s / %s cores"; /** * 27.7%(2.9/8.0 GB) */ private static final String OTHER_FORMAT = "%s%%(%s / %s GB)"; private static final DecimalFormat df = new DecimalFormat("#.#"); private static final double THRESHOLD = 0.8; public WorkerStatusVO(WorkerInfo workerInfo) { SystemMetrics systemMetrics = workerInfo.getSystemMetrics(); this.status = 1; this.address = workerInfo.getAddress(); this.cpuLoad = String.format(CPU_FORMAT, df.format(systemMetrics.getCpuLoad()), systemMetrics.getCpuProcessors()); if (systemMetrics.getCpuLoad() > systemMetrics.getCpuProcessors() * THRESHOLD) { this.status ++; } String menL = df.format(systemMetrics.getJvmMemoryUsage() * 100); String menUsed = df.format(systemMetrics.getJvmUsedMemory()); String menMax = df.format(systemMetrics.getJvmMaxMemory()); this.memoryLoad = String.format(OTHER_FORMAT, menL, menUsed, menMax); if (systemMetrics.getJvmMemoryUsage() > THRESHOLD) { this.status ++; } String diskL = df.format(systemMetrics.getDiskUsage() * 100); String diskUsed = df.format(systemMetrics.getDiskUsed()); String diskMax = df.format(systemMetrics.getDiskTotal()); this.diskLoad = String.format(OTHER_FORMAT, diskL, diskUsed, diskMax); if (systemMetrics.getDiskUsage() > THRESHOLD) { this.status ++; } if (workerInfo.overload()){ // 超载的情况直接置为 3 this.status = 3; } if (workerInfo.timeout()) { this.status = 9999; } this.protocol = workerInfo.getProtocol(); this.tag = CommonUtils.formatString(workerInfo.getTag()); this.lastActiveTime = CommonUtils.formatTime(workerInfo.getLastActiveTime()); this.lightTaskTrackerNum = workerInfo.getLightTaskTrackerNum(); this.heavyTaskTrackerNum = workerInfo.getHeavyTaskTrackerNum(); this.lastOverloadTime = workerInfo.getLastOverloadTime(); this.overloading = workerInfo.isOverloading(); } }