From 1f8c1740096074f9f6c9d6c880e454160551d1c4 Mon Sep 17 00:00:00 2001 From: zeaslity Date: Fri, 22 Dec 2023 16:22:20 +0800 Subject: [PATCH] [ Server ] [ Status ] - refresh status part --- agent-go/rabbitmq/OctopusMessage.go | 2 +- server/pom.xml | 17 +- .../io/wdd/common/config/JedisConfig.java | 46 ++++++ .../java/io/wdd/common/utils/TimeUtils.java | 37 +++-- .../func/auto/service/AppFuncScheduler.java | 22 +-- .../wdd/rpc/controller/StatusController.java | 6 +- .../execute/service/ExecutionServiceImpl.java | 5 +- .../AgentAliveStatusMonitorService.java | 12 +- .../AgentMetricStatusCollectService.java | 6 +- ...tusCache.java => AllAgentStatusCache.java} | 153 ++++++++++++++++-- .../io/wdd/rpc/status/beans/AgentMetric.java | 28 ++++ .../io/wdd/rpc/status/beans/AgentStatus.java | 23 --- .../io/wdd/rpc/status/beans/CPUMetric.java | 53 ++++++ .../io/wdd/rpc/status/beans/CPUStatus.java | 81 ---------- .../io/wdd/rpc/status/beans/DiskInfo.java | 47 ++++++ .../io/wdd/rpc/status/beans/DiskStatus.java | 30 ---- .../io/wdd/rpc/status/beans/DockerMetric.java | 52 ++++++ .../{MemoryStatus.java => MemoryMetric.java} | 31 +++- .../wdd/rpc/status/beans/NetworkMetric.java | 80 +++++++++ .../wdd/rpc/status/beans/NetworkStatus.java | 33 ---- .../rpc/status/service/SyncStatusService.java | 8 +- .../io/wdd/server/beans/po/ServerInfoPO.java | 2 +- .../server/coreService/CoreServerService.java | 1 + server/src/main/resources/application.yml | 20 +-- .../server/func/TestBaseFuncScheduler.java | 2 +- 25 files changed, 538 insertions(+), 259 deletions(-) create mode 100644 server/src/main/java/io/wdd/common/config/JedisConfig.java rename server/src/main/java/io/wdd/rpc/status/{CommonAndStatusCache.java => AllAgentStatusCache.java} (57%) create mode 100644 server/src/main/java/io/wdd/rpc/status/beans/AgentMetric.java delete mode 100644 server/src/main/java/io/wdd/rpc/status/beans/AgentStatus.java create mode 100644 server/src/main/java/io/wdd/rpc/status/beans/CPUMetric.java delete mode 100644 server/src/main/java/io/wdd/rpc/status/beans/CPUStatus.java create mode 100644 server/src/main/java/io/wdd/rpc/status/beans/DiskInfo.java delete mode 100644 server/src/main/java/io/wdd/rpc/status/beans/DiskStatus.java create mode 100644 server/src/main/java/io/wdd/rpc/status/beans/DockerMetric.java rename server/src/main/java/io/wdd/rpc/status/beans/{MemoryStatus.java => MemoryMetric.java} (53%) create mode 100644 server/src/main/java/io/wdd/rpc/status/beans/NetworkMetric.java delete mode 100644 server/src/main/java/io/wdd/rpc/status/beans/NetworkStatus.java diff --git a/agent-go/rabbitmq/OctopusMessage.go b/agent-go/rabbitmq/OctopusMessage.go index 84acdff..1691c47 100644 --- a/agent-go/rabbitmq/OctopusMessage.go +++ b/agent-go/rabbitmq/OctopusMessage.go @@ -177,7 +177,7 @@ func statusOMHandler(octopusMessage *OctopusMessage) { agentStatusString, _ := json.Marshal(status.ReportAgentMetric()) statusRes = string(agentStatusString) } else if strings.HasPrefix(statusMessage.StatusType, "INFO") { - + log.InfoF("[statusOMHandler] - call for agent info !") } else { log.WarnF("[statusOMHandler] - error octopus status message type of %s", statusMessage.StatusType) } diff --git a/server/pom.xml b/server/pom.xml index d25ff7f..4c05f32 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -35,13 +35,18 @@ org.springframework.boot spring-boot-starter-data-redis + + + lettuce-core + io.lettuce + + - - + + redis.clients + jedis + + org.apache.commons commons-pool2 diff --git a/server/src/main/java/io/wdd/common/config/JedisConfig.java b/server/src/main/java/io/wdd/common/config/JedisConfig.java new file mode 100644 index 0000000..31e0d56 --- /dev/null +++ b/server/src/main/java/io/wdd/common/config/JedisConfig.java @@ -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; + + } +} diff --git a/server/src/main/java/io/wdd/common/utils/TimeUtils.java b/server/src/main/java/io/wdd/common/utils/TimeUtils.java index 2a857e9..24ebb98 100644 --- a/server/src/main/java/io/wdd/common/utils/TimeUtils.java +++ b/server/src/main/java/io/wdd/common/utils/TimeUtils.java @@ -94,7 +94,7 @@ public class TimeUtils { if (ObjectUtils.isEmpty(UNIFORM_TIME)) { UNIFORM_TIME = currentTime(); - return currentFormatTimeString(); + return forwardRoundingTimeString(); } // 旧的时间和新时间之家误差小于5秒,那么使用同一个时间 @@ -105,7 +105,25 @@ public class TimeUtils { } 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); return LocalDateTime.parse(format, ofPattern); - } @@ -131,8 +148,7 @@ public class TimeUtils { */ public static String currentFormatTimeString() { - return currentFormatTime() - .format(DateTimeFormatter.ofPattern(FULL_SPLIT_TIME_FORMAT)); + return localDateTimeFormatString(currentTime()); } public static LocalDateTime cvFromDate(Date date) { @@ -156,23 +172,10 @@ public class TimeUtils { .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" * - * @param time - * @return */ public static String localDateTimeString(LocalDateTime time) { return time.format(DateTimeFormatter.ofPattern(COMMON_TIME_FORMAT)); diff --git a/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java b/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java index c978cbb..cfb18ed 100644 --- a/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java +++ b/server/src/main/java/io/wdd/func/auto/service/AppFuncScheduler.java @@ -100,17 +100,17 @@ public class AppFuncScheduler { ); List appFunctionEnumList = List.of( -// AppFunctionEnum.DEPLOY_CHRONY_SERVER, -// AppFunctionEnum.DEPLOY_RKE - AppFunctionEnum.DEPLOY_K8S_DASHBOARD, - AppFunctionEnum.DEPLOY_NFS, - AppFunctionEnum.DEPLOY_TEST_NFS, - AppFunctionEnum.DEPLOY_K8S_NAMESPACE, - AppFunctionEnum.DEPLOY_K8S_PVC, - AppFunctionEnum.DEPLOY_K8S_MYSQL, - AppFunctionEnum.DEPLOY_K8S_REDIS, - AppFunctionEnum.DEPLOY_K8S_MIDDLEWARES, - AppFunctionEnum.DEPLOY_INGRESS + AppFunctionEnum.DEPLOY_CHRONY_SERVER, + AppFunctionEnum.DEPLOY_RKE +// AppFunctionEnum.DEPLOY_K8S_DASHBOARD, +// AppFunctionEnum.DEPLOY_NFS, +// AppFunctionEnum.DEPLOY_TEST_NFS, +// AppFunctionEnum.DEPLOY_K8S_NAMESPACE, +// AppFunctionEnum.DEPLOY_K8S_PVC, +// AppFunctionEnum.DEPLOY_K8S_MYSQL, +// AppFunctionEnum.DEPLOY_K8S_REDIS, +// AppFunctionEnum.DEPLOY_K8S_MIDDLEWARES, +// AppFunctionEnum.DEPLOY_INGRESS // AppFunctionEnum.DEPLOY_FRONTEND // AppFunctionEnum.DEPLOY_BACKEND // AppFunctionEnum.DEPLOY_K8S_SRS diff --git a/server/src/main/java/io/wdd/rpc/controller/StatusController.java b/server/src/main/java/io/wdd/rpc/controller/StatusController.java index 6362e5b..237d720 100644 --- a/server/src/main/java/io/wdd/rpc/controller/StatusController.java +++ b/server/src/main/java/io/wdd/rpc/controller/StatusController.java @@ -6,7 +6,7 @@ import io.swagger.annotations.ApiOperation; import io.wdd.common.response.R; import io.wdd.rpc.beans.request.MetricQueryEntity; 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 org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -17,7 +17,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import static io.wdd.rpc.status.CommonAndStatusCache.*; +import static io.wdd.rpc.status.AllAgentStatusCache.*; //@RestController @@ -89,7 +89,7 @@ public class StatusController { @ApiOperation("[ Agent-Metric ] 获取Agent的Metric信息") @PostMapping("/agent/metric") - public R> QueryMetricStatus( + public R> QueryMetricStatus( @RequestBody MetricQueryEntity metricQueryEntity ) { diff --git a/server/src/main/java/io/wdd/rpc/execute/service/ExecutionServiceImpl.java b/server/src/main/java/io/wdd/rpc/execute/service/ExecutionServiceImpl.java index 7cca250..d8e6d2a 100644 --- a/server/src/main/java/io/wdd/rpc/execute/service/ExecutionServiceImpl.java +++ b/server/src/main/java/io/wdd/rpc/execute/service/ExecutionServiceImpl.java @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; 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 @Slf4j @@ -173,6 +173,9 @@ public class ExecutionServiceImpl implements ExecutionService { private boolean validateCommandInfo(String agentTopicName) { + // todo remove + ALL_AGENT_TOPIC_NAME_SET.add("Chengdu-amd64-99-3b1609"); + // 检查agentTopicName是否存在 if (!ALL_AGENT_TOPIC_NAME_SET.contains(agentTopicName)) { log.error( diff --git a/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentAliveStatusMonitorService.java b/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentAliveStatusMonitorService.java index 55c4456..13aceea 100644 --- a/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentAliveStatusMonitorService.java +++ b/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentAliveStatusMonitorService.java @@ -1,7 +1,7 @@ package io.wdd.rpc.scheduler.service.status; 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 lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -13,7 +13,7 @@ import javax.annotation.Resource; import java.util.HashMap; 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; /** @@ -28,7 +28,7 @@ public class AgentAliveStatusMonitorService { RedisTemplate redisTemplate; @Resource - CommonAndStatusCache commonAndStatusCache; + AllAgentStatusCache allAgentStatusCache; @Resource SyncStatusService syncStatusService; @@ -42,7 +42,7 @@ public class AgentAliveStatusMonitorService { public void collectAllAgentAliveStatus() { // 1. 获取所有注册的Agent 手动更新 - commonAndStatusCache.updateAllAgentTopicNameCache(); + allAgentStatusCache.commonUpdateAllAgentTopicNameCache(); if (CollectionUtils.isEmpty(ALL_AGENT_TOPIC_NAME_LIST)) { log.warn("[Scheduler] No Agent Registered ! End Up Status Monitor !"); return; @@ -53,7 +53,7 @@ public class AgentAliveStatusMonitorService { // 2023年6月14日 2. 发送ping等待所有的Agent返回PONG, 然后进行redis的状态修改 // 同步的方法, 超时等待所有主机的存活状态 - Map agentAliveStatusMap = syncStatusService.SyncCollectAgentAliveStatus( + Map agentAliveStatusMap = syncStatusService.SyncCheckAgentIsAlive( ALL_AGENT_TOPIC_NAME_LIST, 5 ); @@ -110,7 +110,7 @@ public class AgentAliveStatusMonitorService { String currentTimeString = TimeUtils.currentTimeString(); // 更新 二级缓存 - commonAndStatusCache.updateAgentStatusCache(agentAliveStatusMap); + allAgentStatusCache.updateAgentStatusCache(agentAliveStatusMap); // 更新 一级缓存 // 这里仅仅是更新时间 diff --git a/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentMetricStatusCollectService.java b/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentMetricStatusCollectService.java index 109d25c..43acc7d 100644 --- a/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentMetricStatusCollectService.java +++ b/server/src/main/java/io/wdd/rpc/scheduler/service/status/AgentMetricStatusCollectService.java @@ -3,7 +3,7 @@ package io.wdd.rpc.scheduler.service.status; import com.fasterxml.jackson.core.JsonProcessingException; 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 lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; @@ -13,7 +13,7 @@ import javax.annotation.Resource; import java.util.Map; 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的实际执行类 @@ -41,7 +41,7 @@ public class AgentMetricStatusCollectService { } // 调用核心的服务 - Map agentMetricStatusMap = syncStatusService.SyncCollectAgentMetricStatus( + Map agentMetricStatusMap = syncStatusService.SyncCollectAgentMetricStatus( ALL_HEALTHY_AGENT_TOPIC_NAME_LIST, 10 ); diff --git a/server/src/main/java/io/wdd/rpc/status/CommonAndStatusCache.java b/server/src/main/java/io/wdd/rpc/status/AllAgentStatusCache.java similarity index 57% rename from server/src/main/java/io/wdd/rpc/status/CommonAndStatusCache.java rename to server/src/main/java/io/wdd/rpc/status/AllAgentStatusCache.java index b09f8fb..087c3e7 100644 --- a/server/src/main/java/io/wdd/rpc/status/CommonAndStatusCache.java +++ b/server/src/main/java/io/wdd/rpc/status/AllAgentStatusCache.java @@ -6,8 +6,9 @@ import io.wdd.server.beans.po.ServerInfoPO; import io.wdd.server.coreService.CoreServerService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; import javax.annotation.PostConstruct; import javax.annotation.Resource; @@ -27,7 +28,7 @@ import java.util.stream.Collectors; */ @Service @Slf4j -public class CommonAndStatusCache { +public class AllAgentStatusCache { /** * 存储所有的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 */ - 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 CoreServerService coreServerService; + @Resource - RedisTemplate redisTemplate; + JedisPool jedisPool; @PostConstruct public void InitToGenerateAllStatusCache() { //所有Agent的TopicName ALL_AGENT_TOPIC_NAME_SET - updateAllAgentTopicNameCache(); + commonUpdateAllAgentTopicNameCache(); +// + initUpdateAllAgentStatusCache(); // Agent状态信息的两个Map // 初始化 默认创建全部失败的Map @@ -89,7 +97,65 @@ public class CommonAndStatusCache { 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 initAgentFalseStatusMap = ALL_AGENT_TOPIC_NAME_LIST + .stream() + .collect(Collectors.toMap( + topicName -> topicName, + topicName -> Boolean.FALSE + )); + Map 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> 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 { *

* 2023年7月10日 写入Redis中保存一份 */ - public void updateAllAgentTopicNameCache() { + public void commonUpdateAllAgentTopicNameCache() { //查询DB List allAgentInfo = coreServerService.serverGetAll(); @@ -119,21 +185,22 @@ public class CommonAndStatusCache { ALL_AGENT_TOPIC_NAME_LIST.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()]; ALL_AGENT_TOPIC_NAME_LIST.toArray(all_agent_topic_name_array); - // 2023年7月10日 同步缓存至Redis中 - redisTemplate - .opsForSet() - .add( - ALL_AGENT_TOPIC_NAME_REDIS_KEY, - all_agent_topic_name_array - ); - + jedis.sadd(ALL_AGENT_TOPIC_NAME_SET_REDIS_KEY, all_agent_topic_name_array); } /** + * COMMON-USAGE + * * 根据传入的状态Map更新二级缓存的两个状态Map和健康主机的列表 * ALL_AGENT_STATUS_MAP * STATUS_AGENT_LIST_MAP @@ -189,6 +256,11 @@ public class CommonAndStatusCache { STATUS_UPDATE_TIME_KEY, Collections.singletonList(timeString) ); + // 2023年12月22日 + ALL_AGENT_STATUS_MAP.put( + STATUS_UPDATE_TIME_KEY, + Boolean.TRUE + ); // 缓存相应的存活Agent List allHealthyAgentTopicNames = agentAliveStatusMap @@ -213,12 +285,59 @@ public class CommonAndStatusCache { 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 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 agentAliveStatusMap = null; statusAgentListMap = null; allHealthyAgentTopicNames = null; } + private Map> buildStatusAgentMapFromAgentStatusMap(Map agentStatusMap) { + + // 2023-01-16 2023年12月22日 + // 更新 状态-Agent容器 内容为 + // HEALTHY -> ["agentTopicName-1", "agentTopicName-2"] + // FAILED -> ["agentTopicName-1", "agentTopicName-2"] + Map> 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) { switch (agentStatus) { case "0": diff --git a/server/src/main/java/io/wdd/rpc/status/beans/AgentMetric.java b/server/src/main/java/io/wdd/rpc/status/beans/AgentMetric.java new file mode 100644 index 0000000..421d828 --- /dev/null +++ b/server/src/main/java/io/wdd/rpc/status/beans/AgentMetric.java @@ -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 networkMetricList; + + @JsonProperty("DiskInfo") + private List diskInfoList; + + @JsonProperty("DockerMetric") + private DockerMetric dockerMetric; + +} diff --git a/server/src/main/java/io/wdd/rpc/status/beans/AgentStatus.java b/server/src/main/java/io/wdd/rpc/status/beans/AgentStatus.java deleted file mode 100644 index c6bad73..0000000 --- a/server/src/main/java/io/wdd/rpc/status/beans/AgentStatus.java +++ /dev/null @@ -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; - -} diff --git a/server/src/main/java/io/wdd/rpc/status/beans/CPUMetric.java b/server/src/main/java/io/wdd/rpc/status/beans/CPUMetric.java new file mode 100644 index 0000000..4c01b14 --- /dev/null +++ b/server/src/main/java/io/wdd/rpc/status/beans/CPUMetric.java @@ -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; + } +} diff --git a/server/src/main/java/io/wdd/rpc/status/beans/CPUStatus.java b/server/src/main/java/io/wdd/rpc/status/beans/CPUStatus.java deleted file mode 100644 index 40532c1..0000000 --- a/server/src/main/java/io/wdd/rpc/status/beans/CPUStatus.java +++ /dev/null @@ -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 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; - } -} diff --git a/server/src/main/java/io/wdd/rpc/status/beans/DiskInfo.java b/server/src/main/java/io/wdd/rpc/status/beans/DiskInfo.java new file mode 100644 index 0000000..7a6da87 --- /dev/null +++ b/server/src/main/java/io/wdd/rpc/status/beans/DiskInfo.java @@ -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; +} diff --git a/server/src/main/java/io/wdd/rpc/status/beans/DiskStatus.java b/server/src/main/java/io/wdd/rpc/status/beans/DiskStatus.java deleted file mode 100644 index d58aa3b..0000000 --- a/server/src/main/java/io/wdd/rpc/status/beans/DiskStatus.java +++ /dev/null @@ -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 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 opts; -// } -} diff --git a/server/src/main/java/io/wdd/rpc/status/beans/DockerMetric.java b/server/src/main/java/io/wdd/rpc/status/beans/DockerMetric.java new file mode 100644 index 0000000..bcec462 --- /dev/null +++ b/server/src/main/java/io/wdd/rpc/status/beans/DockerMetric.java @@ -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 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; + } +} diff --git a/server/src/main/java/io/wdd/rpc/status/beans/MemoryStatus.java b/server/src/main/java/io/wdd/rpc/status/beans/MemoryMetric.java similarity index 53% rename from server/src/main/java/io/wdd/rpc/status/beans/MemoryStatus.java rename to server/src/main/java/io/wdd/rpc/status/beans/MemoryMetric.java index c16e8ba..7f4585a 100644 --- a/server/src/main/java/io/wdd/rpc/status/beans/MemoryStatus.java +++ b/server/src/main/java/io/wdd/rpc/status/beans/MemoryMetric.java @@ -6,16 +6,33 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @Data -public class MemoryStatus { +public class MemoryMetric { + + /** + * totalMemory + */ @JsonProperty("TotalMemory") private Long totalMemory; - @JsonProperty("UsedMemory") - private Long usedMemory; + /** + * availableMemory + */ @JsonProperty("AvailableMemory") private Long availableMemory; - @JsonProperty("TotalVirtualMemory") - private Long totalVirtualMemory; - @JsonProperty("UsedVirtualMemory") - private Long usedVirtualMemory; + /** + * usedMemory + */ + @JsonProperty("UsedMemory") + private Long usedMemory; + /** + * usedPercent + */ + @JsonProperty("usedPercent") + private Double usedPercent; + /** + * free + */ + @JsonProperty("free") + private Long free; + } diff --git a/server/src/main/java/io/wdd/rpc/status/beans/NetworkMetric.java b/server/src/main/java/io/wdd/rpc/status/beans/NetworkMetric.java new file mode 100644 index 0000000..6cf7886 --- /dev/null +++ b/server/src/main/java/io/wdd/rpc/status/beans/NetworkMetric.java @@ -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; +} diff --git a/server/src/main/java/io/wdd/rpc/status/beans/NetworkStatus.java b/server/src/main/java/io/wdd/rpc/status/beans/NetworkStatus.java deleted file mode 100644 index 66489d1..0000000 --- a/server/src/main/java/io/wdd/rpc/status/beans/NetworkStatus.java +++ /dev/null @@ -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 internalIpV4; - @JsonProperty("internal_ip_v6") - private List 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; -} diff --git a/server/src/main/java/io/wdd/rpc/status/service/SyncStatusService.java b/server/src/main/java/io/wdd/rpc/status/service/SyncStatusService.java index d9bc4c5..292f4dd 100644 --- a/server/src/main/java/io/wdd/rpc/status/service/SyncStatusService.java +++ b/server/src/main/java/io/wdd/rpc/status/service/SyncStatusService.java @@ -1,7 +1,7 @@ package io.wdd.rpc.status.service; 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.List; @@ -16,7 +16,7 @@ public interface SyncStatusService { * @param aliveStatusWaitMaxTime * @return */ - Map SyncCollectAgentAliveStatus(List agentTopicNameList, int aliveStatusWaitMaxTime); + Map SyncCheckAgentIsAlive(List agentTopicNameList, int aliveStatusWaitMaxTime); /** * 同步收集 节点的运行状态 @@ -25,7 +25,7 @@ public interface SyncStatusService { * @param collectMetricWaitMaxTime * @return */ - Map SyncCollectAgentMetricStatus(List agentTopicNameList, int collectMetricWaitMaxTime); + Map SyncCollectAgentMetricStatus(List agentTopicNameList, int collectMetricWaitMaxTime); /* Metric 调用的后端接口 */ @@ -35,6 +35,6 @@ public interface SyncStatusService { * * @return */ - ArrayList QueryMetricStatus(MetricQueryEntity metricQueryEntity); + ArrayList QueryMetricStatus(MetricQueryEntity metricQueryEntity); } diff --git a/server/src/main/java/io/wdd/server/beans/po/ServerInfoPO.java b/server/src/main/java/io/wdd/server/beans/po/ServerInfoPO.java index b1ac154..3514f09 100644 --- a/server/src/main/java/io/wdd/server/beans/po/ServerInfoPO.java +++ b/server/src/main/java/io/wdd/server/beans/po/ServerInfoPO.java @@ -19,7 +19,7 @@ public class ServerInfoPO implements Serializable { /** * server primary key */ - @TableId(value = "server_id", type = IdType.ASSIGN_ID) + @TableId(value = "server_id", type = IdType.AUTO) private Long serverId; /** diff --git a/server/src/main/java/io/wdd/server/coreService/CoreServerService.java b/server/src/main/java/io/wdd/server/coreService/CoreServerService.java index 27496c3..5bd7656 100644 --- a/server/src/main/java/io/wdd/server/coreService/CoreServerService.java +++ b/server/src/main/java/io/wdd/server/coreService/CoreServerService.java @@ -14,6 +14,7 @@ public interface CoreServerService { List serverGetSingle(String serverName, String ipv4, String serverLocation); + // list all server that are not deleted List serverGetAll(); /** diff --git a/server/src/main/resources/application.yml b/server/src/main/resources/application.yml index 7b6449e..4c70e46 100644 --- a/server/src/main/resources/application.yml +++ b/server/src/main/resources/application.yml @@ -27,31 +27,23 @@ spring: port: 21370 database: 0 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 - # timeout: 50000 + timeout: 50000 #如果用以前的jedis,可以把下面的lettuce换成jedis即可 - lettuce: + jedis: pool: # 连接池最大连接数默认值为8 max-active: 16 # 连接池最大阻塞时间(使用负值表示没有限制)默认值为-1 - max-wait: -1 + max-wait: 1000 # 连接池中最大空闲连接数默认值为8 - max-idle: 10 + max-idle: 16 # 连接池中的最小空闲连接数,默认值为0 - min-idle: 10 + min-idle: 4 time-between-eviction-runs: 50000 + datasource: 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 diff --git a/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java b/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java index 99e1e6d..1326cd3 100644 --- a/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java +++ b/server/src/test/java/io/wdd/server/func/TestBaseFuncScheduler.java @@ -55,7 +55,7 @@ public class TestBaseFuncScheduler { // baseFuncScheduler.runProcedure(projectDeployContext); -// harborFuncScheduler.runProcedure(projectDeployContext); + harborFuncScheduler.runProcedure(projectDeployContext); appFuncScheduler.runProcedure(projectDeployContext); }