[Octopus] modify project to SpringBoot version

This commit is contained in:
zeaslity
2023-06-14 11:21:31 +08:00
parent 6d569b2d3d
commit 282e70d942
64 changed files with 485 additions and 189 deletions

View File

@@ -0,0 +1,34 @@
package io.wdd.rpc.agent;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class AgentOperationMessage {
/**
* 执行Agent Operation操作的类型
*/
private AgentOperationType opType;
/**
* 需要执行的目标时间,
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime operationTime;
/**
* 期望升级到的目标版本
*/
private String updateVersion;
}

View File

@@ -0,0 +1,18 @@
package io.wdd.rpc.agent;
public enum AgentOperationType {
// 上报版本信息
VERSION,
// 上报核心信息
INFO,
REBOOT,
UPDATE,
//关键操作,关闭Agent 只能通过此种方式完成
SHUTDOWN
}

View File

@@ -3,11 +3,9 @@ package io.wdd.rpc.agent;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.wdd.common.beans.agent.AgentOperationMessage;
import io.wdd.common.beans.agent.AgentOperationType;
import io.wdd.common.beans.rabbitmq.OctopusMessage;
import io.wdd.common.beans.rabbitmq.OctopusMessageType;
import io.wdd.common.utils.TimeUtils;
import io.wdd.rpc.message.OctopusMessage;
import io.wdd.rpc.message.OctopusMessageType;
import io.wdd.rpc.message.handler.AsyncWaitOMResult;
import io.wdd.rpc.message.handler.OMReplayContend;
import io.wdd.rpc.message.sender.OMessageToAgentSender;

View File

@@ -2,7 +2,7 @@ package io.wdd.rpc.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.wdd.common.beans.response.R;
import io.wdd.common.response.R;
import io.wdd.rpc.agent.OctopusAgentService;
import io.wdd.server.beans.vo.ServerInfoVO;
import org.springframework.web.bind.annotation.GetMapping;

View File

@@ -3,7 +3,7 @@ package io.wdd.rpc.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.wdd.common.beans.response.R;
import io.wdd.common.response.R;
import io.wdd.rpc.execute.result.BuildStreamReader;
import io.wdd.rpc.execute.service.AsyncExecutionService;
import io.wdd.rpc.execute.service.SyncExecutionService;

View File

@@ -4,7 +4,7 @@ package io.wdd.rpc.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.wdd.common.beans.response.R;
import io.wdd.common.response.R;
import io.wdd.rpc.scheduler.beans.ScriptSchedulerVO;
import io.wdd.rpc.scheduler.service.QuartzSchedulerService;
import org.quartz.JobDetail;

View File

@@ -3,7 +3,7 @@ package io.wdd.rpc.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.wdd.common.beans.response.R;
import io.wdd.common.response.R;
import io.wdd.rpc.init.ServerCacheAgentStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -0,0 +1,76 @@
package io.wdd.rpc.execute;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.wdd.common.utils.TimeUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.time.LocalDateTime;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class ExecutionMessage {
/**
* 2023年2月22日
* 是否需要返回 命令行的处理调用结果
* 通过 MQ返回
*/
@JsonProperty(defaultValue = "false")
boolean needResultReplay;
/**
* 2023年2月22日
* 是否是长时间持续执行任务
*/
@JsonProperty(defaultValue = "false")
boolean durationTask;
/**
* 用于区分 ExecutionMessage的类型
* 直接执行预定函数,则为 Nacos配置中的 方法名称,例如 AgentUpdate AgentReboot
*/
private String type;
/**
* 只有一行的命令行
*/
private List<String> singleLineCommand;
/**
* add in 2023-1-17
* 页面定时脚本任务 需要传递完整的命令列表
*/
private List<List<String>> multiLineCommand;
/**
* 词条执行命令的返回结果在Redis中的ResultKey
*/
private String resultKey;
/**
* 生成 Command结果的 resultKey
*
* @param topicName
* @return
*/
public static String GetResultKey(String topicName) {
return topicName + "-Execution:" + TimeUtils.currentTimeStringFullSplit();
}
/**
* 延迟执行任务执行的Key为未来的生成这个和Key
*
* @param topicName
* @param futureExecutionTime
* @return
*/
public static String GetFutureResultKey(String topicName, LocalDateTime futureExecutionTime) {
return topicName + "-Execution:" + TimeUtils.localDateTimeString(futureExecutionTime);
}
}

