增加计算单位可选方法.
优化图形分析根据可选时间补0逻辑,完成度70%。 优化业务自定义95值计算功能修改相关数据方法。
This commit is contained in:
+236
@@ -1,5 +1,7 @@
|
|||||||
package com.ruoyi.common.core.utils;
|
package com.ruoyi.common.core.utils;
|
||||||
|
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -42,10 +44,244 @@ public class EchartsDataUtils {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 微秒转秒
|
* 微秒转秒
|
||||||
*/
|
*/
|
||||||
public static double convertMicrosecondsToSeconds(long microseconds) {
|
public static double convertMicrosecondsToSeconds(long microseconds) {
|
||||||
return microseconds / 1_000_000.0;
|
return microseconds / 1_000_000.0;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 构建ECharts图表数据(带时间补全和0值填充)
|
||||||
|
* @param list 原始数据列表
|
||||||
|
* @param timeExtractor 时间字段提取函数
|
||||||
|
* @param dataExtractors 数据提取器Map
|
||||||
|
* @param startTime 开始时间字符串(格式:yyyy-MM-dd HH:mm:ss)
|
||||||
|
* @param endTime 结束时间字符串(格式:yyyy-MM-dd HH:mm:ss)
|
||||||
|
* @param <T> 数据类型泛型
|
||||||
|
* @return 包含xData和yData的Map
|
||||||
|
*/
|
||||||
|
public static <T> Map<String, Object> buildEchartsDataAutoPadding(
|
||||||
|
List<T> list,
|
||||||
|
Function<T, Date> timeExtractor,
|
||||||
|
Map<String, Function<T, ?>> dataExtractors,
|
||||||
|
String startTime,
|
||||||
|
String endTime) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 解析时间字符串
|
||||||
|
Date startDate = parseStringToDate(startTime);
|
||||||
|
Date endDate = parseStringToDate(endTime);
|
||||||
|
|
||||||
|
if (startDate == null || endDate == null) {
|
||||||
|
throw new IllegalArgumentException("开始时间或结束时间格式错误");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startDate.after(endDate)) {
|
||||||
|
throw new IllegalArgumentException("开始时间不能晚于结束时间");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list == null || list.isEmpty()) {
|
||||||
|
return createEmptyResult(dataExtractors.keySet(), startTime, endTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按时间排序
|
||||||
|
List<T> sortedList = list.stream()
|
||||||
|
.sorted(Comparator.comparing(timeExtractor))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 自动检测时间间隔
|
||||||
|
long timeInterval = detectTimeInterval(sortedList, timeExtractor);
|
||||||
|
|
||||||
|
// 生成完整的时间序列
|
||||||
|
List<Date> fullTimeSeries = generateTimeSeries(startDate, endDate, timeInterval);
|
||||||
|
|
||||||
|
// 创建时间到数据的映射(考虑时间精度)
|
||||||
|
Map<Long, T> timeDataMap = sortedList.stream()
|
||||||
|
.collect(Collectors.toMap(
|
||||||
|
item -> normalizeTime(timeExtractor.apply(item), timeInterval),
|
||||||
|
Function.identity(),
|
||||||
|
(a, b) -> a
|
||||||
|
));
|
||||||
|
|
||||||
|
// 准备X轴和Y轴数据
|
||||||
|
List<String> xAxisData = new ArrayList<>();
|
||||||
|
Map<String, Object> yData = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
// 初始化Y轴数据结构
|
||||||
|
dataExtractors.keySet().forEach(name ->
|
||||||
|
yData.put(name, new ArrayList<Object>()));
|
||||||
|
|
||||||
|
for (Date time : fullTimeSeries) {
|
||||||
|
// X轴数据
|
||||||
|
xAxisData.add(parseDateToStr(time));
|
||||||
|
|
||||||
|
// Y轴数据
|
||||||
|
Long normalizedTime = normalizeTime(time, timeInterval);
|
||||||
|
T item = timeDataMap.get(normalizedTime);
|
||||||
|
|
||||||
|
for (Map.Entry<String, Function<T, ?>> entry : dataExtractors.entrySet()) {
|
||||||
|
String name = entry.getKey();
|
||||||
|
Function<T, ?> extractor = entry.getValue();
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<Object> seriesData = (List<Object>) yData.get(name);
|
||||||
|
if (item != null) {
|
||||||
|
Object value = extractor.apply(item);
|
||||||
|
seriesData.add(value != null ? value : 0);
|
||||||
|
} else {
|
||||||
|
seriesData.add(0); // 补0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
result.put("xData", xAxisData);
|
||||||
|
result.put("yData", yData);
|
||||||
|
return result;
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 记录日志
|
||||||
|
System.err.println("构建图表数据失败: " + e.getMessage());
|
||||||
|
return createEmptyResult(dataExtractors.keySet(), startTime, endTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字符串转日期
|
||||||
|
*/
|
||||||
|
private static Date parseStringToDate(String dateStr) {
|
||||||
|
if (dateStr == null || dateStr.trim().isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
sdf.setLenient(false); // 严格模式
|
||||||
|
return sdf.parse(dateStr);
|
||||||
|
} catch (ParseException e) {
|
||||||
|
System.err.println("日期解析失败: " + dateStr);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日期转字符串
|
||||||
|
*/
|
||||||
|
private static String parseDateToStr(Date date) {
|
||||||
|
if (date == null) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
return sdf.format(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成完整的时间序列
|
||||||
|
*/
|
||||||
|
private static List<Date> generateTimeSeries(Date start, Date end, long interval) {
|
||||||
|
List<Date> timeSeries = new ArrayList<>();
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(start);
|
||||||
|
|
||||||
|
// 确保开始时间对齐到时间间隔
|
||||||
|
long startMillis = normalizeTime(start, interval);
|
||||||
|
calendar.setTimeInMillis(startMillis);
|
||||||
|
|
||||||
|
while (!calendar.getTime().after(end)) {
|
||||||
|
timeSeries.add(calendar.getTime());
|
||||||
|
calendar.setTimeInMillis(calendar.getTimeInMillis() + interval);
|
||||||
|
}
|
||||||
|
return timeSeries;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动检测时间间隔
|
||||||
|
*/
|
||||||
|
private static <T> long detectTimeInterval(List<T> list, Function<T, Date> timeExtractor) {
|
||||||
|
if (list.size() < 2) {
|
||||||
|
return 300000; // 默认5分钟
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算时间间隔的众数
|
||||||
|
Map<Long, Integer> intervalCount = new HashMap<>();
|
||||||
|
for (int i = 1; i < list.size(); i++) {
|
||||||
|
long interval = timeExtractor.apply(list.get(i)).getTime() -
|
||||||
|
timeExtractor.apply(list.get(i - 1)).getTime();
|
||||||
|
if (interval > 0) {
|
||||||
|
intervalCount.merge(interval, 1, Integer::sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果没有有效间隔,使用默认值
|
||||||
|
if (intervalCount.isEmpty()) {
|
||||||
|
return 300000L;
|
||||||
|
}
|
||||||
|
|
||||||
|
return intervalCount.entrySet().stream()
|
||||||
|
.max(Map.Entry.comparingByValue())
|
||||||
|
.map(Map.Entry::getKey)
|
||||||
|
.orElse(300000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间标准化(对齐到时间间隔)
|
||||||
|
*/
|
||||||
|
private static long normalizeTime(Date time, long interval) {
|
||||||
|
long timeMillis = time.getTime();
|
||||||
|
return (timeMillis / interval) * interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建空结果(包含完整的时间序列)
|
||||||
|
*/
|
||||||
|
private static Map<String, Object> createEmptyResult(Set<String> dataNames, String startTime, String endTime) {
|
||||||
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 解析时间范围
|
||||||
|
Date startDate = parseStringToDate(startTime);
|
||||||
|
Date endDate = parseStringToDate(endTime);
|
||||||
|
|
||||||
|
if (startDate != null && endDate != null && !startDate.after(endDate)) {
|
||||||
|
// 使用默认时间间隔生成完整时间序列
|
||||||
|
long defaultInterval = 300000L; // 5分钟
|
||||||
|
List<Date> fullTimeSeries = generateTimeSeries(startDate, endDate, defaultInterval);
|
||||||
|
|
||||||
|
// 构建x轴数据
|
||||||
|
List<String> xAxisData = new ArrayList<>();
|
||||||
|
for (Date date : fullTimeSeries) {
|
||||||
|
xAxisData.add(parseDateToStr(date));
|
||||||
|
}
|
||||||
|
result.put("xData", xAxisData);
|
||||||
|
|
||||||
|
// 构建y轴数据(全部补0)
|
||||||
|
Map<String, Object> yData = new LinkedHashMap<>();
|
||||||
|
int dataSize = xAxisData.size();
|
||||||
|
dataNames.forEach(name -> {
|
||||||
|
List<Object> zeroData = new ArrayList<>();
|
||||||
|
for (int i = 0; i < dataSize; i++) {
|
||||||
|
zeroData.add(0);
|
||||||
|
}
|
||||||
|
yData.put(name, zeroData);
|
||||||
|
});
|
||||||
|
result.put("yData", yData);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// 时间解析失败时返回空数据
|
||||||
|
result.put("xData", new ArrayList<>());
|
||||||
|
Map<String, Object> yData = new LinkedHashMap<>();
|
||||||
|
dataNames.forEach(name -> yData.put(name, new ArrayList<>()));
|
||||||
|
result.put("yData", yData);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 异常时返回空数据
|
||||||
|
result.put("xData", new ArrayList<>());
|
||||||
|
Map<String, Object> yData = new LinkedHashMap<>();
|
||||||
|
dataNames.forEach(name -> yData.put(name, new ArrayList<>()));
|
||||||
|
result.put("yData", yData);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
package com.ruoyi.common.core.utils;
|
||||||
|
|
||||||
|
public class UnitChangeUtil {
|
||||||
|
|
||||||
|
private static final double GB = 1024.0 * 1024.0 * 1024.0;
|
||||||
|
|
||||||
|
public static double bytesToGb(long bytes) {
|
||||||
|
return bytes / GB;
|
||||||
|
}
|
||||||
|
public static double convertKbToGb(String kbValue) {
|
||||||
|
if (kbValue == null || kbValue.trim().isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("KB值不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
double kb = Double.parseDouble(kbValue.trim());
|
||||||
|
return kb / (1024.0 * 1024.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+2
@@ -120,6 +120,8 @@ public class EpsInitialTrafficData extends BaseEntity {
|
|||||||
private String calculationMode;
|
private String calculationMode;
|
||||||
/** 95值 */
|
/** 95值 */
|
||||||
private BigDecimal percentile95;
|
private BigDecimal percentile95;
|
||||||
|
/** 单位 */
|
||||||
|
private String unit;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
+2
@@ -124,4 +124,6 @@ public class InitialSwitchInfoDetails extends BaseEntity
|
|||||||
private String interfaceNameRemark;
|
private String interfaceNameRemark;
|
||||||
/** 95值 */
|
/** 95值 */
|
||||||
private BigDecimal percentile95;
|
private BigDecimal percentile95;
|
||||||
|
/** 单位 */
|
||||||
|
private String unit;
|
||||||
}
|
}
|
||||||
|
|||||||
+44
-33
@@ -496,9 +496,11 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
|
|||||||
joiner.add("【" + businessName + "】");
|
joiner.add("【" + businessName + "】");
|
||||||
}
|
}
|
||||||
String name = joiner.toString();
|
String name = joiner.toString();
|
||||||
resultMap.put("name", name);
|
if(resultMap != null){
|
||||||
resultMap.put("timeRange", timeRange);
|
resultMap.put("name", name);
|
||||||
resultList.add(resultMap);
|
resultMap.put("timeRange", timeRange);
|
||||||
|
resultList.add(resultMap);
|
||||||
|
}
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -574,9 +576,11 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
|
|||||||
joiner.add("【" + businessName + "】");
|
joiner.add("【" + businessName + "】");
|
||||||
}
|
}
|
||||||
String name = joiner.toString();
|
String name = joiner.toString();
|
||||||
resultMap.put("name", name);
|
if(resultMap != null){
|
||||||
resultMap.put("timeRange", timeRange);
|
resultMap.put("name", name);
|
||||||
resultList.add(resultMap);
|
resultMap.put("timeRange", timeRange);
|
||||||
|
resultList.add(resultMap);
|
||||||
|
}
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -592,34 +596,41 @@ public class EpsInitialTrafficDataServiceImpl implements EpsInitialTrafficDataSe
|
|||||||
*/
|
*/
|
||||||
public Map<String, Object> serverNetSpeedEcharts(EpsInitialTrafficData epsInitialTrafficData, BigDecimal percentile95) {
|
public Map<String, Object> serverNetSpeedEcharts(EpsInitialTrafficData epsInitialTrafficData, BigDecimal percentile95) {
|
||||||
List<EpsInitialTrafficData> list = getTrafficListByClientIds(epsInitialTrafficData);
|
List<EpsInitialTrafficData> list = getTrafficListByClientIds(epsInitialTrafficData);
|
||||||
if(!list.isEmpty()){
|
if(list == null){
|
||||||
try {
|
list = new ArrayList<>();
|
||||||
list.forEach(data -> data.setPercentile95(SpeedUtils.mbitToBit(percentile95)));
|
|
||||||
SpeedUtils.SpeedResult result = SpeedUtils.calculateWithStringTraffic(list, "inSpeed", "outSpeed");
|
|
||||||
BigDecimal divisor = SpeedUtils.getDivisor(result.getRecommendedUnit());
|
|
||||||
Map<String, Function<EpsInitialTrafficData, ?>> extractors = new LinkedHashMap<>();
|
|
||||||
|
|
||||||
extractors.put("netOutSpeedData", info ->
|
|
||||||
info != null && info.getOutSpeed() != null ?
|
|
||||||
new BigDecimal(info.getOutSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
|
||||||
0);
|
|
||||||
extractors.put("netMachineFlowData", info ->
|
|
||||||
info != null && info.getMachineFlow() != null ?
|
|
||||||
new BigDecimal(info.getMachineFlow()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
|
||||||
0);
|
|
||||||
extractors.put("percentile95", info ->
|
|
||||||
info != null && info.getPercentile95() != null ?
|
|
||||||
info.getPercentile95().divide(divisor, 2, RoundingMode.HALF_UP) :
|
|
||||||
0);
|
|
||||||
Map<String, Object> resultMap = EchartsDataUtils.buildEchartsData(list, EpsInitialTrafficData::getCreateTime, extractors);
|
|
||||||
resultMap.put("other", result);
|
|
||||||
resultMap.put("95value", percentile95);
|
|
||||||
return resultMap;
|
|
||||||
} catch (Exception e){
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return new HashMap<>();
|
try {
|
||||||
|
list.forEach(data -> data.setPercentile95(SpeedUtils.mbitToBit(percentile95)));
|
||||||
|
SpeedUtils.SpeedResult result = SpeedUtils.calculateWithStringTraffic(list, "inSpeed", "outSpeed");
|
||||||
|
String unit = result.getRecommendedUnit();
|
||||||
|
if(epsInitialTrafficData.getUnit() != null){
|
||||||
|
unit = epsInitialTrafficData.getUnit();
|
||||||
|
}
|
||||||
|
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
||||||
|
Map<String, Function<EpsInitialTrafficData, ?>> extractors = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
extractors.put("netOutSpeedData", info ->
|
||||||
|
info != null && info.getOutSpeed() != null ?
|
||||||
|
new BigDecimal(info.getOutSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
||||||
|
0);
|
||||||
|
extractors.put("netMachineFlowData", info ->
|
||||||
|
info != null && info.getMachineFlow() != null ?
|
||||||
|
new BigDecimal(info.getMachineFlow()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
||||||
|
0);
|
||||||
|
extractors.put("percentile95", info ->
|
||||||
|
info != null && info.getPercentile95() != null ?
|
||||||
|
info.getPercentile95().divide(divisor, 2, RoundingMode.HALF_UP) :
|
||||||
|
0);
|
||||||
|
Map<String, Object> resultMap = EchartsDataUtils.buildEchartsDataAutoPadding(
|
||||||
|
list, EpsInitialTrafficData::getCreateTime, extractors, epsInitialTrafficData.getStartTime(), epsInitialTrafficData.getEndTime()
|
||||||
|
);
|
||||||
|
resultMap.put("other", result);
|
||||||
|
resultMap.put("95value", percentile95);
|
||||||
|
return resultMap;
|
||||||
|
} catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 提取公共方法
|
* 提取公共方法
|
||||||
|
|||||||
+36
-5
@@ -85,6 +85,14 @@ public class EpsTaskStatisticsServiceImpl implements IEpsTaskStatisticsService
|
|||||||
timeRange = startTime + "~" + endTime;
|
timeRange = startTime + "~" + endTime;
|
||||||
}
|
}
|
||||||
taskStatistics.setTimeRange(timeRange);
|
taskStatistics.setTimeRange(timeRange);
|
||||||
|
// 处理包含资源
|
||||||
|
String resources = taskStatistics.getIncludedResources();
|
||||||
|
String result = Arrays.stream(resources.split(","))
|
||||||
|
.map(msg -> msg.split(";"))
|
||||||
|
.filter(resource -> resource.length >= 4)
|
||||||
|
.map(resource -> "[" + resource[3] + "].[" + resource[2] + "]")
|
||||||
|
.collect(Collectors.joining("\n"));
|
||||||
|
taskStatistics.setIncludedResources(result);
|
||||||
}
|
}
|
||||||
return epsTaskStatisticsList;
|
return epsTaskStatisticsList;
|
||||||
}
|
}
|
||||||
@@ -437,15 +445,38 @@ public class EpsTaskStatisticsServiceImpl implements IEpsTaskStatisticsService
|
|||||||
Long taskId = epsTaskStatistics.getId();
|
Long taskId = epsTaskStatistics.getId();
|
||||||
EpsTaskStatistics taskMsg = epsTaskStatisticsMapper.selectEpsTaskStatisticsById(taskId);
|
EpsTaskStatistics taskMsg = epsTaskStatisticsMapper.selectEpsTaskStatisticsById(taskId);
|
||||||
if(StringUtils.equals("1", taskMsg.getResourceType())){
|
if(StringUtils.equals("1", taskMsg.getResourceType())){
|
||||||
EpsInitialTrafficData epsInitialTrafficData = new EpsInitialTrafficData();
|
trafficRedisHashUtil.updateItemPropertyInHash(taskId.toString(), epsTaskStatistics.getNeedTime(),
|
||||||
epsInitialTrafficData.setOutSpeed(epsTaskStatistics.getNeedSpeed().toString());
|
item -> {
|
||||||
epsInitialTrafficData.setCreateTime(DateUtils.parseDate(epsTaskStatistics.getNeedTime()));
|
if (item instanceof EpsInitialTrafficData) {
|
||||||
trafficRedisHashUtil.updateItemInHash(taskId.toString(), epsInitialTrafficData, epsTaskStatistics.getNeedTime());
|
EpsInitialTrafficData trafficItem = (EpsInitialTrafficData) item;
|
||||||
|
trafficItem.setOutSpeed(epsTaskStatistics.getNeedSpeed().toString()); // 只修改outSpeed属性
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Comparator.comparing(
|
||||||
|
(EpsInitialTrafficData item) -> {
|
||||||
|
String speed = item.getOutSpeed();
|
||||||
|
return speed != null ? Double.parseDouble(speed) : 0.0;
|
||||||
|
},
|
||||||
|
Comparator.reverseOrder() // 倒序
|
||||||
|
)
|
||||||
|
);
|
||||||
}else{
|
}else{
|
||||||
InitialSwitchInfoDetails initialSwitchInfoDetails = new InitialSwitchInfoDetails();
|
InitialSwitchInfoDetails initialSwitchInfoDetails = new InitialSwitchInfoDetails();
|
||||||
initialSwitchInfoDetails.setMaxSpeed(epsTaskStatistics.getNeedSpeed());
|
initialSwitchInfoDetails.setMaxSpeed(epsTaskStatistics.getNeedSpeed());
|
||||||
initialSwitchInfoDetails.setCreateTime(DateUtils.parseDate(epsTaskStatistics.getNeedTime()));
|
initialSwitchInfoDetails.setCreateTime(DateUtils.parseDate(epsTaskStatistics.getNeedTime()));
|
||||||
trafficRedisHashUtil.updateItemInHash(taskId.toString(), initialSwitchInfoDetails, epsTaskStatistics.getNeedTime());
|
trafficRedisHashUtil.updateItemPropertyInHash(taskId.toString(), epsTaskStatistics.getNeedTime(),
|
||||||
|
item -> {
|
||||||
|
if (item instanceof InitialSwitchInfoDetails) {
|
||||||
|
InitialSwitchInfoDetails trafficItem = (InitialSwitchInfoDetails) item;
|
||||||
|
trafficItem.setMaxSpeed(epsTaskStatistics.getNeedSpeed()); // 只修改outSpeed属性
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Comparator.comparing(
|
||||||
|
(InitialSwitchInfoDetails item) ->
|
||||||
|
item.getMaxSpeed() != null ? item.getMaxSpeed() : BigDecimal.ZERO,
|
||||||
|
Comparator.reverseOrder() // 倒序
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-8
@@ -803,9 +803,11 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
|
|||||||
joiner.add("【" + businessName + "】");
|
joiner.add("【" + businessName + "】");
|
||||||
}
|
}
|
||||||
String name = joiner.toString();
|
String name = joiner.toString();
|
||||||
resultMap.put("name", name);
|
if(resultMap != null){
|
||||||
resultMap.put("timeRange", timeRange);
|
resultMap.put("name", name);
|
||||||
resultList.add(resultMap);
|
resultMap.put("timeRange", timeRange);
|
||||||
|
resultList.add(resultMap);
|
||||||
|
}
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -900,9 +902,11 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
|
|||||||
joiner.add("【" + businessName + "】");
|
joiner.add("【" + businessName + "】");
|
||||||
}
|
}
|
||||||
String name = joiner.toString();
|
String name = joiner.toString();
|
||||||
resultMap.put("name", name);
|
if(resultMap != null){
|
||||||
resultMap.put("timeRange", timeRange);
|
resultMap.put("name", name);
|
||||||
resultList.add(resultMap);
|
resultMap.put("timeRange", timeRange);
|
||||||
|
resultList.add(resultMap);
|
||||||
|
}
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -922,7 +926,11 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
|
|||||||
try {
|
try {
|
||||||
list.forEach(data -> data.setPercentile95(SpeedUtils.mbitToBit(percentile95)));
|
list.forEach(data -> data.setPercentile95(SpeedUtils.mbitToBit(percentile95)));
|
||||||
SpeedUtils.SpeedResult result = SpeedUtils.calculateWithAverageBasedUnit(list, "inSpeed", "outSpeed");
|
SpeedUtils.SpeedResult result = SpeedUtils.calculateWithAverageBasedUnit(list, "inSpeed", "outSpeed");
|
||||||
BigDecimal divisor = SpeedUtils.getDivisor(result.getRecommendedUnit());
|
String unit = result.getRecommendedUnit();
|
||||||
|
if(initialSwitchInfoDetails.getUnit() != null){
|
||||||
|
unit = initialSwitchInfoDetails.getUnit();
|
||||||
|
}
|
||||||
|
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
||||||
Map<String, Function<InitialSwitchInfoDetails, ?>> extractors = new LinkedHashMap<>();
|
Map<String, Function<InitialSwitchInfoDetails, ?>> extractors = new LinkedHashMap<>();
|
||||||
extractors.put("netInSpeedData", info ->
|
extractors.put("netInSpeedData", info ->
|
||||||
info != null && info.getInSpeed() != null ?
|
info != null && info.getInSpeed() != null ?
|
||||||
@@ -944,6 +952,6 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
|
|||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return new HashMap<>();
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import java.util.regex.Pattern;
|
|||||||
|
|
||||||
public class CalculateUtil {
|
public class CalculateUtil {
|
||||||
|
|
||||||
private static final Pattern SPEED_PATTERN = Pattern.compile("(\\d+\\.?\\d*)\\s*(\\S*)");
|
private static final Pattern SPEED_PATTERN = Pattern.compile("^\\s*([-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][-+]?\\d+)?)\\s*([a-zA-Z/]*)?\\s*$");
|
||||||
/**
|
/**
|
||||||
* 单位换算
|
* 单位换算
|
||||||
* @param speedWithUnit
|
* @param speedWithUnit
|
||||||
|
|||||||
+32
@@ -77,6 +77,38 @@ public class TrafficRedisHashUtil {
|
|||||||
saveListToHash(taskId, dataList);
|
saveListToHash(taskId, dataList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 修改列表中某条数据的特定属性值,并重新排序
|
||||||
|
* @param taskId 任务ID
|
||||||
|
* @param createTime 用于匹配的时间
|
||||||
|
* @param propertyUpdater 属性修改器
|
||||||
|
* @param comparator 排序比较器(用于重新排序)
|
||||||
|
*/
|
||||||
|
public <T> void updateItemPropertyInHash(String taskId, String createTime,
|
||||||
|
java.util.function.Consumer<T> propertyUpdater,
|
||||||
|
java.util.Comparator<T> comparator) {
|
||||||
|
List<T> dataList = (List<T>) getListFromHash(taskId);
|
||||||
|
|
||||||
|
if (dataList != null) {
|
||||||
|
boolean modified = false;
|
||||||
|
for (int i = 0; i < dataList.size(); i++) {
|
||||||
|
T item = dataList.get(i);
|
||||||
|
String itemCreateTime = getCreateTimeFromObject(item);
|
||||||
|
if (itemCreateTime != null && itemCreateTime.equals(createTime)) {
|
||||||
|
// 只修改匹配项的属性
|
||||||
|
propertyUpdater.accept(item);
|
||||||
|
modified = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modified) {
|
||||||
|
// 重新排序(从大到小)
|
||||||
|
dataList.sort(comparator);
|
||||||
|
saveListToHash(taskId, dataList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新Hash中的特定项(使用自定义匹配器)
|
* 更新Hash中的特定项(使用自定义匹配器)
|
||||||
|
|||||||
+3
@@ -76,6 +76,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<when test="userId != null">
|
<when test="userId != null">
|
||||||
and user_id = #{userId}
|
and user_id = #{userId}
|
||||||
</when>
|
</when>
|
||||||
|
<when test="pageRoute != null">
|
||||||
|
and page_route = #{pageRoute}
|
||||||
|
</when>
|
||||||
<otherwise>
|
<otherwise>
|
||||||
and 1=0 <!-- 如果两个条件都不满足,则不更新任何记录 -->
|
and 1=0 <!-- 如果两个条件都不满足,则不更新任何记录 -->
|
||||||
</otherwise>
|
</otherwise>
|
||||||
|
|||||||
@@ -72,5 +72,7 @@ public class InitialBandwidthTraffic extends BaseEntity
|
|||||||
private String startTime;
|
private String startTime;
|
||||||
/** 结束时间 */
|
/** 结束时间 */
|
||||||
private String endTime;
|
private String endTime;
|
||||||
|
/** 单位 */
|
||||||
|
private String unit;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,8 @@ public class InitialSwitchInfo extends BaseEntity
|
|||||||
private String endTime;
|
private String endTime;
|
||||||
/** 计算方式 */
|
/** 计算方式 */
|
||||||
private String calculationMode;
|
private String calculationMode;
|
||||||
|
/* 单位 */
|
||||||
|
private String unit;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -228,6 +228,9 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
|
|||||||
List<InitialBandwidthTraffic> list = getListByTableName(initialBandwidthTraffic);
|
List<InitialBandwidthTraffic> list = getListByTableName(initialBandwidthTraffic);
|
||||||
try {
|
try {
|
||||||
String unit = SpeedUtils.calculateUnitWithStringTraffic(list, "inSpeed", "outSpeed");
|
String unit = SpeedUtils.calculateUnitWithStringTraffic(list, "inSpeed", "outSpeed");
|
||||||
|
if(initialBandwidthTraffic.getUnit() != null){
|
||||||
|
unit = initialBandwidthTraffic.getUnit();
|
||||||
|
}
|
||||||
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
||||||
Map<String, Function<InitialBandwidthTraffic, ?>> extractors = new LinkedHashMap<>();
|
Map<String, Function<InitialBandwidthTraffic, ?>> extractors = new LinkedHashMap<>();
|
||||||
extractors.put("netInSpeedData", info ->
|
extractors.put("netInSpeedData", info ->
|
||||||
|
|||||||
+3
-2
@@ -2,6 +2,7 @@ package com.ruoyi.rocketmq.service.impl;
|
|||||||
|
|
||||||
import com.ruoyi.common.core.utils.DateUtils;
|
import com.ruoyi.common.core.utils.DateUtils;
|
||||||
import com.ruoyi.common.core.utils.EchartsDataUtils;
|
import com.ruoyi.common.core.utils.EchartsDataUtils;
|
||||||
|
import com.ruoyi.common.core.utils.UnitChangeUtil;
|
||||||
import com.ruoyi.rocketmq.domain.InitialMountPointInfo;
|
import com.ruoyi.rocketmq.domain.InitialMountPointInfo;
|
||||||
import com.ruoyi.rocketmq.mapper.InitialMountPointInfoMapper;
|
import com.ruoyi.rocketmq.mapper.InitialMountPointInfoMapper;
|
||||||
import com.ruoyi.rocketmq.service.IInitialMountPointInfoService;
|
import com.ruoyi.rocketmq.service.IInitialMountPointInfoService;
|
||||||
@@ -133,8 +134,8 @@ public class InitialMountPointInfoServiceImpl implements IInitialMountPointInfoS
|
|||||||
public Map<String, Object> spaceEcharts(InitialMountPointInfo initialMountPointInfo) {
|
public Map<String, Object> spaceEcharts(InitialMountPointInfo initialMountPointInfo) {
|
||||||
List<InitialMountPointInfo> list = initialMountPointInfoMapper.selectInitialMountPointInfoList(initialMountPointInfo);
|
List<InitialMountPointInfo> list = initialMountPointInfoMapper.selectInitialMountPointInfoList(initialMountPointInfo);
|
||||||
Map<String, Function<InitialMountPointInfo, ?>> extractors = new LinkedHashMap<>();
|
Map<String, Function<InitialMountPointInfo, ?>> extractors = new LinkedHashMap<>();
|
||||||
extractors.put("vfsFreeData", info -> info.getVfsFree() / 1024.0);
|
extractors.put("vfsFreeData", info -> UnitChangeUtil.bytesToGb(info.getVfsFree()));
|
||||||
extractors.put("vfsTotalData", info -> info.getVfsTotal() / 1024.0);
|
extractors.put("vfsTotalData", info -> UnitChangeUtil.bytesToGb(info.getVfsTotal()));
|
||||||
return EchartsDataUtils.buildEchartsData(list,InitialMountPointInfo::getCreateTime, extractors);
|
return EchartsDataUtils.buildEchartsData(list,InitialMountPointInfo::getCreateTime, extractors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -136,7 +136,7 @@ public class InitialSwitchInfoServiceImpl implements IInitialSwitchInfoService
|
|||||||
@Override
|
@Override
|
||||||
public InitialSwitchInfo getSwitchNetDetailsMsg(InitialSwitchInfo initialSwitchInfo) {
|
public InitialSwitchInfo getSwitchNetDetailsMsg(InitialSwitchInfo initialSwitchInfo) {
|
||||||
InitialSwitchInfo info = initialSwitchInfoMapper.getSwitchNetDetailsMsg(initialSwitchInfo);
|
InitialSwitchInfo info = initialSwitchInfoMapper.getSwitchNetDetailsMsg(initialSwitchInfo);
|
||||||
if(info.getType()!=null){
|
if(info != null && info.getType()!=null){
|
||||||
info.setType(ConvertOtherTypeUtil.getInterfaceTypeName(Integer.parseInt(info.getType())));
|
info.setType(ConvertOtherTypeUtil.getInterfaceTypeName(Integer.parseInt(info.getType())));
|
||||||
}
|
}
|
||||||
return info;
|
return info;
|
||||||
@@ -152,6 +152,9 @@ public class InitialSwitchInfoServiceImpl implements IInitialSwitchInfoService
|
|||||||
List<InitialSwitchInfo> list = initialSwitchInfoMapper.selectInitialSwitchInfoList(initialSwitchInfo);
|
List<InitialSwitchInfo> list = initialSwitchInfoMapper.selectInitialSwitchInfoList(initialSwitchInfo);
|
||||||
try {
|
try {
|
||||||
String unit = SpeedUtils.calculateUnit(list, "inSpeed", "outSpeed");
|
String unit = SpeedUtils.calculateUnit(list, "inSpeed", "outSpeed");
|
||||||
|
if(initialSwitchInfo.getUnit() != null){
|
||||||
|
unit = initialSwitchInfo.getUnit();
|
||||||
|
}
|
||||||
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
||||||
Map<String, Function<InitialSwitchInfo, ?>> extractors = new LinkedHashMap<>();
|
Map<String, Function<InitialSwitchInfo, ?>> extractors = new LinkedHashMap<>();
|
||||||
extractors.put("netInSpeedData", info ->
|
extractors.put("netInSpeedData", info ->
|
||||||
|
|||||||
+9
-1
@@ -2,6 +2,7 @@ package com.ruoyi.rocketmq.service.impl;
|
|||||||
|
|
||||||
import com.ruoyi.common.core.utils.DateUtils;
|
import com.ruoyi.common.core.utils.DateUtils;
|
||||||
import com.ruoyi.common.core.utils.EchartsDataUtils;
|
import com.ruoyi.common.core.utils.EchartsDataUtils;
|
||||||
|
import com.ruoyi.common.core.utils.UnitChangeUtil;
|
||||||
import com.ruoyi.rocketmq.domain.InitialCpuInfo;
|
import com.ruoyi.rocketmq.domain.InitialCpuInfo;
|
||||||
import com.ruoyi.rocketmq.domain.InitialSystemOtherCollectData;
|
import com.ruoyi.rocketmq.domain.InitialSystemOtherCollectData;
|
||||||
import com.ruoyi.rocketmq.enums.ServerLogoEnum;
|
import com.ruoyi.rocketmq.enums.ServerLogoEnum;
|
||||||
@@ -199,7 +200,14 @@ public class InitialSystemOtherCollectDataServiceImpl implements IInitialSystemO
|
|||||||
List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
|
List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
|
||||||
|
|
||||||
Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
|
Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
|
||||||
extractors.put("memorySizeAvailableData", InitialSystemOtherCollectData::getCollectValue);
|
extractors.put("memorySizeAvailableData", data -> {
|
||||||
|
try {
|
||||||
|
String kbValue = data.getCollectValue();
|
||||||
|
return kbValue == null ? "0.00" : UnitChangeUtil.convertKbToGb(kbValue);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "0.00";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
|
return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
|
||||||
}
|
}
|
||||||
|
|||||||
+20
@@ -1,6 +1,8 @@
|
|||||||
package com.ruoyi.rocketmq.service.impl;
|
package com.ruoyi.rocketmq.service.impl;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.ruoyi.common.core.constant.SecurityConstants;
|
||||||
|
import com.ruoyi.common.core.domain.R;
|
||||||
import com.ruoyi.common.core.enums.MsgEnum;
|
import com.ruoyi.common.core.enums.MsgEnum;
|
||||||
import com.ruoyi.common.core.utils.DateUtils;
|
import com.ruoyi.common.core.utils.DateUtils;
|
||||||
import com.ruoyi.common.core.utils.StringUtils;
|
import com.ruoyi.common.core.utils.StringUtils;
|
||||||
@@ -14,6 +16,7 @@ import com.ruoyi.rocketmq.service.IRmMonitorPolicyService;
|
|||||||
import com.ruoyi.rocketmq.snmp.scheduler.MultiSwitchCollectionScheduler;
|
import com.ruoyi.rocketmq.snmp.scheduler.MultiSwitchCollectionScheduler;
|
||||||
import com.ruoyi.rocketmq.utils.DataProcessUtil;
|
import com.ruoyi.rocketmq.utils.DataProcessUtil;
|
||||||
import com.ruoyi.rocketmq.utils.FieldNameConverterUtil;
|
import com.ruoyi.rocketmq.utils.FieldNameConverterUtil;
|
||||||
|
import com.ruoyi.system.api.RemoteRevenueConfigService;
|
||||||
import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
|
import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
|
||||||
import com.ruoyi.system.api.domain.RmSwitchManagementRemote;
|
import com.ruoyi.system.api.domain.RmSwitchManagementRemote;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -53,6 +56,8 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
|
|||||||
private RmInitialMonitorItemMapper rmInitialMonitorItemMapper;
|
private RmInitialMonitorItemMapper rmInitialMonitorItemMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private DataProcessUtil dataProcessUtil;
|
private DataProcessUtil dataProcessUtil;
|
||||||
|
@Autowired
|
||||||
|
private RemoteRevenueConfigService remoteRevenueConfigService;
|
||||||
|
|
||||||
private final MultiSwitchCollectionScheduler scheduler;
|
private final MultiSwitchCollectionScheduler scheduler;
|
||||||
|
|
||||||
@@ -82,6 +87,21 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
|
|||||||
@Override
|
@Override
|
||||||
public List<RmMonitorPolicy> selectRmMonitorPolicyList(RmMonitorPolicy rmMonitorPolicy)
|
public List<RmMonitorPolicy> selectRmMonitorPolicyList(RmMonitorPolicy rmMonitorPolicy)
|
||||||
{
|
{
|
||||||
|
if("switch".equals(rmMonitorPolicy.getResourceType()) && rmMonitorPolicy.getQueryName() != null){
|
||||||
|
// 查询交换机clientId
|
||||||
|
String queryName = rmMonitorPolicy.getQueryName();
|
||||||
|
RmSwitchManagementRemote rmSwitchManagementRemote = new RmSwitchManagementRemote();
|
||||||
|
rmSwitchManagementRemote.setSwitchName(queryName);
|
||||||
|
R<List<RmSwitchManagementRemote>> switchMsgR = remoteRevenueConfigService.getSwitchNameByClientId(rmSwitchManagementRemote, SecurityConstants.INNER);
|
||||||
|
if(switchMsgR != null && !switchMsgR.getData().isEmpty()){
|
||||||
|
StringJoiner joiner = new StringJoiner(",");
|
||||||
|
for (RmSwitchManagementRemote switchMsg : switchMsgR.getData()) {
|
||||||
|
joiner.add(switchMsg.getClientId());
|
||||||
|
}
|
||||||
|
rmMonitorPolicy.setQueryName(joiner.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
List<RmMonitorPolicy> list = rmMonitorPolicyMapper.selectRmMonitorPolicyList(rmMonitorPolicy);
|
List<RmMonitorPolicy> list = rmMonitorPolicyMapper.selectRmMonitorPolicyList(rmMonitorPolicy);
|
||||||
for (RmMonitorPolicy monitorPolicy : list) {
|
for (RmMonitorPolicy monitorPolicy : list) {
|
||||||
// 资源组名称
|
// 资源组名称
|
||||||
|
|||||||
@@ -39,8 +39,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<if test="priority != null "> and priority = #{priority}</if>
|
<if test="priority != null "> and priority = #{priority}</if>
|
||||||
<if test="queryName != null and queryName != ''">
|
<if test="queryName != null and queryName != ''">
|
||||||
and (policy_name like concat('%', #{queryName}, '%')
|
and (policy_name like concat('%', #{queryName}, '%')
|
||||||
or template_id in (select id from rm_monitor_template where template_name like concat('%', #{queryName}, '%'))
|
or
|
||||||
or resource_group_id in (select id from rm_resource_group where group_name like concat('%', #{queryName}, '%'))
|
<foreach item="item" index="index" collection="queryName.split(',')" open="(" close=")" separator="or">
|
||||||
|
FIND_IN_SET(#{item}, REPLACE(deploy_device, '\n', ',')) > 0
|
||||||
|
</foreach>
|
||||||
)
|
)
|
||||||
</if>
|
</if>
|
||||||
</where>
|
</where>
|
||||||
|
|||||||
Reference in New Issue
Block a user