From ccf4d796ef2276dee49b8b40bd1e3a48ba95bd41 Mon Sep 17 00:00:00 2001 From: nieziyan Date: Thu, 30 Nov 2023 19:44:51 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=20fix=EF=BC=9Abugs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jeecg/common/util/JDBCUtil.java | 20 ++++++- .../org/jeecg/modules/base/dto/ServerDto.java | 4 +- .../org/jeecg/modules/EmailStatusManager.java | 1 - .../jeecg/modules/ServerStatusManager.java | 6 +- .../controller/AlarmItemController.java | 4 +- .../MonitorExceptionHandler.java | 22 +++++++ .../jeecg/modules/mapper/AlarmItemMapper.java | 3 + .../modules/mapper/xml/AlarmItemMapper.xml | 8 +++ .../modules/mapper/xml/SysServerMapper.xml | 2 +- .../modules/service/IAlarmItemService.java | 2 +- .../service/impl/AlarmItemServiceImpl.java | 30 ++++------ .../service/impl/SysDatabaseServiceImpl.java | 7 ++- .../service/impl/SysServerServiceImpl.java | 59 ++++++++++--------- .../jeecg/JeecgAbnormalAlarmApplication.java | 5 ++ 14 files changed, 119 insertions(+), 54 deletions(-) create mode 100644 jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/exceptionhandler/MonitorExceptionHandler.java diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/JDBCUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/JDBCUtil.java index 4f52301d..50673541 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/JDBCUtil.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/JDBCUtil.java @@ -1,9 +1,11 @@ package org.jeecg.common.util; +import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource; +import javax.sql.DataSource; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; @@ -18,7 +20,11 @@ public class JDBCUtil { dataSource.setDriverClassName(driver); dataSource.setUsername(user); dataSource.setPassword(pass); - return new JdbcTemplate(dataSource); + // 测试数据源是否可以连接成功 + boolean connection = isConnection(dataSource); + if (connection) + return new JdbcTemplate(dataSource); + return null; } public static boolean isConnection(String url, String driver, String user, String pass){ @@ -35,4 +41,16 @@ public class JDBCUtil { return false; } } + + public static boolean isConnection(DriverManagerDataSource dataSource){ + // try-with-resources 无须显式关闭Connection资源 + try (Connection connection = dataSource.getConnection()) { + return true; + } catch (SQLException e) { + String url = "--"; + if (ObjectUtil.isNotNull(dataSource)) url = dataSource.getUrl(); + log.error("JDBCUtil.isConnection():数据源["+ url +"]连接失败: {}", e.getMessage()); + return false; + } + } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/ServerDto.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/ServerDto.java index f4ff9a1e..8942690a 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/ServerDto.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/ServerDto.java @@ -15,7 +15,9 @@ public class ServerDto implements Serializable { private String hostId; - private boolean online; + private boolean online; // 旧状态值 弃用 + + private String status; // 新状态值 private String serverInfo; diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/EmailStatusManager.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/EmailStatusManager.java index b104bc11..20744c38 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/EmailStatusManager.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/EmailStatusManager.java @@ -41,7 +41,6 @@ public class EmailStatusManager { while (true){ try { emailService.status2Redis(); - TimeUnit.MILLISECONDS.sleep(sleepTime); } catch (Exception e) { log.error("EmailStatusManager.run()异常: {}", e.getMessage()); }finally { diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/ServerStatusManager.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/ServerStatusManager.java index 2100f3c5..9b947aa5 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/ServerStatusManager.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/ServerStatusManager.java @@ -3,6 +3,7 @@ package org.jeecg.modules; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.modules.service.ISysDatabaseService; +import org.jeecg.modules.service.ISysServerService; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @@ -20,6 +21,8 @@ public class ServerStatusManager { private long sleepTime; + private ISysServerService serverService; + private ServerStatusThread(){ init(); } @@ -28,7 +31,7 @@ public class ServerStatusManager { public void run() { while (true) { try { - + serverService.status2Redis(); } catch (Exception e) { log.error("ServerStatusManager.run()异常: {}", e.getMessage()); }finally { @@ -43,6 +46,7 @@ public class ServerStatusManager { private void init(){ sleepTime = 30 * 60 * 1000; // 睡眠时间30min + serverService = SpringContextUtils.getBean(ISysServerService.class); } } } diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmItemController.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmItemController.java index 45ac5ced..4a31bf15 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmItemController.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/controller/AlarmItemController.java @@ -29,8 +29,8 @@ public class AlarmItemController extends JeecgController alarmItems(@RequestParam String hostId){ - List alarmItems = service.alarmItems(hostId); + public Result alarmItems(@RequestParam String sourceId){ + List alarmItems = service.alarmItems(sourceId); Map itemIds = alarmItems.stream() .collect(Collectors.toMap(AlarmItem::getName, AlarmItem::getId)); return Result.OK(itemIds); diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/exceptionhandler/MonitorExceptionHandler.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/exceptionhandler/MonitorExceptionHandler.java new file mode 100644 index 00000000..722d5a4c --- /dev/null +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/exceptionhandler/MonitorExceptionHandler.java @@ -0,0 +1,22 @@ +package org.jeecg.modules.exceptionhandler; + +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.controller.SystemMonitorController; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice(assignableTypes = SystemMonitorController.class) +@Slf4j +public class MonitorExceptionHandler { + + @ExceptionHandler(Exception.class) + public ResponseEntity> handleException(Exception e) { + log.error("运管服务调用异常: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.OK) + .body(Result.error("Management system is abnormal, data cannot be displayed")); + } + +} diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/AlarmItemMapper.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/AlarmItemMapper.java index def45235..a5bc6da5 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/AlarmItemMapper.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/AlarmItemMapper.java @@ -3,6 +3,9 @@ package org.jeecg.modules.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.jeecg.modules.base.entity.postgre.AlarmItem; +import java.util.List; + public interface AlarmItemMapper extends BaseMapper { + List alarmItems(String sourceId); } diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/AlarmItemMapper.xml b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/AlarmItemMapper.xml index cee7fb37..4b330790 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/AlarmItemMapper.xml +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/AlarmItemMapper.xml @@ -2,4 +2,12 @@ + \ No newline at end of file diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/SysServerMapper.xml b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/SysServerMapper.xml index 62cd8fe4..3f0e13f8 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/SysServerMapper.xml +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/mapper/xml/SysServerMapper.xml @@ -50,7 +50,7 @@ i.id AS cpuUsedItemId FROM sys_server s - LEFT JOIN alarm_item i ON s.ID = i.source_id AND i.NAME = #{itemName} + LEFT JOIN alarm_item i ON s.host_id = i.host_id AND i.NAME = #{itemName} ORDER BY s.status DESC, s.NAME ASC diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/IAlarmItemService.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/IAlarmItemService.java index 716dc95c..3bdc9156 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/IAlarmItemService.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/IAlarmItemService.java @@ -10,7 +10,7 @@ import java.util.List; public interface IAlarmItemService extends IService { boolean syncServerItem(); - List alarmItems(String hostId); + List alarmItems(String sourceId); List allItems(String sourceType, String sourceId); } diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/AlarmItemServiceImpl.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/AlarmItemServiceImpl.java index 0f342858..bac06722 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/AlarmItemServiceImpl.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/AlarmItemServiceImpl.java @@ -94,23 +94,21 @@ public class AlarmItemServiceImpl extends ServiceImpl hosts = monitorAlarm.listApp(MonitorConstant.SERVER_APP).getResult().getRecords(); // 获取所有服务器信息 List servers = serverService.list(); List hostIds = servers.stream().map(SysServer::getHostId).filter(StrUtil::isNotBlank) .collect(Collectors.toList()); - // 获取所有监控服务器信息(不包括数据库服务) - List hosts = monitorAlarm.listApp(MonitorConstant.SERVER_APP).getResult().getRecords(); - // 收集监控服务器列表中当前系统录入的服务器 - hosts = hosts.stream().filter(host -> CollUtil.contains(hostIds, host.getHostId())) + // 收集监控服务器列表中当前系统录入的服务器 并将收集所有监控项 + List items = hosts.stream().filter(host -> CollUtil.contains(hostIds, host.getHostId())) + .flatMap(host -> host.getItems().values().stream()) .collect(Collectors.toList()); List alarmItems = new ArrayList<>(); - for (Host host : hosts) { - List items = ListUtil.toList(host.getItems().values()); - for (Item item : items) { - AlarmItem alarmItem = BeanUtil.copyProperties(item, AlarmItem.class); - alarmItem.setId(item.getItemId()); - alarmItems.add(alarmItem); - } + for (Item item : items) { + AlarmItem alarmItem = BeanUtil.copyProperties(item, AlarmItem.class); + alarmItem.setId(item.getItemId()); + alarmItems.add(alarmItem); } return saveOrUpdateBatch(alarmItems); }catch (Exception e){ @@ -120,17 +118,13 @@ public class AlarmItemServiceImpl extends ServiceImpl alarmItems(String hostId) { - if (StrUtil.isBlank(hostId)) - return new ArrayList<>(); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(AlarmItem::getHostId, hostId); - return list(wrapper); + public List alarmItems(String sourceId) { + return baseMapper.alarmItems(sourceId); } /* diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/SysDatabaseServiceImpl.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/SysDatabaseServiceImpl.java index 96b426b4..8eca574a 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/SysDatabaseServiceImpl.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/SysDatabaseServiceImpl.java @@ -228,6 +228,7 @@ public class SysDatabaseServiceImpl extends ServiceImpl mapper = new SpaceRowMapper(); JdbcTemplate template = JDBCUtil.template(dbUrl, dbDriver, dbUsername, dbPassword); + if(ObjectUtil.isNull(template)) return spaceInfos; spaceInfos = template.query(DBSQL.SPACE_OR, mapper); } return spaceInfos; @@ -334,9 +337,11 @@ public class SysDatabaseServiceImpl extends ServiceImpl dbInfos = new ArrayList<>(); JdbcTemplate template = JDBCUtil.template(dbUrl, dbDriver, dbUsername, dbPassword); + if(ObjectUtil.isNull(template)) return dbInfos; // 查询当前所连接的数据库的表信息 - List dbInfos = template.query(DBSQL.DBINFO_PG, mapper); + dbInfos = template.query(DBSQL.DBINFO_PG, mapper); List dbRowNum = template.query(DBSQL.DBROWNUM_PG, mapper); Map rowNum = dbRowNum.stream() .collect(Collectors.toMap(DBInfo::getTableName, DBInfo::getNumRow)); diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/SysServerServiceImpl.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/SysServerServiceImpl.java index 06b2ec77..e716279c 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/SysServerServiceImpl.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/service/impl/SysServerServiceImpl.java @@ -80,29 +80,35 @@ public class SysServerServiceImpl extends ServiceImpl转换为Map + Map hostMap = hosts.stream().collect(Collectors.toMap(Host::getHostId, Host -> Host)); + // 获取服务器状态信息 + Map statusMap = redisUtil.hmget(RedisConstant.SERVER_STATUS); for (ServerDto serverDto : serverDtos) { int alarms = serverDto.getAlarms(); - String hostIdS = serverDto.getHostId(); + String id = serverDto.getId(); + String hostId = serverDto.getHostId(); serverDto.setAlarmRed(alarms > 0); - for (Host host : hosts) { - String hostId = host.getHostId(); - if (!StrUtil.equals(hostIdS, hostId)) continue; - - Map items = host.getItems(); - // cpu利用率 - Item cpuItem = items.getOrDefault(MonitorConstant.ITEM_CPUUSED, new Item()); - String cpuValue = cpuItem.getLastValue(); - String cpu = StrUtil.isBlank(cpuValue) ? "--" : - NumberUtil.formatPercent(Double.parseDouble(cpuValue), 1); - // 内存使用率 - Item memoryItem = items.getOrDefault(MonitorConstant.ITEM_MEMORYUSED, new Item()); - String memoryValue = memoryItem.getLastValue(); - String memory = StrUtil.isBlank(memoryValue) ? "--" : - NumUtil.keepStr(memoryValue, 1) + "%"; - // 磁盘使用率 - serverDto.setOnline(true).setCpuUutilzation(cpu) - .setMemoryUsage(memory).setDiskUsage("--"); - } + // 设置服务器状态信息 + serverDto.setStatus((String) statusMap.getOrDefault(id, ServerStatus.UNKNOWN.getValue())); + // 设置服务器的硬件使用情况信息 + Host host = hostMap.get(hostId); + if (ObjectUtil.isNull(host)) + continue; + Map items = host.getItems(); + // cpu利用率 + Item cpuItem = items.getOrDefault(MonitorConstant.ITEM_CPUUSED, new Item()); + String cpuValue = cpuItem.getLastValue(); + String cpu = StrUtil.isBlank(cpuValue) ? "--" : + NumberUtil.formatPercent(Double.parseDouble(cpuValue), 1); + // 内存使用率 + Item memoryItem = items.getOrDefault(MonitorConstant.ITEM_MEMORYUSED, new Item()); + String memoryValue = memoryItem.getLastValue(); + String memory = StrUtil.isBlank(memoryValue) ? "--" : + NumUtil.keepStr(memoryValue, 1) + "%"; + // 磁盘使用率 + serverDto.setOnline(true).setCpuUutilzation(cpu) + .setMemoryUsage(memory).setDiskUsage("--"); } // 统计Alarm总数 // int alarms = noPage.stream().mapToInt(ServerDto::getAlarms).sum(); @@ -300,16 +306,15 @@ public class SysServerServiceImpl extends ServiceImpl values = new HashMap<>(); try { - Servers servers = monitorAlarm.listApp(MonitorConstant.SERVER_APP).getResult(); - List hosts = servers.getRecords(); + List hosts = monitorAlarm.listApp(MonitorConstant.SERVER_APP).getResult().getRecords(); + Map hostMap = hosts.stream().collect(Collectors.toMap(Host::getHostId, Host -> Host)); for (SysServer server : sysServers) { String hostId = server.getHostId(); String serverId = server.getId(); - Optional first = hosts.stream().filter(item -> StrUtil.equals(hostId, item.getHostId())).findFirst(); - // 如果当前服务器在监控服务器列表 则获取该服务器的状态并保存 - if (first.isPresent()) { - String status = first.get().getStatus(); - values.put(serverId, status); + Host host = hostMap.get(hostId); + // 获取该服务器的状态并保存 + if (ObjectUtil.isNotNull(host)) { + values.put(serverId, host.getStatus()); continue; } // 当前服务器不在监控服务器列表 将它的状态设置为未知 diff --git a/jeecg-server-cloud/armd-abnormal-alarm-start/src/main/java/org/jeecg/JeecgAbnormalAlarmApplication.java b/jeecg-server-cloud/armd-abnormal-alarm-start/src/main/java/org/jeecg/JeecgAbnormalAlarmApplication.java index ae0d1469..c4d82d26 100644 --- a/jeecg-server-cloud/armd-abnormal-alarm-start/src/main/java/org/jeecg/JeecgAbnormalAlarmApplication.java +++ b/jeecg-server-cloud/armd-abnormal-alarm-start/src/main/java/org/jeecg/JeecgAbnormalAlarmApplication.java @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.DatabaseStatusManager; import org.jeecg.modules.EmailStatusManager; +import org.jeecg.modules.ServerStatusManager; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -25,6 +26,8 @@ import java.net.UnknownHostException; @RequiredArgsConstructor public class JeecgAbnormalAlarmApplication extends SpringBootServletInitializer implements CommandLineRunner { + private final ServerStatusManager serverStatusManager; + private final EmailStatusManager emailStatusManager; private final DatabaseStatusManager databaseStatusManager; @@ -54,6 +57,8 @@ public class JeecgAbnormalAlarmApplication extends SpringBootServletInitializer databaseStatusManager.start(); // 启动监测邮箱服务器连接状态的线程 emailStatusManager.start(); + // 启动监测服务器连接状态的线程 + serverStatusManager.start(); } } \ No newline at end of file