View File

@@ -1,6 +1,6 @@
package io.wdd.rpc.execute.service;
import io.wdd.common.beans.rabbitmq.OctopusMessage;
import io.wdd.rpc.message.OctopusMessage;
import java.util.HashMap;
import java.util.List;

View File

@@ -2,11 +2,11 @@ package io.wdd.rpc.execute.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.wdd.common.beans.executor.ExecutionMessage;
import io.wdd.common.beans.rabbitmq.OctopusMessage;
import io.wdd.common.beans.rabbitmq.OctopusMessageType;
import io.wdd.common.utils.TimeUtils;
import io.wdd.rpc.execute.ExecutionMessage;
import io.wdd.rpc.execute.config.ExecutionLog;
import io.wdd.rpc.message.OctopusMessage;
import io.wdd.rpc.message.OctopusMessageType;
import io.wdd.rpc.message.sender.OMessageToAgentSender;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

View File

@@ -9,7 +9,6 @@ import io.wdd.server.service.ExecutionLogService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;

View File

@@ -1,7 +1,7 @@
package io.wdd.rpc.execute.service;
import io.wdd.common.beans.rabbitmq.OctopusMessage;
import io.wdd.common.beans.rabbitmq.OctopusMessageType;
import io.wdd.rpc.message.OctopusMessage;
import io.wdd.rpc.message.OctopusMessageType;
import io.wdd.rpc.message.handler.AsyncWaitOMResult;
import io.wdd.rpc.message.handler.OMReplayContend;
import lombok.extern.slf4j.Slf4j;

View File

@@ -3,11 +3,11 @@ package io.wdd.rpc.init;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.rabbitmq.client.Channel;
import io.wdd.common.beans.rabbitmq.OctopusMessage;
import io.wdd.common.beans.rabbitmq.OctopusMessageType;
import io.wdd.common.beans.status.AgentStatus;
import io.wdd.common.handler.MyRuntimeException;
import io.wdd.rpc.message.OctopusMessage;
import io.wdd.rpc.message.OctopusMessageType;
import io.wdd.rpc.message.sender.OMessageToAgentSender;
import io.wdd.rpc.status.AgentStatus;
import io.wdd.server.beans.vo.ServerInfoVO;
import io.wdd.server.utils.DaemonDatabaseOperator;
import lombok.SneakyThrows;

View File

