diff --git a/src/main/java/org/springblade/modules/monitor/controller/BusinessMonitorController.java b/src/main/java/org/springblade/modules/monitor/controller/BusinessMonitorController.java index 5c163a4..4f948ae 100644 --- a/src/main/java/org/springblade/modules/monitor/controller/BusinessMonitorController.java +++ b/src/main/java/org/springblade/modules/monitor/controller/BusinessMonitorController.java @@ -1,13 +1,20 @@ package org.springblade.modules.monitor.controller; import lombok.RequiredArgsConstructor; +import org.apache.commons.collections.map.HashedMap; import org.springblade.core.tool.api.R; import org.springblade.modules.monitor.service.IBusinessMonitorService; +import org.springblade.modules.monitor.service.IConfigMonitorService; +import org.springblade.modules.monitor.vo.ConfigMonitorVO; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * 业务监控控制器 * @@ -19,6 +26,19 @@ import org.springframework.web.bind.annotation.RestController; public class BusinessMonitorController { private final IBusinessMonitorService businessMonitorService; + private final IConfigMonitorService monitorService; + + /** + * 根据服务类型code,查询该服务下的所有通讯链路及报警节点 + * + * @param serviceCode + * @return + */ + @GetMapping("/getWarnPoint") + public R getWarnPoint(@RequestParam("serviceCode") String serviceCode) { + return R.data(monitorService.getWarnLinePoint(serviceCode)); + } + /** * 根据设备类型和报警节点查询排查方法 * diff --git a/src/main/java/org/springblade/modules/monitor/entity/ConfigMonitor.java b/src/main/java/org/springblade/modules/monitor/entity/ConfigMonitor.java index f2ba25e..68d2024 100644 --- a/src/main/java/org/springblade/modules/monitor/entity/ConfigMonitor.java +++ b/src/main/java/org/springblade/modules/monitor/entity/ConfigMonitor.java @@ -100,6 +100,11 @@ public class ConfigMonitor extends BaseEntity { @ApiModelProperty("创建部门") private Long createDept; + /** + * 图标 + */ + @ApiModelProperty(value = "图标") + private String icon; /** * 服务颜色 */ diff --git a/src/main/java/org/springblade/modules/monitor/service/IConfigMonitorService.java b/src/main/java/org/springblade/modules/monitor/service/IConfigMonitorService.java index ecc5b09..7d66e58 100644 --- a/src/main/java/org/springblade/modules/monitor/service/IConfigMonitorService.java +++ b/src/main/java/org/springblade/modules/monitor/service/IConfigMonitorService.java @@ -16,11 +16,14 @@ */ package org.springblade.modules.monitor.service; +import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.extension.service.IService; +import com.google.gson.JsonArray; import org.springblade.modules.monitor.entity.ConfigMonitor; import org.springblade.modules.monitor.vo.ConfigMonitorVO; import java.util.List; +import java.util.Map; /** * 服务器监控基础配置表 服务类 @@ -40,4 +43,6 @@ public interface IConfigMonitorService extends IService { * @return */ List tree(); + + Object getWarnLinePoint(String parentId); } diff --git a/src/main/java/org/springblade/modules/monitor/service/impl/ConfigMonitorServiceImpl.java b/src/main/java/org/springblade/modules/monitor/service/impl/ConfigMonitorServiceImpl.java index f7b5580..4e0f375 100644 --- a/src/main/java/org/springblade/modules/monitor/service/impl/ConfigMonitorServiceImpl.java +++ b/src/main/java/org/springblade/modules/monitor/service/impl/ConfigMonitorServiceImpl.java @@ -16,11 +16,15 @@ */ package org.springblade.modules.monitor.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.JsonArray; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; @@ -135,108 +139,179 @@ public class ConfigMonitorServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(ConfigMonitor::getId,id); - wrapper.eq(BaseEntity::getIsDeleted,0); - ConfigMonitor configMonitor = baseMapper.selectOne(wrapper); - //服务排查 - if(configMonitor.getType().equals(MonitorConstant.SERVICE) && configMonitor.getResult().equals(MonitorConstant.RESULT)){ - flag = false; - configMonitor.setStatus(MonitorConstant.STATUS_2); - configMonitor.setUpdateTime(nowDate); - baseMapper.updateById(configMonitor); - parentId = id; - continue; - } - //mqtt服务排查 - if(configMonitor.getType().equals(MonitorConstant.MIDDLEWARE) && configMonitor.getMonitorType().equals(MonitorConstant.MQTT)){ - //通过查询所有mqtt相关设备来判断mqtt服务是否正常 - int count = baseMapper.findMqttEquipCount(DateFormatUtils.format(time,"yyyy-MM-dd HH:mm:ss")); - //如果count=0说明所有mqtt相关设备都没取到数,可证明mqtt出现问题 - if(count == 0){ - flag = false; - parentId = id; - configMonitor.setStatus(MonitorConstant.STATUS_2); - configMonitor.setUpdateTime(nowDate); - baseMapper.updateById(configMonitor); - continue; - } - } - //网关排查 --适用于modbus 空调面板 lora网关;mqtt dtu;http 空开照明 通讯模块; - if(configMonitor.getType().equals(MonitorConstant.MIDDLEWARE) && configMonitor.getMonitorType().equals(MonitorConstant.GATEWAY) && StringUtils.isNotEmpty(configMonitor.getIp())){ - //ping网关ip,如果能ping通,则证明是网关本身有问题,如果ping不通,说明通信有问题 - boolean isNormal = IpUtil.isIPReachable(configMonitor.getIp()); - if(isNormal){ - configMonitor.setStatus(MonitorConstant.STATUS_2); - }else{ - configMonitor.setStatus(MonitorConstant.STATUS_3); - } - configMonitor.setUpdateTime(nowDate); - baseMapper.updateById(configMonitor); - } - }else{ - //如果是静默,根据parentId将所有子节点状态改为静默 - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(ConfigMonitor::getParentId,parentId); - ConfigMonitor configMonitor = new ConfigMonitor(); - configMonitor.setStatus(MonitorConstant.STATUS_4); - //configMonitor.setUpdateTime(nowDate); - baseMapper.update(configMonitor,updateWrapper); - parentId = id; - } - } - //将所有设备状态改为静默 - breakList.forEach(item ->{ - item.setStatus(MonitorConstant.STATUS_4); - //item.setUpdateTime(nowDate); - baseMapper.updateById(item); - }); - }else{ - for(ConfigMonitor configMonitor : breakList){ - configMonitor.setStatus(MonitorConstant.STATUS_2); - baseMapper.updateById(configMonitor); - } - //将父级id设备状态更新为正常 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(ConfigMonitor::getId,parentId); - wrapper.eq(BaseEntity::getIsDeleted,0); - ConfigMonitor configMonitor = baseMapper.selectOne(wrapper); - configMonitor.setStatus(MonitorConstant.STATUS_1); - baseMapper.updateById(configMonitor); - } - } + if (breakList.size() == monitorList.size()) { + boolean flag = true; + for (Long id : parentIdList) { + //通过标识位来判断当前是否应该静默 + if (flag) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ConfigMonitor::getId, id); + wrapper.eq(BaseEntity::getIsDeleted, 0); + ConfigMonitor configMonitor = baseMapper.selectOne(wrapper); + //服务排查 + if (configMonitor.getType().equals(MonitorConstant.SERVICE) && configMonitor.getResult().equals(MonitorConstant.RESULT)) { + flag = false; + configMonitor.setStatus(MonitorConstant.STATUS_2); + configMonitor.setUpdateTime(nowDate); + baseMapper.updateById(configMonitor); + parentId = id; + continue; + } + //mqtt服务排查 + if (configMonitor.getType().equals(MonitorConstant.MIDDLEWARE) && configMonitor.getMonitorType().equals(MonitorConstant.MQTT)) { + //通过查询所有mqtt相关设备来判断mqtt服务是否正常 + int count = baseMapper.findMqttEquipCount(DateFormatUtils.format(time, "yyyy-MM-dd HH:mm:ss")); + //如果count=0说明所有mqtt相关设备都没取到数,可证明mqtt出现问题 + if (count == 0) { + flag = false; + parentId = id; + configMonitor.setStatus(MonitorConstant.STATUS_2); + configMonitor.setUpdateTime(nowDate); + baseMapper.updateById(configMonitor); + continue; + } + } + //网关排查 --适用于modbus 空调面板 lora网关;mqtt dtu;http 空开照明 通讯模块; + if (configMonitor.getType().equals(MonitorConstant.MIDDLEWARE) && configMonitor.getMonitorType().equals(MonitorConstant.GATEWAY) && StringUtils.isNotEmpty(configMonitor.getIp())) { + //ping网关ip,如果能ping通,则证明是网关本身有问题,如果ping不通,说明通信有问题 + boolean isNormal = IpUtil.isIPReachable(configMonitor.getIp()); + if (isNormal) { + configMonitor.setStatus(MonitorConstant.STATUS_2); + } else { + configMonitor.setStatus(MonitorConstant.STATUS_3); + } + configMonitor.setUpdateTime(nowDate); + baseMapper.updateById(configMonitor); + } + } else { + //如果是静默,根据parentId将所有子节点状态改为静默 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(ConfigMonitor::getParentId, parentId); + ConfigMonitor configMonitor = new ConfigMonitor(); + configMonitor.setStatus(MonitorConstant.STATUS_4); + //configMonitor.setUpdateTime(nowDate); + baseMapper.update(configMonitor, updateWrapper); + parentId = id; + } + } + //将所有设备状态改为静默 + breakList.forEach(item -> { + item.setStatus(MonitorConstant.STATUS_4); + //item.setUpdateTime(nowDate); + baseMapper.updateById(item); + }); + } else { + for (ConfigMonitor configMonitor : breakList) { + configMonitor.setStatus(MonitorConstant.STATUS_2); + baseMapper.updateById(configMonitor); + } + //将父级id设备状态更新为正常 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ConfigMonitor::getId, parentId); + wrapper.eq(BaseEntity::getIsDeleted, 0); + ConfigMonitor configMonitor = baseMapper.selectOne(wrapper); + configMonitor.setStatus(MonitorConstant.STATUS_1); + baseMapper.updateById(configMonitor); + } + } - } - @Override - public List tree() { - return ForestNodeMerger.merge(baseMapper.tree()); - } + } - public List getParentIdList(List parentIdList,Long parentId){ - parentIdList.add(parentId); - if(parentId != 0){ - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(ConfigMonitor::getId,parentId); - queryWrapper.eq(BaseEntity::getIsDeleted,0); - ConfigMonitor configMonitor = baseMapper.selectOne(queryWrapper); - parentId = configMonitor.getParentId(); - //服务器不需要排查,所以只需要到服务层面就可以 - if(configMonitor.getType().equals(MonitorConstant.SERVICE)){ - return parentIdList; - } - getParentIdList(parentIdList,parentId); - } - return parentIdList; - } + @Override + public List tree() { + return ForestNodeMerger.merge(baseMapper.tree()); + } + + @Override + public Object getWarnLinePoint(String parentId) { + // 先查询该微服务 + List resultList = new ArrayList(); + ConfigMonitor monitor = baseMapper.selectOne(Wrappers.lambdaQuery().eq(ConfigMonitor::getId, parentId)); + + if (monitor == null) { + return resultList; + } + JSONObject monitorJson = new JSONObject(); + monitorJson.put("parent", null); + monitorJson.put("id", monitor.getId()); + monitorJson.put("name", monitor.getMonitorType()); + monitorJson.put("type", monitor.getType()); + monitorJson.put("class_code", monitor.getClassCode()); + monitorJson.put("status", monitor.getStatus()); + monitorJson.put("icon", monitor.getIcon()); + + // 递归查询该微服务下的所有设备 + JSONArray allEquipArray = getChildList(monitorJson); + + // 遍历设备组织返回数据 + JSONObject resultObj = new JSONObject(); + for (Object o : allEquipArray) { + JSONObject item = JSONObject.parseObject(JSON.toJSONString(o)); + resultObj.put("classCode", item.getString("class_code")); + resultObj.put("lineData", getLineData(item)); + resultList.add(resultObj); + } + return resultList.stream().distinct().collect(Collectors.toList()); + } + + private JSONArray getChildList(JSONObject parent) { + JSONArray resultArray = new JSONArray(); + // 查询子等级的设备 + List monitor1List = baseMapper.selectList(Wrappers.lambdaQuery().eq(ConfigMonitor::getParentId, parent.getLong("id"))); + if (monitor1List == null || monitor1List.size() == 0) { + resultArray.add(parent); + return resultArray; + } else { + for (ConfigMonitor monitor : monitor1List) { + JSONObject monitorJson = new JSONObject(); + monitorJson.put("parent", parent); + monitorJson.put("id", monitor.getId()); + monitorJson.put("name", monitor.getMonitorType()); + monitorJson.put("type", monitor.getType()); + monitorJson.put("class_code", monitor.getClassCode()); + monitorJson.put("status", monitor.getStatus()); + monitorJson.put("icon", monitor.getIcon()); + resultArray.addAll(getChildList(monitorJson)); + } + } + return resultArray; + } + + private JSONArray getLineData(JSONObject item) { + JSONArray resultArray = new JSONArray(); + JSONObject parent = item.getJSONObject("parent"); + if (parent == null) { + item.put("parent", "0"); + resultArray.add(item); + } else { + item.put("parent", parent.getString("id")); + resultArray.add(item); + for (Object lineDatum : getLineData(parent)) { + resultArray.add(lineDatum); + } + } + return resultArray; + } + + private List getParentIdList(List parentIdList, Long parentId) { + parentIdList.add(parentId); + if (parentId != 0) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ConfigMonitor::getId, parentId); + queryWrapper.eq(BaseEntity::getIsDeleted, 0); + ConfigMonitor configMonitor = baseMapper.selectOne(queryWrapper); + parentId = configMonitor.getParentId(); + //服务器不需要排查,所以只需要到服务层面就可以 + if (configMonitor.getType().equals(MonitorConstant.SERVICE)) { + return parentIdList; + } + getParentIdList(parentIdList, parentId); + } + return parentIdList; + } }