From d62fe4b99a9346dbd055894c931396933d72310f Mon Sep 17 00:00:00 2001 From: gaoyutao Date: Fri, 16 Jan 2026 15:10:31 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E7=A3=81=E7=9B=98H?= =?UTF-8?q?DD=E7=B1=BB=E5=9E=8B=E5=B7=B2=E7=94=A8=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E5=9B=BE=E5=BD=A2=E6=8E=A5=E5=8F=A3=E3=80=82=202=E3=80=81?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A3=81=E7=9B=98HDD=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=80=BB=E7=A9=BA=E9=97=B4=E5=AD=97=E6=AE=B5=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E3=80=82=203=E3=80=81=E5=A2=9E=E5=8A=A0=E7=A1=AC=E7=9B=98?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=9B=91=E6=8E=A7=E5=88=97=E8=A1=A8=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/utils/EchartsDataUtils.java | 137 +++++++++++++----- .../tongran/common/core/utils/SpeedUtils.java | 35 +++++ .../system/EpsInitialTrafficDataMapper.xml | 7 +- .../controller/AllDiskNameController.java | 2 +- .../controller/InitialDiskInfoController.java | 10 ++ .../tongran/rocketmq/domain/AllDiskName.java | 21 +++ .../rocketmq/domain/InitialDiskInfo.java | 2 + .../rocketmq/mapper/AllDiskNameMapper.java | 2 + .../mapper/InitialDiskInfoMapper.java | 2 + .../rocketmq/service/IAllDiskNameService.java | 2 + .../service/IInitialDiskInfoService.java | 8 + .../service/impl/AllDiskNameServiceImpl.java | 9 ++ .../InitialBandwidthTrafficServiceImpl.java | 18 ++- .../impl/InitialDiskInfoServiceImpl.java | 50 ++++++- .../mapper/rocketmq/AllDiskNameMapper.xml | 35 ++++- .../mapper/rocketmq/InitialDiskInfoMapper.xml | 12 ++ 16 files changed, 301 insertions(+), 51 deletions(-) diff --git a/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/utils/EchartsDataUtils.java b/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/utils/EchartsDataUtils.java index b4327e4..14f1e45 100644 --- a/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/utils/EchartsDataUtils.java +++ b/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/utils/EchartsDataUtils.java @@ -53,7 +53,7 @@ public class EchartsDataUtils { return Math.round(microseconds / 1_000_000.0 * 100.0) / 100.0; } /** - * 构建ECharts图表数据(带时间补全和特殊值处理) + * 构建ECharts图表数据(带时间补全和特殊值处理)- 修复版本 */ public static Map buildEchartsDataAutoPadding( List list, @@ -84,57 +84,64 @@ public class EchartsDataUtils { .sorted(Comparator.comparing(timeExtractor)) .collect(Collectors.toList()); - // 自动检测时间间隔(用于数据期间) + // 自动检测时间间隔 long timeInterval = detectTimeInterval(sortedList, timeExtractor); // 获取数据实际的时间范围 Date actualStartTime = timeExtractor.apply(sortedList.get(0)); Date actualEndTime = timeExtractor.apply(sortedList.get(sortedList.size() - 1)); - // 计算稀疏间隔(用于数据期间外) + // 计算稀疏间隔 long totalTimeRange = endDate.getTime() - startDate.getTime(); long sparseInterval = totalTimeRange > 12L * 30 * 24 * 60 * 60 * 1000 ? 30L * 24 * 60 * 60 * 1000 : 2L * 24 * 60 * 60 * 1000; - // 生成三段时间序列 + // 生成完整的时间序列 List fullTimeSeries = new ArrayList<>(); // 1. 开始时间到数据开始时间(稀疏间隔) if (startDate.before(actualStartTime)) { - List beforeSeries = generateTimeSeries(startDate, actualStartTime, sparseInterval); + List beforeSeries = generateSparseTimeSeries(startDate, actualStartTime, sparseInterval); fullTimeSeries.addAll(beforeSeries); } - // 2. 数据开始时间到数据结束时间(正常间隔) - List dataSeries = generateTimeSeries(actualStartTime, actualEndTime, timeInterval); + // 2. 数据开始时间到数据结束时间 - 以第一个数据点的时间为基准生成序列 + List dataSeries = generateTimeSeriesFromDataPoints(actualStartTime, actualEndTime, + timeInterval, actualStartTime); fullTimeSeries.addAll(dataSeries); // 3. 数据结束时间到结束时间(稀疏间隔) if (actualEndTime.before(endDate)) { - // 调整actualEndTime的下一个点开始,避免重复 + // 从actualEndTime的下一个时间点开始 Calendar cal = Calendar.getInstance(); cal.setTime(actualEndTime); - cal.setTimeInMillis(cal.getTimeInMillis() + timeInterval); + cal.add(Calendar.MILLISECOND, (int)timeInterval); Date nextAfterActualEnd = cal.getTime(); if (nextAfterActualEnd.before(endDate) || nextAfterActualEnd.equals(endDate)) { - List afterSeries = generateTimeSeries(nextAfterActualEnd, endDate, sparseInterval); + List afterSeries = generateSparseTimeSeries(nextAfterActualEnd, endDate, sparseInterval); fullTimeSeries.addAll(afterSeries); } } - // 创建时间到数据的映射(考虑时间精度) - Map timeDataMap = sortedList.stream() - .collect(Collectors.toMap( - item -> normalizeTime(timeExtractor.apply(item), timeInterval), - Function.identity(), - (a, b) -> a - )); + // 去重并排序 + fullTimeSeries = fullTimeSeries.stream() + .distinct() + .sorted() + .collect(Collectors.toList()); + + // 创建时间到数据的映射 + Map timeDataMap = new HashMap<>(); + for (T item : sortedList) { + Date itemTime = timeExtractor.apply(item); + String timeKey = parseDateToStr(itemTime); + timeDataMap.put(timeKey, item); + } // 检测整个数据集中是否有真实数据 boolean hasRealData = checkHasRealData(sortedList, dataExtractors); - // 特殊处理:查找percentile95的固定值 + // 查找特殊字段的固定值 Object fixedPercentile95Value = findFixedValueForPercentile95(sortedList, dataExtractors); // 准备X轴和Y轴数据 @@ -145,19 +152,16 @@ public class EchartsDataUtils { dataExtractors.keySet().forEach(name -> yData.put(name, new ArrayList<>())); - // 记录当前处理的时间点索引 - int timeIndex = 0; - for (Date time : fullTimeSeries) { // X轴数据 - xAxisData.add(parseDateToStr(time)); + String timeStr = parseDateToStr(time); + xAxisData.add(timeStr); // 判断当前时间点是否在数据实际时间范围内 boolean isInDataRange = !time.before(actualStartTime) && !time.after(actualEndTime); - // Y轴数据 - Long normalizedTime = normalizeTime(time, timeInterval); - T item = timeDataMap.get(normalizedTime); + // 查找对应的数据项 + T item = timeDataMap.get(timeStr); for (Map.Entry> entry : dataExtractors.entrySet()) { String name = entry.getKey(); @@ -169,20 +173,18 @@ public class EchartsDataUtils { if (item != null) { // 有真实数据 Object value = extractor.apply(item); - seriesData.add(value != null ? value : getDefaultValue(name, fixedPercentile95Value, timeIndex, hasRealData)); + seriesData.add(value != null ? value : null); } else { // 智能数据补全 if (isInDataRange) { - // 在数据时间范围内但该时间点无数据:使用智能补全策略 - seriesData.add(getDefaultValue(name, fixedPercentile95Value, timeIndex, hasRealData)); + // 在数据时间范围内但该时间点无数据(数据缺失点) + seriesData.add(getDefaultValue(name, fixedPercentile95Value, xAxisData.size()-1, hasRealData)); } else { - // 在数据时间范围外(开始时间前或结束时间后):使用空数据补全策略 - seriesData.add(getEmptyDataDefaultValue(name, timeIndex)); + // 在数据时间范围外 + seriesData.add(getEmptyDataDefaultValue(name, xAxisData.size()-1)); } } } - - timeIndex++; } Map result = new HashMap<>(); @@ -191,12 +193,81 @@ public class EchartsDataUtils { return result; } catch (Exception e) { - // 记录日志 System.err.println("构建图表数据失败: " + e.getMessage()); + e.printStackTrace(); return createEmptyResult(dataExtractors.keySet(), startTime, endTime); } } + /** + * 从第一个数据点开始生成时间序列 + */ + private static List generateTimeSeriesFromDataPoints(Date start, Date end, + long interval, Date firstDataPoint) { + List timeSeries = new ArrayList<>(); + + if (interval <= 0) { + interval = 300000L; // 默认5分钟 + } + + // 使用第一个数据点的时间作为基准 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(firstDataPoint); + calendar.set(Calendar.MILLISECOND, 0); + + // 从第一个数据点开始向前找,直到找到小于等于start的时间点 + while (calendar.getTime().after(start)) { + calendar.add(Calendar.MILLISECOND, -(int)interval); + } + + // 如果当前位置在start之前,前进一个间隔 + if (calendar.getTime().before(start)) { + calendar.add(Calendar.MILLISECOND, (int)interval); + } + + // 生成时间序列 + while (!calendar.getTime().after(end)) { + timeSeries.add(calendar.getTime()); + calendar.add(Calendar.MILLISECOND, (int)interval); + } + + return timeSeries.stream() + .distinct() + .sorted() + .collect(Collectors.toList()); + } + + /** + * 生成稀疏时间序列 + */ + private static List generateSparseTimeSeries(Date start, Date end, long interval) { + List timeSeries = new ArrayList<>(); + + if (interval <= 0) { + interval = 2L * 24 * 60 * 60 * 1000; // 默认2天 + } + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(start); + calendar.set(Calendar.MILLISECOND, 0); + + // 包含开始时间 + timeSeries.add(calendar.getTime()); + + while (true) { + calendar.add(Calendar.MILLISECOND, (int)interval); + if (calendar.getTime().after(end)) { + break; + } + timeSeries.add(calendar.getTime()); + } + + return timeSeries.stream() + .distinct() + .sorted() + .collect(Collectors.toList()); + } + /** * 获取空数据默认值(用于数据时间范围外的点) */ diff --git a/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/utils/SpeedUtils.java b/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/utils/SpeedUtils.java index 1d9b47c..42a61dc 100644 --- a/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/utils/SpeedUtils.java +++ b/tongran-common/tongran-common-core/src/main/java/com/tongran/common/core/utils/SpeedUtils.java @@ -383,4 +383,39 @@ public class SpeedUtils { if (mbitValue == null) return BigDecimal.ZERO; return mbitValue.multiply(new BigDecimal("1000000")); } + public static String determineUnitByValue(Long value) { + if (value == null || value == 0) { + return "KB"; + } + + // 注意:这里使用二进制单位(1024) + if (value >= 1024L * 1024 * 1024 * 1024) { // >= 1TB + return "TB"; + } else if (value >= 1024L * 1024 * 1024) { // >= 1GB + return "GB"; + } else if (value >= 1024L * 1024) { // >= 1MB + return "MB"; + } else { + return "KB"; + } + } + // 工具方法:获取单位换算除数 + public static BigDecimal get1024Divisor(String unit) { + switch (unit) { + case "GB": + case "Gb": + return new BigDecimal(1024L * 1024 * 1024); // 1GB = 1024^3 + case "MB": + case "Mb": + return new BigDecimal(1024L * 1024); // 1MB = 1024^2 + case "KB": + case "Kb": + return new BigDecimal(1024); // 1KB = 1024 + case "TB": + case "Tb": + return new BigDecimal(1024L * 1024 * 1024 * 1024); // 1TB = 1024^4 + default: + return new BigDecimal(1024); // 默认返回KB的除数 + } + } } \ No newline at end of file diff --git a/tongran-modules/tongran-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml b/tongran-modules/tongran-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml index dfe478a..d777025 100644 --- a/tongran-modules/tongran-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml +++ b/tongran-modules/tongran-system/src/main/resources/mapper/system/EpsInitialTrafficDataMapper.xml @@ -199,7 +199,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_by VARCHAR(64) COMMENT '修改人', PRIMARY KEY (id), UNIQUE KEY uk_client_fiber_time (client_id, create_time, fiber_port_name) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='光模块信息表'; + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='光模块信息表'; CREATE TABLE IF NOT EXISTS ${tableName} ( @@ -221,8 +221,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" `type` varchar(255) COMMENT '磁盘类型', `used_space` bigint(20) COMMENT '已用空间', PRIMARY KEY (`id`), - UNIQUE KEY uk_client_disk_time (`client_id`, `name`, `create_time`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='磁盘监控信息表'; + UNIQUE KEY uk_client_disk_time (`client_id`, `name`, `create_time`), + INDEX idx_clent_type_time(`client_id`, `create_time`, `type`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='磁盘监控信息表'; diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/AllDiskNameController.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/AllDiskNameController.java index 71f5be3..ff2404a 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/AllDiskNameController.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/AllDiskNameController.java @@ -32,7 +32,7 @@ public class AllDiskNameController extends BaseController @PostMapping("/list") public AjaxResult list(@RequestBody AllDiskName allDiskName) { - List list = allDiskNameService.selectAllDiskNameList(allDiskName); + List list = allDiskNameService.selectDiskInfoList(allDiskName); return success(list); } diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/InitialDiskInfoController.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/InitialDiskInfoController.java index bb0c870..96b3677 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/InitialDiskInfoController.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/controller/InitialDiskInfoController.java @@ -138,6 +138,16 @@ public class InitialDiskInfoController extends BaseController Map echartsData = initialDiskInfoService.rwBytesEcharts(initialDiskInfo); return success(echartsData); } + /** + * HDD类型已用空间 + * @param initialDiskInfo + * @return + */ + @PostMapping("/usedSpaceEcharts") + public AjaxResult usedSpaceEcharts(@RequestBody InitialDiskInfo initialDiskInfo){ + Map echartsData = initialDiskInfoService.usedSpaceEcharts(initialDiskInfo); + return success(echartsData); + } /** * 获取指定服务器的磁盘名称 * @param initialDiskInfo diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/AllDiskName.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/AllDiskName.java index d1f100a..6dbe829 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/AllDiskName.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/AllDiskName.java @@ -39,5 +39,26 @@ public class AllDiskName extends BaseEntity private String writeIops; /** 操纵类型 1测试磁盘IOPS,2卸载分区 */ private Integer processType; + /** 磁盘序列号 */ + @Excel(name = "磁盘序列号") + private String serial; + + /** 磁盘总大小(GB) */ + @Excel(name = "磁盘总大小(GB)") + private Long total; + + /** 磁盘写入速率(字节/秒) */ + @Excel(name = "磁盘写入速率(字节/秒)") + private Long writeSpeed; + + /** 磁盘读取速率(字节/秒) */ + @Excel(name = "磁盘读取速率(字节/秒)") + private Long readSpeed; + /** 已用空间 */ + private Long usedSpace; + /** 磁盘类型 */ + private String type; + /** 表名 */ + private String tableName; } diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/InitialDiskInfo.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/InitialDiskInfo.java index ce9038d..b27d017 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/InitialDiskInfo.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/domain/InitialDiskInfo.java @@ -83,6 +83,8 @@ public class InitialDiskInfo extends BaseEntity private String tableName; /** 批量插入列表 */ private List list; + /** 单位 */ + private String unit; } diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/AllDiskNameMapper.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/AllDiskNameMapper.java index 1083037..227f689 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/AllDiskNameMapper.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/AllDiskNameMapper.java @@ -61,4 +61,6 @@ public interface AllDiskNameMapper public int deleteAllDiskNameByIds(Long[] ids); int batchInsertAllDistName(List dataList); + + List selectDiskInfoList(AllDiskName allDiskName); } diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/InitialDiskInfoMapper.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/InitialDiskInfoMapper.java index d4aa682..2ca0e5d 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/InitialDiskInfoMapper.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/mapper/InitialDiskInfoMapper.java @@ -84,4 +84,6 @@ public interface InitialDiskInfoMapper List getAllDistName(InitialDiskInfo initialDiskInfo); List selectInitialDiskInfoListByCondition(InitialDiskInfo condition); + + InitialDiskInfo getDiskTotal(InitialDiskInfo initialDiskInfo); } diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IAllDiskNameService.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IAllDiskNameService.java index 9e8e067..a7f0dc7 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IAllDiskNameService.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IAllDiskNameService.java @@ -64,4 +64,6 @@ public interface IAllDiskNameService int batchInsertAllDistName(List dataList); int issuanceOperation(AllDiskName allDiskName); + + List selectDiskInfoList(AllDiskName allDiskName); } diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IInitialDiskInfoService.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IInitialDiskInfoService.java index 9e7a6f6..e1d144f 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IInitialDiskInfoService.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/IInitialDiskInfoService.java @@ -94,6 +94,12 @@ public interface IInitialDiskInfoService * @return */ Map rwBytesEcharts(InitialDiskInfo initialDiskInfo); + /** + * HDD类型已用空间图 + * @param initialDiskInfo + * @return + */ + Map usedSpaceEcharts(InitialDiskInfo initialDiskInfo); /** * 获取指定服务器的磁盘名称 @@ -101,4 +107,6 @@ public interface IInitialDiskInfoService * @return */ List getAllDistName(InitialDiskInfo initialDiskInfo); + + InitialDiskInfo getDiskTotal(InitialDiskInfo initialDiskInfo); } diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/AllDiskNameServiceImpl.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/AllDiskNameServiceImpl.java index 1a8f6cf..5aabbea 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/AllDiskNameServiceImpl.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/AllDiskNameServiceImpl.java @@ -3,6 +3,7 @@ package com.tongran.rocketmq.service.impl; import com.alibaba.fastjson.JSONObject; import com.tongran.common.core.enums.MsgEnum; import com.tongran.common.core.utils.DateUtils; +import com.tongran.common.core.utils.TableSubUtil; import com.tongran.rocketmq.domain.AllDiskName; import com.tongran.rocketmq.domain.DeviceMessage; import com.tongran.rocketmq.domain.InitialDiskInfo; @@ -153,4 +154,12 @@ public class AllDiskNameServiceImpl implements IAllDiskNameService ); return 1; } + + @Override + public List selectDiskInfoList(AllDiskName allDiskName) { + String tableName = TableSubUtil.getTableName(DateUtils.getNowDate(), "initial_disk_info"); + allDiskName.setTableName(tableName); + List list = allDiskNameMapper.selectDiskInfoList(allDiskName); + return list; + } } diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialBandwidthTrafficServiceImpl.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialBandwidthTrafficServiceImpl.java index d3bc97d..248c8e2 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialBandwidthTrafficServiceImpl.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialBandwidthTrafficServiceImpl.java @@ -1,15 +1,10 @@ package com.tongran.rocketmq.service.impl; import com.tongran.common.core.utils.*; -import com.tongran.rocketmq.domain.InitialBandwidthTraffic; -import com.tongran.rocketmq.domain.InitialCpuInfo; -import com.tongran.rocketmq.domain.InitialSystemOtherCollectData; -import com.tongran.rocketmq.domain.RmNetworkInterfaceChild; -import com.tongran.rocketmq.mapper.InitialBandwidthTrafficMapper; -import com.tongran.rocketmq.mapper.InitialCpuInfoMapper; -import com.tongran.rocketmq.mapper.InitialSystemOtherCollectDataMapper; -import com.tongran.rocketmq.mapper.RmNetworkInterfaceChildMapper; +import com.tongran.rocketmq.domain.*; +import com.tongran.rocketmq.mapper.*; import com.tongran.rocketmq.service.IInitialBandwidthTrafficService; +import com.tongran.rocketmq.service.IInitialDiskInfoService; import com.tongran.rocketmq.utils.TableRouterUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -43,6 +38,8 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf private InitialSystemOtherCollectDataMapper initialSystemOtherCollectDataMapper; @Autowired private InitialCpuInfoMapper initialCpuInfoMapper; + @Autowired + private IInitialDiskInfoService diskInfoService; /** * 查询初始带宽流量 @@ -631,6 +628,11 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf } resultMap.put("cpuUti", cpuInfo.getUti()); resultMap.put("cpuCores", cpuInfo.getCores()); + InitialDiskInfo diskInfo = new InitialDiskInfo(); + diskInfo.setClientId(initialBandwidthTraffic.getClientId()); + diskInfo.setType("HDD"); + InitialDiskInfo initialDiskInfo = diskInfoService.getDiskTotal(diskInfo); + resultMap.put("diskTotal", initialDiskInfo.getTotal()); return resultMap; } diff --git a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialDiskInfoServiceImpl.java b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialDiskInfoServiceImpl.java index 2b8d6ae..b1d430c 100644 --- a/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialDiskInfoServiceImpl.java +++ b/tongran-rocketmq/src/main/java/com/tongran/rocketmq/service/impl/InitialDiskInfoServiceImpl.java @@ -1,9 +1,6 @@ package com.tongran.rocketmq.service.impl; -import com.tongran.common.core.utils.DateUtils; -import com.tongran.common.core.utils.EchartsDataUtils; -import com.tongran.common.core.utils.TableSubUtil; -import com.tongran.common.core.utils.UnitChangeUtil; +import com.tongran.common.core.utils.*; import com.tongran.rocketmq.domain.InitialDiskInfo; import com.tongran.rocketmq.mapper.InitialDiskInfoMapper; import com.tongran.rocketmq.service.IAllDiskNameService; @@ -15,6 +12,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -175,6 +174,19 @@ public class InitialDiskInfoServiceImpl implements IInitialDiskInfoService } return info; } + @Override + public InitialDiskInfo getDiskTotal(InitialDiskInfo initialDiskInfo) { + String tableName = TableSubUtil.getTableName(DateUtils.getNowDate(), TABLE_PREFIX); + initialDiskInfo.setTableName(tableName); + InitialDiskInfo info = initialDiskInfoMapper.getDiskTotal(initialDiskInfo); + if(info != null){ + long gbUnit = 1024L * 1024 * 1024; + info.setTotal(info.getTotal() / gbUnit); + }else { + return new InitialDiskInfo(); + } + return info; + } /** * 分表查询硬盘信息 * @param queryParam @@ -191,6 +203,7 @@ public class InitialDiskInfoServiceImpl implements IInitialDiskInfoService condition.setTableName(tableName); condition.setClientId(queryParam.getClientId()); condition.setName(queryParam.getName()); + condition.setType(queryParam.getType()); condition.setStartTime(queryParam.getStartTime()); condition.setEndTime(queryParam.getEndTime()); return initialDiskInfoMapper.selectInitialDiskInfoListByCondition(condition).stream(); @@ -236,7 +249,34 @@ public class InitialDiskInfoServiceImpl implements IInitialDiskInfoService extractors.put("writeBytesData", info -> info.getWriteBytes()); return EchartsDataUtils.buildEchartsData(list, InitialDiskInfo::getCreateTime, extractors); } - + @Override + public Map usedSpaceEcharts(InitialDiskInfo initialDiskInfo) { + initialDiskInfo.setType("HDD"); + List list = getDistInfoSharding(initialDiskInfo); + String unit = "KB"; + if(list != null && !list.isEmpty()){ + Long totalUsedSpace = 0L; + for (InitialDiskInfo diskInfo : list) { + totalUsedSpace += diskInfo.getUsedSpace(); + } + Long avgUsedSpace = totalUsedSpace/list.size(); + unit = SpeedUtils.determineUnitByValue(avgUsedSpace); + } + // 计算单位 + if (initialDiskInfo.getUnit() != null) { + unit = initialDiskInfo.getUnit(); + } + BigDecimal divisor = SpeedUtils.get1024Divisor(unit); + Map> extractors = new LinkedHashMap<>(); + extractors.put("usedSpace", info -> { + BigDecimal usedSpace = new BigDecimal(info.getUsedSpace()); + return usedSpace.divide(divisor, 0, RoundingMode.DOWN).longValue(); + }); + Map resultMap = EchartsDataUtils.buildEchartsDataAutoPadding( + list,InitialDiskInfo::getCreateTime, extractors, initialDiskInfo.getStartTime(), initialDiskInfo.getEndTime()); + resultMap.put("unit", unit); + return resultMap; + } /** * 获取指定服务器的磁盘名称 * @param initialDiskInfo diff --git a/tongran-rocketmq/src/main/resources/mapper/rocketmq/AllDiskNameMapper.xml b/tongran-rocketmq/src/main/resources/mapper/rocketmq/AllDiskNameMapper.xml index 54d6be6..83599bf 100644 --- a/tongran-rocketmq/src/main/resources/mapper/rocketmq/AllDiskNameMapper.xml +++ b/tongran-rocketmq/src/main/resources/mapper/rocketmq/AllDiskNameMapper.xml @@ -23,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + SELECT + a.id, + a.client_id as clientId, + a.name, + a.status, + a.read_iops as readIops, + a.write_iops as writeIops, + a.create_time as createTime, + a.update_time as updateTime, + b.serial, + b.total, + b.write_speed as writeSpeed, + b.read_speed as readSpeed, + b.type, + b.used_space as usedSpace + FROM all_disk_name a + LEFT JOIN ( + SELECT client_id, name, MAX(create_time) as max_create_time + FROM ${tableName} + GROUP BY client_id, name + ) latest ON a.client_id = latest.client_id AND a.name = latest.name + LEFT JOIN ${tableName} b + ON latest.client_id = b.client_id + AND latest.name = b.name + AND latest.max_create_time = b.create_time + + + AND a.client_id = #{clientId} + + + \ No newline at end of file diff --git a/tongran-rocketmq/src/main/resources/mapper/rocketmq/InitialDiskInfoMapper.xml b/tongran-rocketmq/src/main/resources/mapper/rocketmq/InitialDiskInfoMapper.xml index 8ddead9..00ec4e5 100644 --- a/tongran-rocketmq/src/main/resources/mapper/rocketmq/InitialDiskInfoMapper.xml +++ b/tongran-rocketmq/src/main/resources/mapper/rocketmq/InitialDiskInfoMapper.xml @@ -213,4 +213,16 @@ group by name + \ No newline at end of file