@@ -1,8 +1,8 @@
package io.wdd.rpc.init;
import io.wdd.common.beans.status.AgentHealthyStatusEnum;
import io.wdd.common.utils.TimeUtils;
import io.wdd.rpc.status.AgentHealthyStatusEnum;
import io.wdd.server.beans.vo.ServerInfoVO;
import io.wdd.server.coreService.CoreServerService;
import lombok.extern.slf4j.Slf4j;
@@ -15,7 +15,8 @@ import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import static io.wdd.common.beans.status.OctopusStatusMessage.ALL_AGENT_STATUS_REDIS_KEY;
import static io.wdd.rpc.status.OctopusStatusMessage.ALL_AGENT_STATUS_REDIS_KEY;
/**
* Server启动或者运行的时候需要初 缓存一系列的信息

View File

@@ -0,0 +1,40 @@
package io.wdd.rpc.message;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class OctopusMessage {
String uuid;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime init_time;
/**
* 执行操作的类型
*/
OctopusMessageType type;
// server send message content
Object content;
// agent reply message content
Object result;
/**
* Agent 完成操作的时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime ac_time;
}

View File

@@ -0,0 +1,19 @@
package io.wdd.rpc.message;
public enum OctopusMessageType {
// agent initialization
INIT,
// important things agent should do with itself
AGENT,
// common shell or order execution
EXECUTOR,
// update or report agent status
STATUS
//
}

View File

@@ -1,6 +1,6 @@
package io.wdd.rpc.message.handler;
import io.wdd.common.beans.rabbitmq.OctopusMessage;
import io.wdd.rpc.message.OctopusMessage;
import io.wdd.server.config.ServerCommonPool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

View File

@@ -3,8 +3,8 @@ package io.wdd.rpc.message.handler;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.wdd.common.beans.rabbitmq.OctopusMessage;
import io.wdd.common.beans.rabbitmq.OctopusMessageType;
import io.wdd.rpc.message.OctopusMessage;
import io.wdd.rpc.message.OctopusMessageType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

View File

@@ -2,8 +2,8 @@ package io.wdd.rpc.message.handler;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.wdd.common.beans.rabbitmq.OctopusMessage;
import io.wdd.common.handler.MyRuntimeException;
import io.wdd.rpc.message.OctopusMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;

View File

@@ -2,10 +2,10 @@ package io.wdd.rpc.message.sender;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.wdd.common.beans.rabbitmq.OctopusMessage;
import io.wdd.common.beans.rabbitmq.OctopusMessageType;
import io.wdd.common.handler.MyRuntimeException;
import io.wdd.rpc.init.InitRabbitMQConfig;
import io.wdd.rpc.message.OctopusMessage;
import io.wdd.rpc.message.OctopusMessageType;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;

View File

@@ -6,7 +6,6 @@ import io.wdd.server.utils.SpringUtils;
import org.apache.commons.lang3.StringUtils;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.util.ReflectionUtils;

View File

@@ -1,7 +1,7 @@
package io.wdd.rpc.scheduler.config;
import io.wdd.common.beans.executor.ExecutionMessage;
import io.wdd.common.utils.TimeUtils;
import io.wdd.rpc.execute.ExecutionMessage;
import io.wdd.rpc.scheduler.beans.ScriptSchedulerDTO;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;

View File

@@ -1,7 +1,7 @@
package io.wdd.rpc.scheduler.service.status;
import io.wdd.common.beans.status.OctopusStatusMessage;
import io.wdd.rpc.status.OctopusStatusMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -10,8 +10,8 @@ import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
import static io.wdd.common.beans.status.OctopusStatusMessage.METRIC_STATUS_MESSAGE_TYPE;
import static io.wdd.rpc.init.ServerCacheAgentStatus.ALL_HEALTHY_AGENT_TOPIC_NAME_LIST;
import static io.wdd.rpc.status.OctopusStatusMessage.METRIC_STATUS_MESSAGE_TYPE;
/**
* 收集OctopusAgent的运行Metric信息

View File

@@ -4,7 +4,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.wdd.common.beans.status.AgentStatus;
import io.wdd.rpc.status.AgentStatus;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

View File

@@ -2,11 +2,11 @@ package io.wdd.rpc.scheduler.service.status;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.wdd.common.beans.rabbitmq.OctopusMessage;
import io.wdd.common.beans.rabbitmq.OctopusMessageType;
import io.wdd.common.beans.status.OctopusStatusMessage;
import io.wdd.common.utils.TimeUtils;
import io.wdd.rpc.message.OctopusMessage;
import io.wdd.rpc.message.OctopusMessageType;
import io.wdd.rpc.message.sender.OMessageToAgentSender;
import io.wdd.rpc.status.OctopusStatusMessage;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

View File

@@ -1,9 +1,9 @@
package io.wdd.rpc.scheduler.service.status;
import io.wdd.common.beans.status.OctopusStatusMessage;
import io.wdd.common.utils.TimeUtils;
import io.wdd.rpc.init.ServerCacheAgentStatus;
import io.wdd.rpc.scheduler.service.BuildStatusScheduleTask;
import io.wdd.rpc.status.OctopusStatusMessage;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.context.annotation.Lazy;
@@ -16,9 +16,9 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static io.wdd.common.beans.status.OctopusStatusMessage.ALL_AGENT_STATUS_REDIS_KEY;
import static io.wdd.common.beans.status.OctopusStatusMessage.HEALTHY_STATUS_MESSAGE_TYPE;
import static io.wdd.rpc.init.ServerCacheAgentStatus.ALL_AGENT_TOPIC_NAME_LIST;
import static io.wdd.rpc.status.OctopusStatusMessage.ALL_AGENT_STATUS_REDIS_KEY;
import static io.wdd.rpc.status.OctopusStatusMessage.HEALTHY_STATUS_MESSAGE_TYPE;
/**
* 更新频率被类 BuildStatusScheduleTask.class控制

View File

@@ -0,0 +1,31 @@
package io.wdd.rpc.status;
import lombok.Getter;
/**
* AgentHealthy状态描述实体类
* Agent存货状态描述
*/
@Getter
public enum AgentHealthyStatusEnum {
FAILED("FAILED", "Agent存活状态为 失败"),
HEALTHY("HEALTHY", "Agent存活状态为 存活"),
UNKNOWN("UNKNOWN", "Agent存活状态 未知");
String status;
String description;
AgentHealthyStatusEnum(String status, String description) {
this.description = description;
this.status = status;
}
}

