业务节点监控接口

monitor
liuqingkun 1 year ago
parent 172376c1fd
commit 9c7b119bf1
  1. 20
      src/main/java/org/springblade/modules/monitor/controller/BusinessMonitorController.java
  2. 5
      src/main/java/org/springblade/modules/monitor/entity/ConfigMonitor.java
  3. 5
      src/main/java/org/springblade/modules/monitor/service/IConfigMonitorService.java
  4. 269
      src/main/java/org/springblade/modules/monitor/service/impl/ConfigMonitorServiceImpl.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));
}
/**
* 根据设备类型和报警节点查询排查方法
*

@ -100,6 +100,11 @@ public class ConfigMonitor extends BaseEntity {
@ApiModelProperty("创建部门")
private Long createDept;
/**
* 图标
*/
@ApiModelProperty(value = "图标")
private String icon;
/**
* 服务颜色
*/

@ -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<ConfigMonitor> {
* @return
*/
List<ConfigMonitorVO> tree();
Object getWarnLinePoint(String parentId);
}

@ -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<ConfigMonitorMapper, C
//如果所有设备都坏了,直接排查父级问题;否则修改设备状态为异常
//modbus设备排查服务、网关;mqtt设备排查服务、mqtt服务、dtu;bacnet设备是通过广播直连,如果全部设备都有问题,直接排查网络问题;
if(breakList.size() == monitorList.size()){
boolean flag = true;
for(Long id : parentIdList){
//通过标识位来判断当前是否应该静默
if(flag){
LambdaQueryWrapper<ConfigMonitor> 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<ConfigMonitor> 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<ConfigMonitor> 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<ConfigMonitor> 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<ConfigMonitor> 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<ConfigMonitor> 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<ConfigMonitorVO> tree() {
return ForestNodeMerger.merge(baseMapper.tree());
}
}
public List<Long> getParentIdList(List<Long> parentIdList,Long parentId){
parentIdList.add(parentId);
if(parentId != 0){
LambdaQueryWrapper<ConfigMonitor> 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<ConfigMonitorVO> tree() {
return ForestNodeMerger.merge(baseMapper.tree());
}
@Override
public Object getWarnLinePoint(String parentId) {
// 先查询该微服务
List resultList = new ArrayList();
ConfigMonitor monitor = baseMapper.selectOne(Wrappers.<ConfigMonitor>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<ConfigMonitor> monitor1List = baseMapper.selectList(Wrappers.<ConfigMonitor>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<Long> getParentIdList(List<Long> parentIdList, Long parentId) {
parentIdList.add(parentId);
if (parentId != 0) {
LambdaQueryWrapper<ConfigMonitor> 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;
}
}

Loading…
Cancel
Save