[ Server ] [ Status ] - refresh status part

This commit is contained in:
zeaslity
2023-12-22 16:22:20 +08:00
parent 53f4f526cf
commit 1f8c174009
25 changed files with 538 additions and 259 deletions

View File

@@ -177,7 +177,7 @@ func statusOMHandler(octopusMessage *OctopusMessage) {
agentStatusString, _ := json.Marshal(status.ReportAgentMetric()) agentStatusString, _ := json.Marshal(status.ReportAgentMetric())
statusRes = string(agentStatusString) statusRes = string(agentStatusString)
} else if strings.HasPrefix(statusMessage.StatusType, "INFO") { } else if strings.HasPrefix(statusMessage.StatusType, "INFO") {
log.InfoF("[statusOMHandler] - call for agent info !")
} else { } else {
log.WarnF("[statusOMHandler] - error octopus status message type of %s", statusMessage.StatusType) log.WarnF("[statusOMHandler] - error octopus status message type of %s", statusMessage.StatusType)
} }

View File

@@ -35,13 +35,18 @@
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId> <artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<artifactId>lettuce-core</artifactId>
<groupId>io.lettuce</groupId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!--<dependency> <dependency>
<groupId>org.redisson</groupId> <groupId>redis.clients</groupId>
<artifactId>redisson-spring-boot-starter</artifactId> <artifactId>jedis</artifactId>
<version>3.13.6</version> </dependency>
</dependency>--> <!-- redis pool 缓存连接池-->
<!-- lettuce pool 缓存连接池-->
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId> <artifactId>commons-pool2</artifactId>

View File

@@ -0,0 +1,46 @@
package io.wdd.common.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class JedisConfig {
private Logger logger = LoggerFactory.getLogger(JedisConfig.class);
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.timeout}")
private int timeout;
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.jedis.pool.max-active}")
private int maxActive;
@Value("${spring.redis.jedis.pool.min-idle}")
private int minIdle;
@Bean
public JedisPool jedisPool() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxTotal(maxActive);
jedisPoolConfig.setMinIdle(minIdle);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, null);
logger.info("JedisPoll连接成功" + host + "\t" + port);
return jedisPool;
}
}

View File