View File

@@ -0,0 +1,41 @@
package io.wdd.rpc.status;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class AgentStatus {
private static final String AGENT_STATUS_KEY_SUFFIX = "-Status";
public static String getRedisStatusKey(String agentTopicName) {
return agentTopicName+AGENT_STATUS_KEY_SUFFIX;
}
String time;
String agentName;
String agentTopicName;
CpuInfo cpuInfo;
MemoryInfo memoryInfo;
List<DiskInfo> diskStoreInfo;
List<NetworkInfo> networkInfo;
AgentSystemInfo osInfo;
AppStatusInfo appStatus;
}

View File

@@ -0,0 +1,48 @@
package io.wdd.rpc.status;
import io.wdd.common.utils.TimeUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import oshi.software.os.OperatingSystem;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class AgentSystemInfo {
String osInfo;
String family;
String manufacturer;
String bootTime;
String upTime;
public static AgentSystemInfo mapFromOHSISystem(OperatingSystem os) {
return AgentSystemInfo.builder()
.osInfo(String.valueOf(os.getVersionInfo()))
.family(os.getFamily())
.manufacturer(os.getManufacturer())
.bootTime(TimeUtils.localDateTimeString(
LocalDateTime.ofInstant(
Instant.ofEpochSecond(os.getSystemBootTime()),
ZoneId.of("UTC+8")
)
))
.upTime(TimeUtils.toRelative(os.getSystemUptime()*1000, 3))
.build();
}
}

View File

