diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MonitorConstant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MonitorConstant.java index a15cef67..51312ff7 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MonitorConstant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/MonitorConstant.java @@ -2,6 +2,10 @@ package org.jeecg.common.constant; public interface MonitorConstant { + Integer pageNo = 1; + + Integer pageSize = 99; + // 监控项名称 String ITEM_CPUUSED = "cpuUtilization"; String ITEM_SWAPUSED = "swapUtilization"; 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 0c1d3b4f..d8c25131 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 @@ -60,7 +60,6 @@ public class JDBCUtil { try (Connection connection = dataSource.getConnection()) { return new ConnR().setConn(true); } catch (SQLException e) { - // String message = String.format("[xxx数据源]连接失败: %s", e.getMessage()); return new ConnR().setInfo(e.getMessage()); } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ParamUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ParamUtil.java new file mode 100644 index 00000000..db2d4c96 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ParamUtil.java @@ -0,0 +1,19 @@ +package org.jeecg.common.util; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import java.util.HashMap; +import java.util.Map; + +public class ParamUtil { + + public static Map set(Object... value){ + Map data = MapUtil.newHashMap(); + if (ArrayUtil.isEmpty(value)) + return data; + for (int i = 0; i < value.length; i++) { + data.put("param" + (i + 1), value[i]); + } + return data; + } +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/monitor/Servers.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/monitor/Servers.java deleted file mode 100644 index cf589ab9..00000000 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/monitor/Servers.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.jeecg.modules.base.entity.monitor; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class Servers implements Serializable { - - private List records; -} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/enums/Template.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/enums/Template.java new file mode 100644 index 00000000..1f225c40 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/enums/Template.java @@ -0,0 +1,13 @@ +package org.jeecg.modules.base.enums; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum Template { + IDC_DATASOURCE_STATUS("IDC_Datasource_Status"); + + private final String code; +} diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/aspect/StatusAspect.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/aspect/StatusAspect.java index 2dda0e0b..4854cfdc 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/aspect/StatusAspect.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/aspect/StatusAspect.java @@ -1,14 +1,19 @@ package org.jeecg.modules.aspect; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.netease.qiye.qiyeopenplatform.sdk.QiyeOpenPlatSDK; import feign.FeignException; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.MonitorConstant; import org.jeecg.common.constant.RedisConstant; import org.jeecg.common.constant.SymbolConstant; @@ -17,7 +22,8 @@ import org.jeecg.common.util.JDBCUtil; import org.jeecg.common.util.RedisUtil; import org.jeecg.modules.base.dto.NameValue; import org.jeecg.modules.base.entity.monitor.Host; -import org.jeecg.modules.base.entity.monitor.Servers; +import org.jeecg.modules.base.entity.monitor.Item; +import org.jeecg.modules.base.entity.postgre.AlarmItem; import org.jeecg.modules.base.entity.postgre.SysDatabase; import org.jeecg.modules.base.entity.postgre.SysEmail; import org.jeecg.modules.base.entity.postgre.SysServer; @@ -28,15 +34,15 @@ import org.jeecg.modules.qiyeEmail.base.InstanceSDK; import org.jeecg.modules.qiyeEmail.base.RParam; import org.jeecg.modules.qiyeEmail.base.dto.AccountInfo; import org.jeecg.modules.qiyeEmail.service.Account; -import org.jeecg.modules.service.IAlarmRuleService; -import org.jeecg.modules.service.ISysDatabaseService; -import org.jeecg.modules.service.ISysEmailService; -import org.jeecg.modules.service.ISysServerService; +import org.jeecg.modules.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import static org.jeecg.modules.base.enums.Qiye.IS; @@ -64,6 +70,9 @@ public class StatusAspect { @Autowired private IAlarmRuleService alarmRuleService; + @Autowired + private IAlarmItemService alarmItemService; + // 新增|修改邮箱服务器信息后 异步更新其状态信息 @Async @AfterReturning("execution(* org.jeecg.modules.service.impl.SysEmailServiceImpl.update(..)) || " + @@ -106,20 +115,43 @@ public class StatusAspect { String ipAddress = server.getIpAddress(); try { String token = ManageUtil.getToken(); - Servers servers = monitorAlarm.listApp(ipAddress, MonitorConstant.SERVER_APP, token).getResult(); - // 获取所有监控主机信息 - List hosts = servers.getRecords(); - for (Host host : hosts) { - String code = host.getCode(); - if (!StrUtil.equals(ipAddress, code)) - continue; - server.setHostId(host.getHostId()); - status = host.getStatus(); + Page hostPage = monitorAlarm.listApp(ipAddress, MonitorConstant.SERVER_APP, + MonitorConstant.pageNo, MonitorConstant.pageSize, token).getResult(); + if (ObjectUtil.isNull(hostPage) || CollUtil.isEmpty(hostPage.getRecords())){ + redisUtil.hset(key, id, new NameValue(name, status)); + return; } + List hosts = hostPage.getRecords(); + Host host = null; + for (Host oneHost : hosts) { + String code = oneHost.getCode(); + if (StrUtil.equals(ipAddress, code)) + host = oneHost; + } + if (ObjectUtil.isNull(host)){ + redisUtil.hset(key, id, new NameValue(name, status)); + return; + } + status = host.getStatus(); + String hostId = host.getHostId(); + server.setHostId(hostId); // 更新该服务器状态信息 redisUtil.hset(key, id, new NameValue(name, status)); // 更新该服务器的HostId serverService.updateById(server); + // 同步服务器监控项 + Page itemPage = monitorAlarm.allItems(hostId, + MonitorConstant.pageNo, MonitorConstant.pageSize, token).getResult(); + if (ObjectUtil.isNull(itemPage) || CollUtil.isEmpty(itemPage.getRecords())) + return; + List items = itemPage.getRecords(); + List alarmItems = new ArrayList<>(); + items.forEach(item -> { + AlarmItem alarmItem = BeanUtil.copyProperties(item, AlarmItem.class); + alarmItem.setId(item.getItemId()); + alarmItems.add(alarmItem); + }); + alarmItemService.saveOrUpdateBatch(alarmItems); }catch (FeignException.Unauthorized e){ ManageUtil.refreshToken(); log.warn("向运管系统查询Hosts信息异常: Token失效,已刷新Token"); @@ -129,15 +161,32 @@ public class StatusAspect { } /* - * 删除Email|Database|Server时 同步删除Redis和数据库中相关联的预警规则 - * */ + * Server时 同步删除数据库中相关联的监控项&报警规则 + * */ @Async - @AfterReturning("execution(* org.jeecg.modules.service.impl.SysServerServiceImpl.deleteById(..)) ||" + - "execution(* org.jeecg.modules.service.impl.SysEmailServiceImpl.deleteById(..)) || " + - "execution(* org.jeecg.modules.service.impl.SysDatabaseServiceImpl.deleteById(..))") - public void deleteRules(JoinPoint point){ + @AfterReturning(value = "execution(* org.jeecg.modules.service.impl.SysServerServiceImpl.deleteById(..))", returning = "result") + public void deleteItems(JoinPoint point, Object result){ + if (ObjectUtil.isNotNull(result)){ + String hostId = ((Result) result).getResult(); + // 删除服务器相关联的监控项 + alarmItemService.deleteByHostId(hostId); + } + // 删除服务器相关联的报警规则 Object[] args = point.getArgs(); if (ArrayUtil.length(args) > 0) alarmRuleService.deleteBySourceId((String) args[0]); } + + /* + * 删除Email|Database时 同步删除Redis和数据库中相关联的预警规则 + * */ + @Async + @AfterReturning("execution(* org.jeecg.modules.service.impl.SysEmailServiceImpl.deleteById(..)) || " + + "execution(* org.jeecg.modules.service.impl.SysDatabaseServiceImpl.deleteById(..))") + public void deleteRules(JoinPoint point){ + Object[] args = point.getArgs(); + // 删除数据库和邮箱相关联的报警规则 + if (ArrayUtil.length(args) > 0) + alarmRuleService.deleteBySourceId((String) args[0]); + } } diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/feignclient/MonitorAlarm.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/feignclient/MonitorAlarm.java index 638e7a25..c01fa34c 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/feignclient/MonitorAlarm.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/feignclient/MonitorAlarm.java @@ -1,15 +1,19 @@ package org.jeecg.modules.feignclient; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import kotlin.reflect.jvm.internal.impl.descriptors.Visibilities; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.base.dto.LoginResult; import org.jeecg.modules.base.dto.LoginVo; import org.jeecg.modules.base.entity.monitor.Host; +import org.jeecg.modules.base.entity.monitor.Item; import org.jeecg.modules.base.entity.monitor.ItemHistory; -import org.jeecg.modules.base.entity.monitor.Servers; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.*; +import java.util.List; + @Component @FeignClient(name = "monitorAlarm", url = "${monitor.url}") public interface MonitorAlarm { @@ -20,18 +24,30 @@ public interface MonitorAlarm { // --------------------后端专用------------------- @GetMapping("/omms/device/monitor/list") // 获取所有 服务器/数据库服务 信息 - Result listApp(@RequestParam("type") String type, - @RequestHeader("X-Access-Token") String token); + Result> listApp(@RequestParam("type") String type, + @RequestParam("pageNo") Integer pageNo, + @RequestParam("pageSize") Integer pageSize, + @RequestHeader("X-Access-Token") String token); @GetMapping("/omms/device/monitor/list") // 获取所有 服务器/数据库服务 信息 - Result listApp(@RequestParam("code") String code, - @RequestParam("type") String type, - @RequestHeader("X-Access-Token") String token); + Result> listApp(@RequestParam("code") String code, + @RequestParam("type") String type, + @RequestParam("pageNo") Integer pageNo, + @RequestParam("pageSize") Integer pageSize, + @RequestHeader("X-Access-Token") String token); @GetMapping("/omms/device/monitor/list") // 获取所有在线 服务器/数据库服务 信息 - Result listOnApp(@RequestParam("status") String status, - @RequestParam("type") String type, - @RequestHeader("X-Access-Token") String token); + Result> listOnApp(@RequestParam("status") String status, + @RequestParam("type") String type, + @RequestParam("pageNo") Integer pageNo, + @RequestParam("pageSize") Integer pageSize, + @RequestHeader("X-Access-Token") String token); + + @GetMapping("/omms/device/monitor/queryAllItems") + Result> allItems(@RequestParam("hostId") String hostId, + @RequestParam("pageNo") Integer pageNo, + @RequestParam("pageSize") Integer pageSize, + @RequestHeader("X-Access-Token") String token); @GetMapping("/omms/device/monitor/queryHostDetails") // 获取服务器摘要信息 Result summary(@RequestParam("hostId") String hostId, @@ -98,9 +114,10 @@ public interface MonitorAlarm { @RequestParam String status, @RequestHeader("X-Access-Token") String token); - // 数据库相关 + // -------------------------------------------数据库相关----------------------------------------------------- @GetMapping("/omms/monitor/db/item/detail") - Result dbDetail(@RequestHeader("X-Access-Token") String token); + Result dbDetail(@RequestParam("hostId") String hostId, + @RequestHeader("X-Access-Token") String token); @GetMapping("/omms/monitor/db/list") Result dbList(@RequestHeader("X-Access-Token") String token); diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/idc/IDCDataFetch.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/idc/IDCDataFetch.java index 8429efcb..59dee1db 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/idc/IDCDataFetch.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/idc/IDCDataFetch.java @@ -1,5 +1,6 @@ package org.jeecg.modules.idc; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -7,6 +8,7 @@ import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.config.mqtoken.UserTokenContext; import org.jeecg.common.constant.enums.MessageTypeEnum; import org.jeecg.common.util.JDBCUtil; +import org.jeecg.common.util.ParamUtil; import org.jeecg.modules.base.dto.ConnR; import org.jeecg.modules.feignclient.SystemClient; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +24,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import static org.jeecg.common.util.TokenUtils.getTempToken; +import static org.jeecg.modules.base.enums.Template.IDC_DATASOURCE_STATUS; @Component @Slf4j @@ -52,7 +55,7 @@ public class IDCDataFetch { @Scheduled(fixedDelayString = "${request-interval}", timeUnit = TimeUnit.SECONDS) public void fetch() { JdbcTemplate template; - MessageDTO messageDTO = new MessageDTO("IDC数据源异常", "IDC_Datasource_Status", "admin"); + MessageDTO messageDTO = new MessageDTO(null, IDC_DATASOURCE_STATUS.getCode(), "admin"); messageDTO.setType(MessageTypeEnum.XT.getType()); ConnR connR = JDBCUtil.isConnection(urlM, usernameM, passwordM); if (connR.isConn()) { @@ -69,11 +72,9 @@ public class IDCDataFetch { // 对发送警告消息时可能出现的异常进行捕获(503) 防止影响后续代码执行 try { // 给管理员发送预警信息 - /*String message = StrUtil.replace(connR.getInfo(), "xxx", "inland"); - messageDTO.setContent(message);*/ Map data = new HashMap<>(); - data.put("datasource", "inland(测试)"); - data.put("info", connR.getInfo()); + data.put("param1", "inland"); + data.put("param2", connR.getInfo()); messageDTO.setData(data); systemClient.sendTo(messageDTO); }catch (Exception e){ @@ -93,8 +94,8 @@ public class IDCDataFetch { } try { // 给管理员发送预警信息 - String message = StrUtil.replace(connR.getInfo(), "xxx", "oversea"); - messageDTO.setContent(message); + Map data = ParamUtil.set("oversea", connR.getInfo()); + messageDTO.setData(data); systemClient.sendTo(messageDTO); }catch (Exception e){ log.error("发送oversea数据源异常信息失败: {}", e.getMessage()); 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 4b330790..03eb4e23 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 @@ -1,7 +1,6 @@ -