@@ -94,7 +94,7 @@ public class TimeUtils {
if (ObjectUtils.isEmpty(UNIFORM_TIME)) { if (ObjectUtils.isEmpty(UNIFORM_TIME)) {
UNIFORM_TIME = currentTime(); UNIFORM_TIME = currentTime();
return currentFormatTimeString(); return forwardRoundingTimeString();
} }
// 旧的时间和新时间之家误差小于5秒那么使用同一个时间 // 旧的时间和新时间之家误差小于5秒那么使用同一个时间
@@ -105,7 +105,25 @@ public class TimeUtils {
} }
return localDateTimeFormatString(UNIFORM_TIME); return localDateTimeFormatString(UNIFORM_TIME);
}
/**
* 2023-12-22-11-37-41 should return 2023-12-22-11-37-40
* 2023-12-22-11-37-47 should return 2023-12-22-11-37-45
*
* @return forward rounding time
*/
private static String forwardRoundingTimeString() {
LocalDateTime now = currentTime();
int second = now.getSecond();
while (second % 5 != 0) {
now = now.minusSeconds(1);
second = second - 1;
}
return localDateTimeFormatString(now);
} }
/** /**
@@ -122,7 +140,6 @@ public class TimeUtils {
.format(ofPattern); .format(ofPattern);
return LocalDateTime.parse(format, ofPattern); return LocalDateTime.parse(format, ofPattern);
} }
@@ -131,8 +148,7 @@ public class TimeUtils {
*/ */
public static String currentFormatTimeString() { public static String currentFormatTimeString() {
return currentFormatTime() return localDateTimeFormatString(currentTime());
.format(DateTimeFormatter.ofPattern(FULL_SPLIT_TIME_FORMAT));
} }
public static LocalDateTime cvFromDate(Date date) { public static LocalDateTime cvFromDate(Date date) {
@@ -156,23 +172,10 @@ public class TimeUtils {
.format(DateTimeFormatter.ofPattern(COMMON_TIME_FORMAT)); .format(DateTimeFormatter.ofPattern(COMMON_TIME_FORMAT));
} }
/**
* @return UTC+8 [ yyyy-MM-dd-HH-mm-ss ] Time String
*/
public static String currentTimeStringFullSplit() {
return LocalDateTime
.now(SYSTEM_TIME_ZONE_ID)
.format(DateTimeFormatter.ofPattern(FULL_SPLIT_TIME_FORMAT));
}
/** /**
* 输出格式为 COMMON_TIME_FORMAT "yyyy-MM-dd HH:mm:ss" * 输出格式为 COMMON_TIME_FORMAT "yyyy-MM-dd HH:mm:ss"
* *
* @param time
* @return
*/ */
public static String localDateTimeString(LocalDateTime time) { public static String localDateTimeString(LocalDateTime time) {
return time.format(DateTimeFormatter.ofPattern(COMMON_TIME_FORMAT)); return time.format(DateTimeFormatter.ofPattern(COMMON_TIME_FORMAT));

View File

@@ -100,17 +100,17 @@ public class AppFuncScheduler {
); );
List<AppFunctionEnum> appFunctionEnumList = List.of( List<AppFunctionEnum> appFunctionEnumList = List.of(
// AppFunctionEnum.DEPLOY_CHRONY_SERVER, AppFunctionEnum.DEPLOY_CHRONY_SERVER,
// AppFunctionEnum.DEPLOY_RKE AppFunctionEnum.DEPLOY_RKE
AppFunctionEnum.DEPLOY_K8S_DASHBOARD, // AppFunctionEnum.DEPLOY_K8S_DASHBOARD,
AppFunctionEnum.DEPLOY_NFS, // AppFunctionEnum.DEPLOY_NFS,
AppFunctionEnum.DEPLOY_TEST_NFS, // AppFunctionEnum.DEPLOY_TEST_NFS,
AppFunctionEnum.DEPLOY_K8S_NAMESPACE, // AppFunctionEnum.DEPLOY_K8S_NAMESPACE,
AppFunctionEnum.DEPLOY_K8S_PVC, // AppFunctionEnum.DEPLOY_K8S_PVC,
AppFunctionEnum.DEPLOY_K8S_MYSQL, // AppFunctionEnum.DEPLOY_K8S_MYSQL,
AppFunctionEnum.DEPLOY_K8S_REDIS, // AppFunctionEnum.DEPLOY_K8S_REDIS,
AppFunctionEnum.DEPLOY_K8S_MIDDLEWARES, // AppFunctionEnum.DEPLOY_K8S_MIDDLEWARES,
AppFunctionEnum.DEPLOY_INGRESS // AppFunctionEnum.DEPLOY_INGRESS
// AppFunctionEnum.DEPLOY_FRONTEND // AppFunctionEnum.DEPLOY_FRONTEND
// AppFunctionEnum.DEPLOY_BACKEND // AppFunctionEnum.DEPLOY_BACKEND
// AppFunctionEnum.DEPLOY_K8S_SRS // AppFunctionEnum.DEPLOY_K8S_SRS

View File

@@ -6,7 +6,7 @@ import io.swagger.annotations.ApiOperation;
import io.wdd.common.response.R; import io.wdd.common.response.R;
import io.wdd.rpc.beans.request.MetricQueryEntity; import io.wdd.rpc.beans.request.MetricQueryEntity;
import io.wdd.rpc.scheduler.service.status.AgentAliveStatusMonitorService; import io.wdd.rpc.scheduler.service.status.AgentAliveStatusMonitorService;
import io.wdd.rpc.status.beans.AgentStatus; import io.wdd.rpc.status.beans.AgentMetric;
import io.wdd.rpc.status.service.SyncStatusService; import io.wdd.rpc.status.service.SyncStatusService;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@@ -17,7 +17,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static io.wdd.rpc.status.CommonAndStatusCache.*; import static io.wdd.rpc.status.AllAgentStatusCache.*;
//@RestController //@RestController
@@ -89,7 +89,7 @@ public class StatusController {
@ApiOperation("[ Agent-Metric ] 获取Agent的Metric信息") @ApiOperation("[ Agent-Metric ] 获取Agent的Metric信息")
@PostMapping("/agent/metric") @PostMapping("/agent/metric")
public R<ArrayList<AgentStatus>> QueryMetricStatus( public R<ArrayList<AgentMetric>> QueryMetricStatus(
@RequestBody MetricQueryEntity metricQueryEntity @RequestBody MetricQueryEntity metricQueryEntity
) { ) {

View File

@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static io.wdd.rpc.message.handler.OMessageHandler.*; import static io.wdd.rpc.message.handler.OMessageHandler.*;
import static io.wdd.rpc.status.CommonAndStatusCache.ALL_AGENT_TOPIC_NAME_SET; import static io.wdd.rpc.status.AllAgentStatusCache.ALL_AGENT_TOPIC_NAME_SET;
@Service @Service
@Slf4j @Slf4j
@@ -173,6 +173,9 @@ public class ExecutionServiceImpl implements ExecutionService {
private boolean validateCommandInfo(String agentTopicName) { private boolean validateCommandInfo(String agentTopicName) {
// todo remove
ALL_AGENT_TOPIC_NAME_SET.add("Chengdu-amd64-99-3b1609");
// 检查agentTopicName是否存在 // 检查agentTopicName是否存在
if (!ALL_AGENT_TOPIC_NAME_SET.contains(agentTopicName)) { if (!ALL_AGENT_TOPIC_NAME_SET.contains(agentTopicName)) {
log.error( log.error(

View File

@@ -1,7 +1,7 @@
package io.wdd.rpc.scheduler.service.status; package io.wdd.rpc.scheduler.service.status;
import io.wdd.common.utils.TimeUtils; import io.wdd.common.utils.TimeUtils;
import io.wdd.rpc.status.CommonAndStatusCache; import io.wdd.rpc.status.AllAgentStatusCache;
import io.wdd.rpc.status.service.SyncStatusService; import io.wdd.rpc.status.service.SyncStatusService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
@@ -13,7 +13,7 @@ import javax.annotation.Resource;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static io.wdd.rpc.status.CommonAndStatusCache.*; import static io.wdd.rpc.status.AllAgentStatusCache.*;
import static io.wdd.rpc.status.OctopusStatusMessage.ALL_AGENT_STATUS_REDIS_KEY; import static io.wdd.rpc.status.OctopusStatusMessage.ALL_AGENT_STATUS_REDIS_KEY;
/** /**
@@ -28,7 +28,7 @@ public class AgentAliveStatusMonitorService {
RedisTemplate redisTemplate; RedisTemplate redisTemplate;
@Resource @Resource
CommonAndStatusCache commonAndStatusCache; AllAgentStatusCache allAgentStatusCache;
@Resource @Resource
SyncStatusService syncStatusService; SyncStatusService syncStatusService;
@@ -42,7 +42,7 @@ public class AgentAliveStatusMonitorService {
public void collectAllAgentAliveStatus() { public void collectAllAgentAliveStatus() {
// 1. 获取所有注册的Agent 手动更新 // 1. 获取所有注册的Agent 手动更新
commonAndStatusCache.updateAllAgentTopicNameCache(); allAgentStatusCache.commonUpdateAllAgentTopicNameCache();
if (CollectionUtils.isEmpty(ALL_AGENT_TOPIC_NAME_LIST)) { if (CollectionUtils.isEmpty(ALL_AGENT_TOPIC_NAME_LIST)) {
log.warn("[Scheduler] No Agent Registered ! End Up Status Monitor !"); log.warn("[Scheduler] No Agent Registered ! End Up Status Monitor !");
return; return;
@@ -53,7 +53,7 @@ public class AgentAliveStatusMonitorService {
// 2023年6月14日 2. 发送ping等待所有的Agent返回PONG, 然后进行redis的状态修改 // 2023年6月14日 2. 发送ping等待所有的Agent返回PONG, 然后进行redis的状态修改
// 同步的方法, 超时等待所有主机的存活状态 // 同步的方法, 超时等待所有主机的存活状态
Map<String, Boolean> agentAliveStatusMap = syncStatusService.SyncCollectAgentAliveStatus( Map<String, Boolean> agentAliveStatusMap = syncStatusService.SyncCheckAgentIsAlive(
ALL_AGENT_TOPIC_NAME_LIST, ALL_AGENT_TOPIC_NAME_LIST,
5 5
); );
@@ -110,7 +110,7 @@ public class AgentAliveStatusMonitorService {
String currentTimeString = TimeUtils.currentTimeString(); String currentTimeString = TimeUtils.currentTimeString();
// 更新 二级缓存 // 更新 二级缓存
commonAndStatusCache.updateAgentStatusCache(agentAliveStatusMap); allAgentStatusCache.updateAgentStatusCache(agentAliveStatusMap);
// 更新 一级缓存 // 更新 一级缓存
// 这里仅仅是更新时间 // 这里仅仅是更新时间

View File

@@ -3,7 +3,7 @@ package io.wdd.rpc.scheduler.service.status;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import io.wdd.common.utils.TimeUtils; import io.wdd.common.utils.TimeUtils;
import io.wdd.rpc.status.beans.AgentStatus; import io.wdd.rpc.status.beans.AgentMetric;
import io.wdd.rpc.status.service.SyncStatusService; import io.wdd.rpc.status.service.SyncStatusService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
@@ -13,7 +13,7 @@ import javax.annotation.Resource;
import java.util.Map; import java.util.Map;
import static io.wdd.common.config.OctopusObjectMapperConfig.OctopusObjectMapper; import static io.wdd.common.config.OctopusObjectMapperConfig.OctopusObjectMapper;
import static io.wdd.rpc.status.CommonAndStatusCache.ALL_HEALTHY_AGENT_TOPIC_NAME_LIST; import static io.wdd.rpc.status.AllAgentStatusCache.ALL_HEALTHY_AGENT_TOPIC_NAME_LIST;
/** /**
* 定时任务 收集Agent的运行Metric的实际执行类 * 定时任务 收集Agent的运行Metric的实际执行类
@@ -41,7 +41,7 @@ public class AgentMetricStatusCollectService {
} }
// 调用核心的服务 // 调用核心的服务
Map<String, AgentStatus> agentMetricStatusMap = syncStatusService.SyncCollectAgentMetricStatus( Map<String, AgentMetric> agentMetricStatusMap = syncStatusService.SyncCollectAgentMetricStatus(
ALL_HEALTHY_AGENT_TOPIC_NAME_LIST, ALL_HEALTHY_AGENT_TOPIC_NAME_LIST,
10 10
); );

View File

@@ -6,8 +6,9 @@ import io.wdd.server.beans.po.ServerInfoPO;
import io.wdd.server.coreService.CoreServerService; import io.wdd.server.coreService.CoreServerService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -27,7 +28,7 @@ import java.util.stream.Collectors;
*/ */
@Service @Service
@Slf4j @Slf4j
public class CommonAndStatusCache { public class AllAgentStatusCache {
/** /**
* 存储所有的AgentTopicName的缓存 * 存储所有的AgentTopicName的缓存
@@ -58,27 +59,34 @@ public class CommonAndStatusCache {
/** /**
* 记录状态信息缓存的更新时间 * 记录状态信息缓存的更新时间
*/ */
public static final String STATUS_UPDATE_TIME_KEY = "UPDATE_TIME"; public static final String STATUS_UPDATE_TIME_KEY = "A-UPDATE_TIME";
/** /**
* 记录状态信息缓存的初始化时间 * 记录状态信息缓存的初始化时间
*/ */
public static final String STATUS_INIT_TIME_KEY = "INIT_TIME"; public static final String STATUS_INIT_TIME_KEY = "A-INIT_TIME";
/** /**
* AgentTopicName 在Redis中緩存的Key * AgentTopicName 在Redis中緩存的Key
*/ */
private static final String ALL_AGENT_TOPIC_NAME_REDIS_KEY = "ALL_AGENT_TOPIC_NAME"; private static final String ALL_AGENT_HEALTHY_MAP_REDIS_KEY = "ALL_AGENT_HEALTHY_MAP";
private static final String ALL_STATUS_AGENT_MAP_REDIS_KEY = "ALL_STATUS_AGENT_MAP";
private static final String ALL_AGENT_TOPIC_NAME_SET_REDIS_KEY = "ALL_AGENT_TOPIC_NAME";
@Resource @Resource
CoreServerService coreServerService; CoreServerService coreServerService;
@Resource @Resource
RedisTemplate redisTemplate; JedisPool jedisPool;
@PostConstruct @PostConstruct
public void InitToGenerateAllStatusCache() { public void InitToGenerateAllStatusCache() {
//所有Agent的TopicName ALL_AGENT_TOPIC_NAME_SET //所有Agent的TopicName ALL_AGENT_TOPIC_NAME_SET
updateAllAgentTopicNameCache(); commonUpdateAllAgentTopicNameCache();
//
initUpdateAllAgentStatusCache();
// Agent状态信息的两个Map // Agent状态信息的两个Map
// 初始化 默认创建全部失败的Map // 初始化 默认创建全部失败的Map
@@ -89,7 +97,65 @@ public class CommonAndStatusCache {
topicName -> Boolean.FALSE topicName -> Boolean.FALSE
)); ));
updateAgentStatusCache(initAgentFalseStatusMap); // agent status cache
// updateAgentStatusCache(initAgentFalseStatusMap);
}
private void initUpdateAllAgentStatusCache() {
if (CollectionUtils.isEmpty(ALL_AGENT_TOPIC_NAME_LIST)) {
log.info("[Serer Boot Up] - no agent registered yet !");
return;
}
Jedis jedis = jedisPool.getResource();
// delete from redis
if (jedis.exists(ALL_AGENT_HEALTHY_MAP_REDIS_KEY)) {
jedis.del(ALL_AGENT_HEALTHY_MAP_REDIS_KEY);
}
if (jedis.exists(ALL_STATUS_AGENT_MAP_REDIS_KEY)) {
jedis.del(ALL_STATUS_AGENT_MAP_REDIS_KEY);
}
// create ALL_AGENT_HEALTHY_MAP_REDIS_KEY
Map<String, Boolean> initAgentFalseStatusMap = ALL_AGENT_TOPIC_NAME_LIST
.stream()
.collect(Collectors.toMap(
topicName -> topicName,
topicName -> Boolean.FALSE
));
Map<String, String> initAgentFalseRedisMap = ALL_AGENT_TOPIC_NAME_LIST
.stream()
.collect(Collectors.toMap(
topicName -> topicName,
topicName -> Boolean.FALSE.toString()
));
// add time
String currentFormatTimeString = TimeUtils.currentFormatTimeString();
initAgentFalseRedisMap.put(STATUS_UPDATE_TIME_KEY, currentFormatTimeString);
initAgentFalseRedisMap.put(STATUS_INIT_TIME_KEY, currentFormatTimeString);
if (jedis.hset(ALL_AGENT_HEALTHY_MAP_REDIS_KEY, initAgentFalseRedisMap) > 0) {
log.debug(" ALL_AGENT_HEALTHY_MAP_REDIS_KEY of {} has updated !", ALL_AGENT_HEALTHY_MAP_REDIS_KEY);
ALL_AGENT_STATUS_MAP.clear();
ALL_AGENT_STATUS_MAP.putAll(initAgentFalseStatusMap);
}
// create ALL_STATUS_AGENT_MAP_REDIS_KEY
Map<String, List<String>> statusAgentMapFromAgentStatusMap = buildStatusAgentMapFromAgentStatusMap(initAgentFalseStatusMap);
// convert
statusAgentMapFromAgentStatusMap.entrySet().stream().collect(Collectors.toMap(
entry -> entry.getKey(),
entry -> String.join(",", entry.getValue())
));
// add time
// statusAgentMapFromAgentStatusMap.put(STATUS_UPDATE_TIME_KEY, );
// statusAgentMapFromAgentStatusMap.put(STATUS_UPDATE_TIME_KEY, currentFormatTimeString);
} }
@@ -98,7 +164,7 @@ public class CommonAndStatusCache {
* <p> * <p>
* 2023年7月10日 写入Redis中保存一份 * 2023年7月10日 写入Redis中保存一份
*/ */
public void updateAllAgentTopicNameCache() { public void commonUpdateAllAgentTopicNameCache() {
//查询DB //查询DB
List<ServerInfoPO> allAgentInfo = coreServerService.serverGetAll(); List<ServerInfoPO> allAgentInfo = coreServerService.serverGetAll();
@@ -119,21 +185,22 @@ public class CommonAndStatusCache {
ALL_AGENT_TOPIC_NAME_LIST.addAll(collect); ALL_AGENT_TOPIC_NAME_LIST.addAll(collect);
ALL_AGENT_TOPIC_NAME_SET.addAll(collect); ALL_AGENT_TOPIC_NAME_SET.addAll(collect);
Jedis jedis = jedisPool.getResource();
if (jedis.exists(ALL_AGENT_TOPIC_NAME_SET_REDIS_KEY)) {
jedis.del(ALL_AGENT_TOPIC_NAME_SET_REDIS_KEY);
}
String[] all_agent_topic_name_array = new String[ALL_AGENT_TOPIC_NAME_LIST.size()]; String[] all_agent_topic_name_array = new String[ALL_AGENT_TOPIC_NAME_LIST.size()];
ALL_AGENT_TOPIC_NAME_LIST.toArray(all_agent_topic_name_array); ALL_AGENT_TOPIC_NAME_LIST.toArray(all_agent_topic_name_array);
// 2023年7月10日 同步缓存至Redis中 jedis.sadd(ALL_AGENT_TOPIC_NAME_SET_REDIS_KEY, all_agent_topic_name_array);
redisTemplate
.opsForSet()
.add(
ALL_AGENT_TOPIC_NAME_REDIS_KEY,
all_agent_topic_name_array
);
} }
/** /**
* COMMON-USAGE
*
* 根据传入的状态Map更新二级缓存的两个状态Map和健康主机的列表 * 根据传入的状态Map更新二级缓存的两个状态Map和健康主机的列表
* ALL_AGENT_STATUS_MAP * ALL_AGENT_STATUS_MAP
* STATUS_AGENT_LIST_MAP * STATUS_AGENT_LIST_MAP
@@ -189,6 +256,11 @@ public class CommonAndStatusCache {
STATUS_UPDATE_TIME_KEY, STATUS_UPDATE_TIME_KEY,
Collections.singletonList(timeString) Collections.singletonList(timeString)
); );
// 2023年12月22日
ALL_AGENT_STATUS_MAP.put(
STATUS_UPDATE_TIME_KEY,
Boolean.TRUE
);
// 缓存相应的存活Agent // 缓存相应的存活Agent
List<String> allHealthyAgentTopicNames = agentAliveStatusMap List<String> allHealthyAgentTopicNames = agentAliveStatusMap
@@ -213,12 +285,59 @@ public class CommonAndStatusCache {
ALL_AGENT_STATUS_MAP ALL_AGENT_STATUS_MAP
); );
// 2023年12月22日 add
Jedis jedis = jedisPool.getResource();
if (jedis.exists(ALL_AGENT_HEALTHY_MAP_REDIS_KEY)) {
// get the old cache
//Map<String, String> all_agent_healthy_map_old = jedis.hgetAll(ALL_AGENT_HEALTHY_MAP_REDIS_KEY);
// del the old
jedis.del(ALL_AGENT_HEALTHY_MAP_REDIS_KEY);
}
if (jedis.exists(ALL_STATUS_AGENT_MAP_REDIS_KEY)) {
jedis.del(ALL_STATUS_AGENT_MAP_REDIS_KEY);
}
// help gc // help gc
agentAliveStatusMap = null; agentAliveStatusMap = null;
statusAgentListMap = null; statusAgentListMap = null;
allHealthyAgentTopicNames = null; allHealthyAgentTopicNames = null;
} }
private Map<String, List<String>> buildStatusAgentMapFromAgentStatusMap(Map<String, Boolean> agentStatusMap) {
// 2023-01-16 2023年12月22日
// 更新 状态-Agent容器 内容为
// HEALTHY -> ["agentTopicName-1" "agentTopicName-2"]
// FAILED -> ["agentTopicName-1" "agentTopicName-2"]
Map<String, List<String>> statusAgentListMap = agentStatusMap
.entrySet()
.stream()
.collect(
Collectors.groupingBy(
Map.Entry::getValue
)
)
.entrySet()
.stream()
.collect(
Collectors.toMap(
entry -> entry.getKey() ? "HEALTHY" : "FAILED",
entry -> entry
.getValue()
.stream()
.map(
Map.Entry::getKey
)
.collect(Collectors.toList())
)
);
return statusAgentListMap;
}
private String uniformHealthyStatus(String agentStatus) { private String uniformHealthyStatus(String agentStatus) {
switch (agentStatus) { switch (agentStatus) {
case "0": case "0":

View File

@@ -0,0 +1,28 @@
package io.wdd.rpc.status.beans;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@NoArgsConstructor
@Data
public class AgentMetric {
@JsonProperty("CPUMetric")
private CPUMetric cpuMetric;
@JsonProperty("MemoryMetric")
private MemoryMetric memoryMetric;
@JsonProperty("NetworkMetric")
private List<NetworkMetric> networkMetricList;
@JsonProperty("DiskInfo")
private List<DiskInfo> diskInfoList;
@JsonProperty("DockerMetric")
private DockerMetric dockerMetric;
}

View File

@@ -1,23 +0,0 @@
package io.wdd.rpc.status.beans;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
public class AgentStatus {
@JsonProperty("CPUStatus")
private CPUStatus cpuStatus;
@JsonProperty("MemoryStatus")
private MemoryStatus memoryStatus;
@JsonProperty("NetworkStatus")
private NetworkStatus networkStatus;
@JsonProperty("DiskStatus")
private DiskStatus diskStatus;
}

View File

@@ -0,0 +1,53 @@
package io.wdd.rpc.status.beans;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
public class CPUMetric {
/**
* numCores
*/
@JsonProperty("NumCores")
private Integer numCores;
/**
* cPUPercent
*/
@JsonProperty("CPUPercent")
private Double cPUPercent;
/**
* cPULoads
*/
@JsonProperty("CPULoads")
private CPULoadsDTO cPULoads;
/**
* CPULoadsDTO
*/
@NoArgsConstructor
@Data
public static class CPULoadsDTO {
/**
* load1
*/
@JsonProperty("load1")
private Double load1;
/**
* load5
*/
@JsonProperty("load5")
private Double load5;
/**
* load15
*/
@JsonProperty("load15")
private Double load15;
}
}

View File

@@ -1,81 +0,0 @@
package io.wdd.rpc.status.beans;
import com.fasterxml.jackson.annotation.JsonProperty;
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 CPUStatus {
@JsonProperty("NumCores")
private Integer numCores;
@JsonProperty("CPUInfo")
private List<CPUInfoDTO> cPUInfo;
@JsonProperty("CPUPercent")
private Double cPUPercent;
@JsonProperty("CPULoads")
private CPULoadsDTO cPULoads;
@JsonProperty("SystemLoads")
private SystemLoadsDTO systemLoads;
@NoArgsConstructor
@Data
public static class CPULoadsDTO {
@JsonProperty("load1")
private Integer load1;
@JsonProperty("load5")
private Integer load5;
@JsonProperty("load15")
private Integer load15;
}
@NoArgsConstructor
@Data
public static class SystemLoadsDTO {
@JsonProperty("load1")
private Integer load1;
@JsonProperty("load5")
private Integer load5;
@JsonProperty("load15")
private Integer load15;
}
@NoArgsConstructor
@Data
public static class CPUInfoDTO {
@JsonProperty("cpu")
private Integer cpu;
@JsonProperty("vendorId")
private String vendorId;
@JsonProperty("family")
private String family;
@JsonProperty("model")
private String model;
@JsonProperty("stepping")
private Integer stepping;
@JsonProperty("physicalId")
private String physicalId;
@JsonProperty("coreId")
private String coreId;
@JsonProperty("cores")
private Integer cores;
@JsonProperty("modelName")
private String modelName;
@JsonProperty("mhz")
private Integer mhz;
@JsonProperty("cacheSize")
private Integer cacheSize;
@JsonProperty("flags")
private List<?> flags;
@JsonProperty("microcode")
private String microcode;
}
}

View File

@@ -0,0 +1,47 @@
package io.wdd.rpc.status.beans;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
public class DiskInfo {
/**
* device
*/
@JsonProperty("device")
private String device;
/**
* mountpoint
*/
@JsonProperty("mountpoint")
private String mountpoint;
/**
* fstype
*/
@JsonProperty("fstype")
private String fstype;
/**
* total
*/
@JsonProperty("total")
private Long total;
/**
* free
*/
@JsonProperty("free")
private Long free;
/**
* used
*/
@JsonProperty("used")
private Long used;
/**
* usedPercent
*/
@JsonProperty("usedPercent")
private Double usedPercent;
}

View File

@@ -1,30 +0,0 @@
package io.wdd.rpc.status.beans;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
public class DiskStatus {
@JsonProperty("Total")
private Long total;
@JsonProperty("Used")
private Long used;
// @JsonProperty("LogicalDisk")
// private List<LogicalDiskDTO> logicalDisk;
// @NoArgsConstructor
// @Data
// public static class LogicalDiskDTO {
// @JsonProperty("device")
// private String device;
// @JsonProperty("mountpoint")
// private String mountpoint;
// @JsonProperty("fstype")
// private String fstype;
// @JsonProperty("opts")
// private List<String> opts;
// }
}

View File

@@ -0,0 +1,52 @@
package io.wdd.rpc.status.beans;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@NoArgsConstructor
@Data
public class DockerMetric {
/**
* dockerStats
*/
@JsonProperty("DockerStats")
private List<DockerStatsDTO> dockerStats;
/**
* DockerStatsDTO
*/
@NoArgsConstructor
@Data
public static class DockerStatsDTO {
/**
* containerID
*/
@JsonProperty("containerID")
private String containerID;
/**
* name
*/
@JsonProperty("name")
private String name;
/**
* image
*/
@JsonProperty("image")
private String image;
/**
* status
*/
@JsonProperty("status")
private String status;
/**
* running
*/
@JsonProperty("running")
private Boolean running;
}
}

View File

@@ -6,16 +6,33 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor @NoArgsConstructor
@Data @Data
public class MemoryStatus { public class MemoryMetric {
/**
* totalMemory
*/
@JsonProperty("TotalMemory") @JsonProperty("TotalMemory")
private Long totalMemory; private Long totalMemory;
@JsonProperty("UsedMemory") /**
private Long usedMemory; * availableMemory
*/
@JsonProperty("AvailableMemory") @JsonProperty("AvailableMemory")
private Long availableMemory; private Long availableMemory;
@JsonProperty("TotalVirtualMemory") /**
private Long totalVirtualMemory; * usedMemory
@JsonProperty("UsedVirtualMemory") */
private Long usedVirtualMemory; @JsonProperty("UsedMemory")
private Long usedMemory;
/**
* usedPercent
*/
@JsonProperty("usedPercent")
private Double usedPercent;
/**
* free
*/
@JsonProperty("free")
private Long free;
} }

View File

@@ -0,0 +1,80 @@
package io.wdd.rpc.status.beans;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@NoArgsConstructor
@Data
@AllArgsConstructor
@SuperBuilder(toBuilder = true)
public class NetworkMetric {
/**
* name
*/
@JsonProperty("name")
private String name;
/**
* bytesSent
*/
@JsonProperty("bytesSent")
private Integer bytesSent;
/**
* bytesRecv
*/
@JsonProperty("bytesRecv")
private Integer bytesRecv;
/**
* packetsSent
*/
@JsonProperty("packetsSent")
private Integer packetsSent;
/**
* packetsRecv
*/
@JsonProperty("packetsRecv")
private Integer packetsRecv;
/**
* errin
*/
@JsonProperty("errin")
private Integer errin;
/**
* errout
*/
@JsonProperty("errout")
private Integer errout;
/**
* dropin
*/
@JsonProperty("dropin")
private Integer dropin;
/**
* dropout
*/
@JsonProperty("dropout")
private Integer dropout;
/**
* fifoin
*/
@JsonProperty("fifoin")
private Integer fifoin;
/**
* fifoout
*/
@JsonProperty("fifoout")
private Integer fifoout;
/**
* sendSpeed
*/
@JsonProperty("SendSpeed")
private Double sendSpeed;
/**
* recvSpeed
*/
@JsonProperty("RecvSpeed")
private Double recvSpeed;
}

View File

@@ -1,33 +0,0 @@
package io.wdd.rpc.status.beans;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.List;
@NoArgsConstructor
@Data
@AllArgsConstructor
@SuperBuilder(toBuilder = true)
public class NetworkStatus {
@JsonProperty("name")
private String name;
@JsonProperty("internal_ip_v4")
private List<String> internalIpV4;
@JsonProperty("internal_ip_v6")
private List<String> internalIpV6;
@JsonProperty("mac")
private String mac;
@JsonProperty("sent")
private Long sent;
@JsonProperty("recv")
private Long recv;
@JsonProperty("sent_rate")
private String sentRate;
@JsonProperty("recv_rate")
private String recvRate;
}

View File

@@ -1,7 +1,7 @@
package io.wdd.rpc.status.service; package io.wdd.rpc.status.service;
import io.wdd.rpc.beans.request.MetricQueryEntity; import io.wdd.rpc.beans.request.MetricQueryEntity;
import io.wdd.rpc.status.beans.AgentStatus; import io.wdd.rpc.status.beans.AgentMetric;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -16,7 +16,7 @@ public interface SyncStatusService {
* @param aliveStatusWaitMaxTime * @param aliveStatusWaitMaxTime
* @return * @return
*/ */
Map<String, Boolean> SyncCollectAgentAliveStatus(List<String> agentTopicNameList, int aliveStatusWaitMaxTime); Map<String, Boolean> SyncCheckAgentIsAlive(List<String> agentTopicNameList, int aliveStatusWaitMaxTime);
/** /**
* 同步收集 节点的运行状态 * 同步收集 节点的运行状态
@@ -25,7 +25,7 @@ public interface SyncStatusService {
* @param collectMetricWaitMaxTime * @param collectMetricWaitMaxTime
* @return * @return
*/ */
Map<String, AgentStatus> SyncCollectAgentMetricStatus(List<String> agentTopicNameList, int collectMetricWaitMaxTime); Map<String, AgentMetric> SyncCollectAgentMetricStatus(List<String> agentTopicNameList, int collectMetricWaitMaxTime);
/* Metric 调用的后端接口 */ /* Metric 调用的后端接口 */
@@ -35,6 +35,6 @@ public interface SyncStatusService {
* *
* @return * @return
*/ */
ArrayList<AgentStatus> QueryMetricStatus(MetricQueryEntity metricQueryEntity); ArrayList<AgentMetric> QueryMetricStatus(MetricQueryEntity metricQueryEntity);
} }

View File

@@ -19,7 +19,7 @@ public class ServerInfoPO implements Serializable {
/** /**
* server primary key * server primary key
*/ */
@TableId(value = "server_id", type = IdType.ASSIGN_ID) @TableId(value = "server_id", type = IdType.AUTO)
private Long serverId; private Long serverId;
/** /**

View File

@@ -14,6 +14,7 @@ public interface CoreServerService {
List<ServerInfoVO> serverGetSingle(String serverName, String ipv4, String serverLocation); List<ServerInfoVO> serverGetSingle(String serverName, String ipv4, String serverLocation);
// list all server that are not deleted
List<ServerInfoPO> serverGetAll(); List<ServerInfoPO> serverGetAll();
/** /**

View File

@@ -27,31 +27,23 @@ spring:
port: 21370 port: 21370
database: 0 database: 0
password: boge8tingH password: boge8tingH
# cluster:
# nodes:
# - 43.154.83.213:21370
# - 43.154.83.213:21371
# - 43.154.83.213:21372
# - 43.154.83.213:21373
# - 43.154.83.213:21374
# - 43.154.83.213:21375
# # 获取失败 最大重定向次数
# max-redirects: 3 # max-redirects: 3
# timeout: 50000 timeout: 50000
#如果用以前的jedis可以把下面的lettuce换成jedis即可 #如果用以前的jedis可以把下面的lettuce换成jedis即可
lettuce: jedis:
pool: pool:
# 连接池最大连接数默认值为8 # 连接池最大连接数默认值为8
max-active: 16 max-active: 16
# 连接池最大阻塞时间(使用负值表示没有限制)默认值为-1 # 连接池最大阻塞时间(使用负值表示没有限制)默认值为-1
max-wait: -1 max-wait: 1000
# 连接池中最大空闲连接数默认值为8 # 连接池中最大空闲连接数默认值为8
max-idle: 10 max-idle: 16
# 连接池中的最小空闲连接数默认值为0 # 连接池中的最小空闲连接数默认值为0
min-idle: 10 min-idle: 4
time-between-eviction-runs: 50000 time-between-eviction-runs: 50000
datasource: datasource:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.250.0.100:21306/octopus_server?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 url: jdbc:mysql://10.250.0.100:21306/octopus_server?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8

View File

@@ -55,7 +55,7 @@ public class TestBaseFuncScheduler {
// baseFuncScheduler.runProcedure(projectDeployContext); // baseFuncScheduler.runProcedure(projectDeployContext);
// harborFuncScheduler.runProcedure(projectDeployContext); harborFuncScheduler.runProcedure(projectDeployContext);
appFuncScheduler.runProcedure(projectDeployContext); appFuncScheduler.runProcedure(projectDeployContext);
} }