@@ -0,0 +1,28 @@
package io.wdd.rpc.status;
public enum AppStatusEnum {
HEALTHY("Healthy", "app is running"),
FAILURE("Failure", "app is failed"),
NOT_INSTALL("NotInstall", "app not installed");
String name;
String description;
AppStatusEnum(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
}

View File

@@ -0,0 +1,22 @@
package io.wdd.rpc.status;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.Set;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class AppStatusInfo {
Set<String> Healthy;
Set<String> Failure;
Set<String> NotInstall;
}

View File

@@ -0,0 +1,192 @@
package io.wdd.rpc.status;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import oshi.hardware.CentralProcessor;
import java.text.DecimalFormat;
@AllArgsConstructor
@Data
@NoArgsConstructor
public class CpuInfo {
private static final DecimalFormat LOAD_FORMAT = new DecimalFormat("#.00");
private static final double GHZ_UNIT = 1000000000d;
/**
* CPU总线程
*/
private Integer cpuTotal;
/**
* CPU核心数
*/
private Integer coreTotal;
/**
* CPU总数 计算方式理论上为 cpuTotal * 100
*/
private double cpuUsageTotol;
/**
* CPU系统使用率
*/
private double systemCpuUsage;
/**
* CPU用户使用率
*/
private double userCpuUsage;
/**
* CPU当前等待率
*/
private double wait;
/**
* CPU当前空闲率
*/
private double free;
/**
* CPU型号信息
*/
private CpuModel cpuModel;
private double maxFreq;
private double[] runFreq;
private double[] cpuLoadAverage;
private double[] systemLoadAverage;
public CpuInfo(CentralProcessor processor, long waitingTime) {
this.init(processor, waitingTime);
}
/**
* 获取每个CPU核心的tick计算方式为 100 * tick / totalCpu
*
* @param tick tick
* @param totalCpu CPU总数
* @return 平均每个CPU核心的tick
* @since 5.7.12
*/
private static double formatDouble(long tick, long totalCpu) {
if (0 == totalCpu) {
return 0D;
}
return Double.parseDouble(LOAD_FORMAT.format(tick <= 0 ? 0 : (100d * tick / totalCpu)));
}
private static double formatDouble(double doubleNum) {
return Double.parseDouble(LOAD_FORMAT.format(doubleNum));
}
private static double[] formatCpuLoadAverage(double[] cpuLoadAverage) {
double[] result = new double[cpuLoadAverage.length];
for (int i = 0; i < cpuLoadAverage.length; i++) {
result[i] = formatDouble(cpuLoadAverage[i]);
}
return result;
}
private static double formatCpuFrequency(long freq){
return Double.parseDouble(LOAD_FORMAT.format(freq / GHZ_UNIT));
}
private static double[] formatCpuFrequencyList(long[] freqList){
int length = freqList.length;
double[] result = new double[length];
for (int i = 0; i < length; i++) {
result[i] = formatCpuFrequency(freqList[i]);
}
return result;
}
/**
* 获取指定等待时间内系统CPU 系统使用率、用户使用率、利用率等等 相关信息
*
* @param processor {@link CentralProcessor}
* @param waitingTime 设置等待时间,单位毫秒
* @since 5.7.12
*/
private void init(CentralProcessor processor, long waitingTime) {
final CpuTicks ticks = new CpuTicks(processor, waitingTime);
//this.ticks = ticks;
// base core info
this.cpuTotal = processor.getLogicalProcessorCount();
this.coreTotal = processor.getPhysicalProcessorCount();
// cpu information
this.cpuModel = mapFromProcessorIdentifier(processor.getProcessorIdentifier());
final long totalCpu = ticks.totalCpu();
this.cpuUsageTotol = totalCpu;
// cpu frequency
this.maxFreq = formatCpuFrequency(processor.getMaxFreq());
this.runFreq = formatCpuFrequencyList(processor.getCurrentFreq());
// cpu usage
this.systemCpuUsage = formatDouble(ticks.cSys, totalCpu);
this.userCpuUsage = formatDouble(ticks.user, totalCpu);
this.wait = formatDouble(ticks.ioWait, totalCpu);
this.free = formatDouble(ticks.idle, totalCpu);
// system load average
this.systemLoadAverage = processor.getSystemLoadAverage(3);
// cpu load average
this.cpuLoadAverage = formatCpuLoadAverage(processor.getProcessorCpuLoad(waitingTime));
}
private CpuModel mapFromProcessorIdentifier(CentralProcessor.ProcessorIdentifier id) {
return CpuModel.builder()
.cpu64bit(id.isCpu64bit())
.name(id.getName())
.identifier(id.getIdentifier())
.microArch(id.getMicroarchitecture())
.vendor(id.getVendor())
.build();
}
/**
* CPU型号信息
*/
//private CpuTicks ticks;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
private static class CpuModel {
String name;
String vendor;
String microArch;
boolean cpu64bit;
String identifier;
}
}

View File

@@ -0,0 +1,99 @@
package io.wdd.rpc.status;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import oshi.hardware.CentralProcessor;
import oshi.util.Util;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CpuTicks {
long idle;
long nice;
long irq;
long softIrq;
long steal;
long cSys;
long user;
long ioWait;
private static int IDLEIndex;
private static int NICEIndex;
private static int IRQIndex;
private static int SOFTIRQIndex;
private static int STEALIndex;
private static int SYSTEMIndex;
private static int USERIndex;
private static int IOWAITIndex;
static {
IDLEIndex = CentralProcessor.TickType.IDLE.getIndex();
NICEIndex = CentralProcessor.TickType.NICE.getIndex();
IRQIndex =CentralProcessor.TickType.IRQ.getIndex();
SOFTIRQIndex = CentralProcessor.TickType.SOFTIRQ.getIndex();
STEALIndex = CentralProcessor.TickType.STEAL.getIndex();
SYSTEMIndex = CentralProcessor.TickType.SYSTEM.getIndex();
USERIndex = CentralProcessor.TickType.USER.getIndex();
IOWAITIndex = CentralProcessor.TickType.IOWAIT.getIndex();
}
/**
* 构造等待时间为用于计算在一定时长内的CPU负载情况如传入1000表示最近1秒的负载情况
*
* @param processor {@link CentralProcessor}
* @param waitingTime 设置等待时间,单位毫秒
*/
public CpuTicks(CentralProcessor processor, long waitingTime) {
// CPU信息
final long[] prevTicks = processor.getSystemCpuLoadTicks();
// 这里必须要设置延迟
Util.sleep(waitingTime);
final long[] ticks = processor.getSystemCpuLoadTicks();
this.idle = tick(prevTicks, ticks, IDLEIndex);
this.nice = tick(prevTicks, ticks, NICEIndex);
this.irq = tick(prevTicks, ticks, IRQIndex);
this.softIrq = tick(prevTicks, ticks, SOFTIRQIndex);
this.steal = tick(prevTicks, ticks, STEALIndex);
this.cSys = tick(prevTicks, ticks, SYSTEMIndex);
this.user = tick(prevTicks, ticks, USERIndex);
this.ioWait = tick(prevTicks, ticks, IOWAITIndex);
}
/**
* 获取CPU总的使用率
*
* @return CPU总使用率
*/
public long totalCpu() {
return Math.max(user + nice + cSys + idle + ioWait + irq + softIrq + steal, 0);
}
/**
* 获取一段时间内的CPU负载标记差
*
* @param prevTicks 开始的ticks
* @param ticks 结束的ticks
* @param tickType tick类型
* @return 标记差
* @since 5.7.12
*/
private static long tick(long[] prevTicks, long[] ticks, int index) {
return ticks[index] - prevTicks[index];
}
}

View File

@@ -0,0 +1,71 @@
package io.wdd.rpc.status;
import io.wdd.common.utils.FormatUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import oshi.hardware.HWDiskStore;
import java.util.List;
import java.util.stream.Collectors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class DiskInfo {
String name;
String model;
String serial;
String size;
private List<PartitionInfo> partitionInfoList;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
private static class PartitionInfo{
String path;
String type;
String size;
String mountPoint;
}
public static List<DiskInfo> mapFromDiskStore(List<HWDiskStore> hwDiskStoreList){
return hwDiskStoreList.stream().map(
hwDiskStore -> DiskInfo.builder()
.name(hwDiskStore.getName())
.model(hwDiskStore.getModel())
.serial(hwDiskStore.getSerial())
.size(FormatUtils.formatData(hwDiskStore.getSize()))
.partitionInfoList(
// partition should also be got from stream
hwDiskStore.getPartitions().stream().map(partition -> DiskInfo.PartitionInfo.builder()
.path(partition.getIdentification())
.size(FormatUtils.formatData(partition.getSize()))
.type(partition.getType())
.mountPoint(partition.getMountPoint())
.build()
).collect(Collectors.toList())
)
.build()
).collect(Collectors.toList());
}
}

View File

@@ -0,0 +1,47 @@
package io.wdd.rpc.status;
import io.wdd.common.utils.FormatUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import oshi.hardware.GlobalMemory;
import oshi.hardware.VirtualMemory;
@NoArgsConstructor
@AllArgsConstructor
@Data
@SuperBuilder(toBuilder = true)
public class MemoryInfo {
String total;
String usage;
String available;
String memoryType;
String swapTotal;
String swapAvailable;
String swapUsage;
public static MemoryInfo build(GlobalMemory memory) {
VirtualMemory virtualMemory = memory.getVirtualMemory();
return MemoryInfo.builder()
.memoryType(memory.getPhysicalMemory().get(0).getMemoryType())
.total(FormatUtils.formatData(memory.getTotal()))
.available(FormatUtils.formatData(memory.getAvailable()))
.usage(FormatUtils.formatData(memory.getTotal() - memory.getAvailable()))
.swapTotal(FormatUtils.formatData(virtualMemory.getSwapTotal()))
.swapUsage(FormatUtils.formatData(virtualMemory.getSwapUsed()))
.swapAvailable(FormatUtils.formatData(virtualMemory.getSwapTotal() - virtualMemory.getSwapUsed()))
.build();
}
}

View File

@@ -0,0 +1,18 @@
package io.wdd.rpc.status;
import lombok.Data;
/**
* 没时间整这些,反正大一点数据也无所谓 不是吗
*/
@Deprecated
@Data
public class MetricStatus {
CpuInfo cpuInfo;
MemoryInfo memoryInfo;
AppStatusInfo appStatus;
}

View File

@@ -0,0 +1,108 @@
package io.wdd.rpc.status;
import io.wdd.common.utils.FormatUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import oshi.hardware.NetworkIF;
import java.util.List;
import java.util.stream.Collectors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class NetworkInfo {
private String name;
private String displayName;
private String macAddr;
private String mtu;
private String[] innerIpv4Addr;
private String publicIpv4Addr;
private String[] innerIpv6Addr;
private String publicIpv6Addr;
/**
* 过去1s内的网速接收速率
*/
private String recvSpeed;
/**
* 过去1s内的网速发送速率
*/
private String sendSpeed;
private String trafficRecv;
private String trafficSend;
public static NetworkInfo mapFromNetworkIF(NetworkIF networkIF) {
return NetworkInfo
.builder()
.name(networkIF.getName())
.displayName(networkIF.getDisplayName())
.mtu(String.valueOf(networkIF.getMTU()))
.macAddr(networkIF.getMacaddr())
.innerIpv4Addr(generateIPDICRFromNetworkIFList(
networkIF,
4
))
.innerIpv6Addr(generateIPDICRFromNetworkIFList(
networkIF,
6
))
.trafficSend(FormatUtils.formatData(networkIF.getBytesSent()))
.trafficRecv(FormatUtils.formatData(networkIF.getBytesRecv())
)
.build();
}
public static List<NetworkInfo> mapFromNetworkIFS(List<NetworkIF> networkIFList) {
return networkIFList
.stream()
.map(
networkIF -> NetworkInfo
.builder()
.name(networkIF.getName())
.displayName(networkIF.getDisplayName())
.mtu(String.valueOf(networkIF.getMTU()))
.macAddr(networkIF.getMacaddr())
.innerIpv4Addr(generateIPDICRFromNetworkIFList(
networkIF,
4
))
.innerIpv6Addr(generateIPDICRFromNetworkIFList(
networkIF,
6
))
.trafficSend(FormatUtils.formatData(networkIF.getBytesSent()))
.trafficRecv(FormatUtils.formatData(networkIF.getBytesRecv())
)
.build())
.collect(Collectors.toList());
}
private static String[] generateIPDICRFromNetworkIFList(NetworkIF networkIF, int Ipv4OrIpv6) {
String[] iPAddr;
Short[] subnetMasks;
if (Ipv4OrIpv6 == 4) {
iPAddr = networkIF.getIPv4addr();
subnetMasks = networkIF.getSubnetMasks();
} else {
iPAddr = networkIF.getIPv6addr();
subnetMasks = networkIF.getPrefixLengths();
}
String[] result = new String[iPAddr.length];
for (int index = 0; index < iPAddr.length; index++) {
result[index] = iPAddr[index] + "/" + subnetMasks[index];
}
return result;
}
}

View File

@@ -0,0 +1,36 @@
package io.wdd.rpc.status;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class OctopusStatusMessage {
// below two will be used by both server and agent
// 存储所有Agent的实时健康状态 1代表健康 0代表失败
public static final String ALL_AGENT_STATUS_REDIS_KEY = "ALL_AGENT_HEALTHY_STATUS";
public static final String HEALTHY_STATUS_MESSAGE_TYPE = "ping";
public static final String ALL_STATUS_MESSAGE_TYPE = "all";
public static final String METRIC_STATUS_MESSAGE_TYPE = "metric";
public static final String APP_STATUS_MESSAGE_TYPE = "app";
/**
* which kind of status should be return
* metric => short time message
* all => all agent status message
* healthy => check for healthy
* */
String type;
String agentTopicName;
int metricRepeatCount;
int metricRepeatPinch;
}