diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/NumUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/NumUtil.java index 9c64c389..20e3b1e1 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/NumUtil.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/NumUtil.java @@ -125,4 +125,35 @@ public class NumUtil { return false; } } + + public static String kb2Gb(String kb, int scale){ + if (StrUtil.isBlank(kb)) + return null; + BigDecimal decimal = new BigDecimal(kb); + double v = decimal.divide(new BigDecimal(1024), scale, RoundingMode.HALF_UP) + .divide(new BigDecimal(1024), scale, RoundingMode.HALF_UP) + .doubleValue(); + return String.valueOf(v); + } + + public static String byte2Mb(String bytes, int scale){ + if (StrUtil.isBlank(bytes)) + return null; + BigDecimal decimal = new BigDecimal(bytes); + double v = decimal.divide(new BigDecimal(1024), scale, RoundingMode.HALF_UP) + .divide(new BigDecimal(1024), scale, RoundingMode.HALF_UP) + .doubleValue(); + return String.valueOf(v); + } + + public static String byte2Gb(String bytes, int scale){ + if (StrUtil.isBlank(bytes)) + return null; + BigDecimal decimal = new BigDecimal(bytes); + double v = decimal.divide(new BigDecimal(1024), scale, RoundingMode.HALF_UP) + .divide(new BigDecimal(1024), scale, RoundingMode.HALF_UP) + .divide(new BigDecimal(1024), scale, RoundingMode.HALF_UP) + .doubleValue(); + return String.valueOf(v); + } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/DatabaseDto.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/DatabaseDto.java index 12f12635..896c291c 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/DatabaseDto.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/DatabaseDto.java @@ -1,5 +1,6 @@ package org.jeecg.modules.base.dto; +import cn.hutool.core.util.StrUtil; import lombok.Data; import lombok.experimental.Accessors; @@ -21,21 +22,29 @@ public class DatabaseDto implements Serializable { private boolean online; - private String slowQuery; - private Integer alarms; private boolean alarmRed; - private String cpuUutilzation; + private String dbMemory; // kb - private boolean cpuRed; + private String logRemainingSize; // byte - private String memoryUsage; + private String dbSize; // byte - private boolean memoryRed; + public void setDbMemory(String dbMemory) { + if (StrUtil.isNotBlank(dbMemory)) + this.dbMemory = dbMemory + "GB"; + } - private String diskUsage; + public void setLogRemainingSize(String logRemainingSize) { + if (StrUtil.isNotBlank(logRemainingSize)) + this.logRemainingSize = logRemainingSize + "MB"; - private boolean diskRed; + } + + public void setDbSize(String dbSize) { + if (StrUtil.isNotBlank(dbSize)) + this.dbSize = dbSize + "GB"; + } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/NameValue.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/NameValue.java index a72ec1c1..d243ed8f 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/NameValue.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/NameValue.java @@ -15,17 +15,10 @@ public class NameValue implements Serializable { private Boolean value; - private String valueT; - private Integer usage; // 单位 MB public NameValue(String name, Boolean value) { this.name = name; this.value = value; } - - public NameValue(String name, String valueT) { - this.name = name; - this.valueT = valueT; - } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/enums/DbItem.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/enums/DbItem.java new file mode 100644 index 00000000..bdf828f5 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/enums/DbItem.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.base.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum DbItem { + DBMEMORY("dbMemory"), + LOGREMAININGSIZE("logRemainingSize"), + DBSIZE("dblSize"); + + private final String value; +} 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 0badcbbe..6bd1cf5a 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 @@ -2,6 +2,7 @@ package org.jeecg.modules.aspect; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; @@ -103,8 +104,7 @@ public class StatusAspect { databaseService.status2Redis(database); String token = ManageUtil.getToken(); Page hostPage = monitorAlarm.dbList(null, 1, 99, token).getResult(); - if (ObjectUtil.isNull(hostPage) || CollUtil.isEmpty(hostPage.getRecords())) - return; + if (ObjectUtil.isNull(hostPage) || CollUtil.isEmpty(hostPage.getRecords())) return; List hosts = hostPage.getRecords(); String name = database.getName(); Host host = null; @@ -112,8 +112,7 @@ public class StatusAspect { if (StrUtil.equals(name, oneHost.getCode())) host = oneHost; } - if (ObjectUtil.isNull(host)) - return; + if (ObjectUtil.isNull(host)) return; // 更新数据源的HostId database.setHostId(host.getHostId()); databaseService.updateById(database); @@ -127,7 +126,7 @@ public class StatusAspect { /* * 新增|修改服务器信息后 异步更新其状态信息 - * 更新服务器的状态(-1:未知 1:正常 2:离线 3:告警)和它对应的系统监控的HostId + * 更新服务器的状态(1:正常 2:离线 3:告警)和它对应的系统监控的HostId * */ @Async @AfterReturning("execution(* org.jeecg.modules.service.impl.SysServerServiceImpl.update(..)) || " + @@ -136,7 +135,7 @@ public class StatusAspect { Object[] args = point.getArgs(); if (ArrayUtil.length(args) == 0) return; String key = RedisConstant.SERVER_STATUS; - String status = ServerStatus.OFF.getValue(); + Boolean online = null; SysServer server = (SysServer) args[0]; String id = server.getId(); String name = server.getName(); @@ -146,7 +145,7 @@ public class StatusAspect { 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)); + redisUtil.hset(key, id, new NameValue(name, online)); return; } List hosts = hostPage.getRecords(); @@ -156,12 +155,14 @@ public class StatusAspect { host = oneHost; } if (ObjectUtil.isNull(host)){ - redisUtil.hset(key, id, new NameValue(name, status)); + redisUtil.hset(key, id, new NameValue(name, online)); return; } // 更新该服务器状态信息 - status = host.getStatus(); - redisUtil.hset(key, id, new NameValue(name, status)); + String status = host.getStatus(); + online = CollUtil.contains(ListUtil.toList(ServerStatus.ON.getValue(), + ServerStatus.WARN.getValue()), status); + redisUtil.hset(key, id, new NameValue(name, online)); // 更新该服务器的HostId server.setHostId(host.getHostId()); serverService.updateById(server); 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 1675fee8..3b1298b2 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 @@ -2,24 +2,33 @@ package org.jeecg.modules.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import feign.FeignException; +import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.QueryRequest; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.*; import org.jeecg.common.constant.enums.DbType; import org.jeecg.common.system.vo.DictModel; import org.jeecg.common.util.JDBCUtil; +import org.jeecg.common.util.NumUtil; import org.jeecg.common.util.RedisUtil; import org.jeecg.common.util.SpringContextUtils; import org.jeecg.modules.base.dto.*; +import org.jeecg.modules.base.entity.monitor.Host; +import org.jeecg.modules.base.entity.monitor.Item; import org.jeecg.modules.base.entity.postgre.SysDatabase; import org.jeecg.modules.base.bizVo.SourceVo; +import org.jeecg.modules.base.enums.DbItem; import org.jeecg.modules.entity.AlarmHistory; +import org.jeecg.modules.feignclient.ManageUtil; +import org.jeecg.modules.feignclient.MonitorAlarm; import org.jeecg.modules.feignclient.SystemClient; import org.jeecg.modules.mapper.DBRowMapper; import org.jeecg.modules.mapper.SpaceRowMapper; @@ -40,7 +49,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.jeecg.common.constant.enums.DbType.*; - +@Slf4j @Service("sysDatabaseService") public class SysDatabaseServiceImpl extends ServiceImpl implements ISysDatabaseService { @@ -50,6 +59,9 @@ public class SysDatabaseServiceImpl extends ServiceImpl findPage(QueryRequest query) { Integer pageNo = query.getPageNo(); @@ -72,23 +84,53 @@ public class SysDatabaseServiceImpl extends ServiceImpl statusMap = redisUtil.hmget(statusKey); + // 向运管系统查询数据库相关指标信息 + Map dbMap = new HashMap<>(); + try { + String token = ManageUtil.getToken(); + Page dbPage = monitorAlarm.dbList(null, 1, 99, token).getResult(); + if (ObjectUtil.isNotNull(dbPage) && CollUtil.isNotEmpty(dbPage.getRecords())) + dbMap = dbPage.getRecords().stream().collect(Collectors.toMap(Host::getName, host -> host)); + }catch (FeignException.Unauthorized e){ + ManageUtil.refreshToken(); + log.warn("向运管系统查询DB信息异常: Token失效,已刷新Token"); + }catch (Exception e){ + log.error("向运管系统查询DB信息异常: {}", e.getMessage()); + } for (DatabaseDto databaseDto : databaseDtos) { boolean online = false; String id = databaseDto.getId(); String type = databaseDto.getType(); + String name = databaseDto.getName(); Integer alarms = databaseDto.getAlarms(); boolean alarmRed = ObjectUtil.isNotNull(alarms) && alarms > 0; NameValue nameValue = (NameValue) statusMap.get(id); if (ObjectUtil.isNotNull(nameValue)){ Boolean value = nameValue.getValue(); - if (ObjectUtil.isNotNull(value)) - online = value; + if (ObjectUtil.isNotNull(value)) online = value; } String dataBaseType = dataSourceMap.get(type); databaseDto.setDataBaseType(dataBaseType) - .setOnline(online).setSlowQuery("328/s") - .setAlarmRed(alarmRed).setCpuUutilzation("35.8%") - .setMemoryUsage("55.8%").setDiskUsage("35.6%"); + .setAlarmRed(alarmRed).setOnline(online); + + // 获取数据库指标信息 + Host db = dbMap.get(name); + if (ObjectUtil.isNull(db)) continue; + if (!online) continue; + Map itemMap = db.getItems(); + if (MapUtil.isEmpty(itemMap)) continue; + // dbMemory kb -> GB + Item item = itemMap.get(DbItem.DBMEMORY.getValue()); + if (ObjectUtil.isNotNull(item)) + databaseDto.setDbMemory(NumUtil.kb2Gb(item.getLastValue(), 2)); + // logRemainingSize byte -> MB + item = itemMap.get(DbItem.LOGREMAININGSIZE.getValue()); + if (ObjectUtil.isNotNull(item)) + databaseDto.setLogRemainingSize(NumUtil.byte2Mb(item.getLastValue(), 2)); + // dbSize byte -> GB + item = itemMap.get(DbItem.DBSIZE.getValue()); + if (ObjectUtil.isNotNull(item)) + databaseDto.setDbSize(NumUtil.byte2Gb(item.getLastValue(), 2)); } page.setRecords(databaseDtos); return Result.OK(page); 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 9670a63c..2f77e1b1 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 @@ -2,6 +2,7 @@ package org.jeecg.modules.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; @@ -100,13 +101,10 @@ public class SysServerServiceImpl extends ServiceImpl 0); // 设置服务器状态信息 NameValue nameValue = (NameValue) statusMap.get(id); - String status = OFF.getValue(); - if (ObjectUtil.isNotNull(nameValue)){ - String valueT = nameValue.getValueT(); - if (StrUtil.isNotBlank(valueT)) - status = valueT; - } - boolean online = StrUtil.equals(status, ON.getValue()); + Boolean value = null; + if (ObjectUtil.isNotNull(nameValue)) + value = nameValue.getValue(); + boolean online = ObjectUtil.isNotNull(value) && value; // 设置服务器的硬件使用情况信息 Host host = hostMap.get(hostId); if (ObjectUtil.isNull(host)) @@ -123,7 +121,6 @@ public class SysServerServiceImpl extends ServiceImpl hostMap = hosts.stream().collect(Collectors.toMap(Host::getHostId, Host -> Host)); for (SysServer server : sysServers) { + Boolean online = null; String hostId = server.getHostId(); String name = server.getName(); String serverId = server.getId(); @@ -379,11 +377,13 @@ public class SysServerServiceImpl extends ServiceImpl