1、优化ipv6判断.
2、优化业务流量数据统计。
This commit is contained in:
@@ -42,6 +42,7 @@ import org.springframework.stereotype.Component;
|
|||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
|
import java.net.InetAddress;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
@@ -482,7 +483,7 @@ public class MessageHandler {
|
|||||||
BigDecimal totalRate = BigDecimal.ZERO;
|
BigDecimal totalRate = BigDecimal.ZERO;
|
||||||
// 处理IPv4统计
|
// 处理IPv4统计
|
||||||
if (!ipTypeMap.get("IPv4").isEmpty()) {
|
if (!ipTypeMap.get("IPv4").isEmpty()) {
|
||||||
content.append("##### V4 统计 ##### ##\n");
|
content.append("##### V4 统计 #####\n");
|
||||||
|
|
||||||
// 按省份运营商分组统计(过滤本地省份)
|
// 按省份运营商分组统计(过滤本地省份)
|
||||||
Map<String, Double> v4StatMap = new HashMap<>();
|
Map<String, Double> v4StatMap = new HashMap<>();
|
||||||
@@ -525,7 +526,7 @@ public class MessageHandler {
|
|||||||
|
|
||||||
// 处理IPv6统计
|
// 处理IPv6统计
|
||||||
if (!ipTypeMap.get("IPv6").isEmpty()) {
|
if (!ipTypeMap.get("IPv6").isEmpty()) {
|
||||||
content.append("##### V6 统计 ##### ##\n");
|
content.append("##### V6 统计 #####\n");
|
||||||
|
|
||||||
// 按省份运营商分组统计(过滤本地省份)
|
// 按省份运营商分组统计(过滤本地省份)
|
||||||
Map<String, Double> v6StatMap = new HashMap<>();
|
Map<String, Double> v6StatMap = new HashMap<>();
|
||||||
@@ -2286,48 +2287,17 @@ public class MessageHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
public String checkIPVersion(String ipAddress) {
|
public String checkIPVersion(String ipAddress) {
|
||||||
// 检查是否为 IPv4 地址
|
|
||||||
if (ipAddress.contains(".")) {
|
|
||||||
// 简单的格式验证:IPv4 应该有 4 个部分,每个部分用点分隔
|
|
||||||
String[] parts = ipAddress.split("\\.");
|
|
||||||
if (parts.length == 4) {
|
|
||||||
try {
|
try {
|
||||||
// 验证每个部分是否在 0-255 范围内
|
InetAddress addr = InetAddress.getByName(ipAddress);
|
||||||
for (String part : parts) {
|
if (addr.getHostAddress().contains(":")) {
|
||||||
int num = Integer.parseInt(part);
|
|
||||||
if (num < 0 || num > 255) {
|
|
||||||
return "Invalid IP Address";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "IPv4";
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
return "Invalid IP Address";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检查是否为 IPv6 地址
|
|
||||||
if (ipAddress.contains(":")) {
|
|
||||||
// 简单的格式验证:IPv6 应该包含冒号分隔的十六进制数
|
|
||||||
String[] parts = ipAddress.split(":");
|
|
||||||
if (parts.length >= 3 && parts.length <= 8) {
|
|
||||||
try {
|
|
||||||
// 验证每个部分是否为有效的十六进制数
|
|
||||||
for (String part : parts) {
|
|
||||||
if (!part.isEmpty()) {
|
|
||||||
// 允许空的部分(表示连续的零)
|
|
||||||
Integer.parseInt(part, 16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "IPv6";
|
return "IPv6";
|
||||||
} catch (NumberFormatException e) {
|
} else {
|
||||||
|
return "IPv4";
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
return "Invalid IP Address";
|
return "Invalid IP Address";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return "Invalid IP Address";
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* 查询IP地址归属地信息,返回运营商和省份
|
* 查询IP地址归属地信息,返回运营商和省份
|
||||||
*/
|
*/
|
||||||
|
|||||||
+21
-104
@@ -588,7 +588,7 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
|
|||||||
try {
|
try {
|
||||||
// 根据业务名称查询业务进程名
|
// 根据业务名称查询业务进程名
|
||||||
String businessName = initialBandwidthTraffic.getBusinessName();
|
String businessName = initialBandwidthTraffic.getBusinessName();
|
||||||
if(businessName != null){
|
if(businessName != null && !businessName.isEmpty()){
|
||||||
List<AllBusinessNetName> allBusinessNetNameList = allBusinessNetNameService.selectAllBusinessNetNameList(new AllBusinessNetName());
|
List<AllBusinessNetName> allBusinessNetNameList = allBusinessNetNameService.selectAllBusinessNetNameList(new AllBusinessNetName());
|
||||||
|
|
||||||
// 第一步:过滤
|
// 第一步:过滤
|
||||||
@@ -604,8 +604,6 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
|
|||||||
|
|
||||||
List<AllBusinessNetName> result = new ArrayList<>(uniqueMap.values());
|
List<AllBusinessNetName> result = new ArrayList<>(uniqueMap.values());
|
||||||
|
|
||||||
// 用于存储所有业务的单位,用于后续统一单位处理
|
|
||||||
Map<String, String> businessUnits = new HashMap<>();
|
|
||||||
// 用于存储业务的显示名称
|
// 用于存储业务的显示名称
|
||||||
Map<String, String> businessDisplayNames = new HashMap<>();
|
Map<String, String> businessDisplayNames = new HashMap<>();
|
||||||
|
|
||||||
@@ -616,7 +614,7 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
|
|||||||
businessTrafficQuery.setProcessName(allBusinessNetName.getProcessName());
|
businessTrafficQuery.setProcessName(allBusinessNetName.getProcessName());
|
||||||
businessTrafficQuery.setStartTime(initialBandwidthTraffic.getStartTime());
|
businessTrafficQuery.setStartTime(initialBandwidthTraffic.getStartTime());
|
||||||
businessTrafficQuery.setEndTime(initialBandwidthTraffic.getEndTime());
|
businessTrafficQuery.setEndTime(initialBandwidthTraffic.getEndTime());
|
||||||
// 获取业务流量图表数据
|
// 获取业务流量图表数据(返回的是bit单位)
|
||||||
Map<String, Object> businessResult = initialNetBusinessTrafficService.businessTrafficEcharts(businessTrafficQuery);
|
Map<String, Object> businessResult = initialNetBusinessTrafficService.businessTrafficEcharts(businessTrafficQuery);
|
||||||
|
|
||||||
if (businessResult != null && !businessResult.isEmpty()) {
|
if (businessResult != null && !businessResult.isEmpty()) {
|
||||||
@@ -631,23 +629,34 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
|
|||||||
// 获取主Map的yData
|
// 获取主Map的yData
|
||||||
Map<String, Object> mainYData = (Map<String, Object>) resultMap.get("yData");
|
Map<String, Object> mainYData = (Map<String, Object>) resultMap.get("yData");
|
||||||
|
|
||||||
// 将业务流量数据合并到主yData中
|
// 将业务流量数据合并到主yData中,直接除以divisor
|
||||||
for (Map.Entry<String, Object> entry : businessYData.entrySet()) {
|
for (Map.Entry<String, Object> entry : businessYData.entrySet()) {
|
||||||
String businessKey = entry.getKey();
|
String businessKey = entry.getKey();
|
||||||
Object businessValue = entry.getValue();
|
Object businessValue = entry.getValue();
|
||||||
|
|
||||||
// 添加业务前缀避免key冲突,格式:business_{进程名}_{数据类型}
|
// 添加业务前缀避免key冲突,格式:business_{进程名}_{数据类型}
|
||||||
String newKey = "business_" + businessPrefix + "_" + businessKey;
|
String newKey = "business_" + businessPrefix + "_" + businessKey;
|
||||||
|
|
||||||
|
// 直接除以divisor进行单位转换
|
||||||
|
if (businessValue instanceof List) {
|
||||||
|
List<BigDecimal> originalList = (List<BigDecimal>) businessValue;
|
||||||
|
List<BigDecimal> convertedList = new ArrayList<>();
|
||||||
|
for (BigDecimal value : originalList) {
|
||||||
|
if (value != null) {
|
||||||
|
convertedList.add(value.divide(divisor, 2, RoundingMode.HALF_UP));
|
||||||
|
} else {
|
||||||
|
convertedList.add(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mainYData.put(newKey, convertedList);
|
||||||
|
} else {
|
||||||
mainYData.put(newKey, businessValue);
|
mainYData.put(newKey, businessValue);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
resultMap.put("yData", mainYData);
|
resultMap.put("yData", mainYData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取业务流量的单位
|
|
||||||
String businessUnit = (String) businessResult.get("unit");
|
|
||||||
businessUnits.put(businessPrefix, businessUnit);
|
|
||||||
|
|
||||||
// 构建业务的显示名称
|
// 构建业务的显示名称
|
||||||
String displayName = allBusinessNetName.getProcessName();
|
String displayName = allBusinessNetName.getProcessName();
|
||||||
if (allBusinessNetName.getRemark() != null && !allBusinessNetName.getRemark().isEmpty()) {
|
if (allBusinessNetName.getRemark() != null && !allBusinessNetName.getRemark().isEmpty()) {
|
||||||
@@ -657,31 +666,15 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 在所有业务数据处理完成后,统一进行单位转换
|
// 添加业务流量的展示关系
|
||||||
if (!businessUnits.isEmpty()) {
|
|
||||||
// 检查是否有业务的单位与主单位不一致
|
|
||||||
boolean needUnitConversion = false;
|
|
||||||
for (String businessUnit : businessUnits.values()) {
|
|
||||||
if (!unit.equals(businessUnit)) {
|
|
||||||
needUnitConversion = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果需要单位转换,统一处理
|
|
||||||
if (needUnitConversion) {
|
|
||||||
convertAllBusinessDataUnit(resultMap, businessUnits, unit);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 单位转换完成后,添加业务流量的展示关系(不再包含单位信息)
|
|
||||||
for (Map.Entry<String, String> entry : businessDisplayNames.entrySet()) {
|
for (Map.Entry<String, String> entry : businessDisplayNames.entrySet()) {
|
||||||
String businessPrefix = entry.getKey();
|
String businessPrefix = entry.getKey();
|
||||||
String displayName = entry.getValue();
|
String displayName = entry.getValue();
|
||||||
|
|
||||||
showRealation.put("business_" + businessPrefix + "_netInSpeedData",
|
showRealation.put("business_" + businessPrefix + "_netInSpeedData",
|
||||||
displayName + " 入站流量");
|
displayName + " 总入站流量");
|
||||||
showRealation.put("business_" + businessPrefix + "_netOutSpeedData",
|
showRealation.put("business_" + businessPrefix + "_netOutSpeedData",
|
||||||
displayName + " 出站流量");
|
displayName + " 总出站流量");
|
||||||
showRealation.put("business_" + businessPrefix + "_netIpv4InSpeedData",
|
showRealation.put("business_" + businessPrefix + "_netIpv4InSpeedData",
|
||||||
displayName + " IPv4入站流量");
|
displayName + " IPv4入站流量");
|
||||||
showRealation.put("business_" + businessPrefix + "_netIpv4OutSpeedData",
|
showRealation.put("business_" + businessPrefix + "_netIpv4OutSpeedData",
|
||||||
@@ -692,7 +685,6 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
|
|||||||
displayName + " IPv6出站流量");
|
displayName + " IPv6出站流量");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// 业务流量数据获取失败,记录日志但不影响主流程
|
// 业务流量数据获取失败,记录日志但不影响主流程
|
||||||
System.err.println("获取业务流量数据失败: " + e.getMessage());
|
System.err.println("获取业务流量数据失败: " + e.getMessage());
|
||||||
@@ -714,81 +706,6 @@ public class InitialBandwidthTrafficServiceImpl implements IInitialBandwidthTraf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 统一转换所有业务数据的单位
|
|
||||||
*/
|
|
||||||
private void convertAllBusinessDataUnit(Map<String, Object> resultMap,
|
|
||||||
Map<String, String> businessUnits,
|
|
||||||
String targetUnit) {
|
|
||||||
try {
|
|
||||||
// 获取主Map的yData
|
|
||||||
Map<String, Object> mainYData = (Map<String, Object>) resultMap.get("yData");
|
|
||||||
if (mainYData == null || mainYData.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个业务计算转换因子
|
|
||||||
Map<String, BigDecimal> conversionFactors = new HashMap<>();
|
|
||||||
for (Map.Entry<String, String> entry : businessUnits.entrySet()) {
|
|
||||||
String businessPrefix = entry.getKey();
|
|
||||||
String fromUnit = entry.getValue();
|
|
||||||
|
|
||||||
if (!targetUnit.equals(fromUnit)) {
|
|
||||||
BigDecimal fromDivisor = SpeedUtils.getDivisor(fromUnit);
|
|
||||||
BigDecimal toDivisor = SpeedUtils.getDivisor(targetUnit);
|
|
||||||
BigDecimal conversionFactor = fromDivisor.divide(toDivisor, 10, RoundingMode.HALF_UP);
|
|
||||||
conversionFactors.put(businessPrefix, conversionFactor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 遍历所有业务流量相关的数据项进行转换
|
|
||||||
for (Map.Entry<String, Object> entry : mainYData.entrySet()) {
|
|
||||||
String key = entry.getKey();
|
|
||||||
|
|
||||||
// 检查是否是业务数据
|
|
||||||
if (key.startsWith("business_")) {
|
|
||||||
// 提取业务前缀
|
|
||||||
String[] keyParts = key.split("_");
|
|
||||||
if (keyParts.length >= 3) {
|
|
||||||
String businessPrefix = keyParts[1];
|
|
||||||
|
|
||||||
// 如果该业务需要转换
|
|
||||||
if (conversionFactors.containsKey(businessPrefix)) {
|
|
||||||
BigDecimal conversionFactor = conversionFactors.get(businessPrefix);
|
|
||||||
Object value = entry.getValue();
|
|
||||||
|
|
||||||
if (value instanceof List) {
|
|
||||||
List<BigDecimal> dataList = (List<BigDecimal>) value;
|
|
||||||
List<BigDecimal> convertedList = new ArrayList<>();
|
|
||||||
|
|
||||||
for (BigDecimal dataPoint : dataList) {
|
|
||||||
if (dataPoint != null) {
|
|
||||||
// 应用转换因子
|
|
||||||
BigDecimal converted = dataPoint.multiply(conversionFactor)
|
|
||||||
.setScale(2, RoundingMode.HALF_UP);
|
|
||||||
convertedList.add(converted);
|
|
||||||
} else {
|
|
||||||
convertedList.add(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新转换后的数据
|
|
||||||
entry.setValue(convertedList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新单位为统一单位
|
|
||||||
resultMap.put("unit", targetUnit);
|
|
||||||
|
|
||||||
System.out.println("所有业务数据单位已统一转换为: " + targetUnit);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.err.println("业务流量单位统一转换失败: " + e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 安全转换方法(处理可能的NumberFormatException)
|
// 安全转换方法(处理可能的NumberFormatException)
|
||||||
private Double safeConvertToKB(String byteValue) {
|
private Double safeConvertToKB(String byteValue) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
+6
-14
@@ -2,7 +2,6 @@ package com.tongran.rocketmq.service.impl;
|
|||||||
|
|
||||||
import com.tongran.common.core.utils.DateUtils;
|
import com.tongran.common.core.utils.DateUtils;
|
||||||
import com.tongran.common.core.utils.EchartsDataUtils;
|
import com.tongran.common.core.utils.EchartsDataUtils;
|
||||||
import com.tongran.common.core.utils.SpeedUtils;
|
|
||||||
import com.tongran.common.core.utils.TableSubUtil;
|
import com.tongran.common.core.utils.TableSubUtil;
|
||||||
import com.tongran.rocketmq.domain.InitialNetBusinessTraffic;
|
import com.tongran.rocketmq.domain.InitialNetBusinessTraffic;
|
||||||
import com.tongran.rocketmq.mapper.InitialNetBusinessTrafficMapper;
|
import com.tongran.rocketmq.mapper.InitialNetBusinessTrafficMapper;
|
||||||
@@ -15,7 +14,6 @@ import org.springframework.transaction.annotation.Isolation;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
|
||||||
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;
|
||||||
@@ -219,42 +217,36 @@ public class InitialNetBusinessTrafficServiceImpl implements IInitialNetBusiness
|
|||||||
public Map<String, Object> businessTrafficEcharts(InitialNetBusinessTraffic initialNetBusinessTraffic) {
|
public Map<String, Object> businessTrafficEcharts(InitialNetBusinessTraffic initialNetBusinessTraffic) {
|
||||||
List<InitialNetBusinessTraffic> list = getListByTableName(initialNetBusinessTraffic);
|
List<InitialNetBusinessTraffic> list = getListByTableName(initialNetBusinessTraffic);
|
||||||
try {
|
try {
|
||||||
String unit = SpeedUtils.calculateUnit(list, "inSpeed", "outSpeed");
|
|
||||||
if(initialNetBusinessTraffic.getUnit() != null){
|
|
||||||
unit = initialNetBusinessTraffic.getUnit();
|
|
||||||
}
|
|
||||||
BigDecimal divisor = SpeedUtils.getDivisor(unit);
|
|
||||||
Map<String, Function<InitialNetBusinessTraffic, ?>> extractors = new LinkedHashMap<>();
|
Map<String, Function<InitialNetBusinessTraffic, ?>> extractors = new LinkedHashMap<>();
|
||||||
extractors.put("netInSpeedData", info ->
|
extractors.put("netInSpeedData", info ->
|
||||||
info != null && info.getInSpeed() != null ?
|
info != null && info.getInSpeed() != null ?
|
||||||
new BigDecimal(info.getInSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
new BigDecimal(info.getInSpeed()) :
|
||||||
null);
|
null);
|
||||||
|
|
||||||
extractors.put("netOutSpeedData", info ->
|
extractors.put("netOutSpeedData", info ->
|
||||||
info != null && info.getOutSpeed() != null ?
|
info != null && info.getOutSpeed() != null ?
|
||||||
new BigDecimal(info.getOutSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
new BigDecimal(info.getOutSpeed()) :
|
||||||
null);
|
null);
|
||||||
extractors.put("netIpv4InSpeedData", info ->
|
extractors.put("netIpv4InSpeedData", info ->
|
||||||
info != null && info.getIpv4InSpeed() != null ?
|
info != null && info.getIpv4InSpeed() != null ?
|
||||||
new BigDecimal(info.getIpv4InSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
new BigDecimal(info.getIpv4InSpeed()) :
|
||||||
null);
|
null);
|
||||||
extractors.put("netIpv4OutSpeedData", info ->
|
extractors.put("netIpv4OutSpeedData", info ->
|
||||||
info != null && info.getIpv4OutSpeed() != null ?
|
info != null && info.getIpv4OutSpeed() != null ?
|
||||||
new BigDecimal(info.getIpv4OutSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
new BigDecimal(info.getIpv4OutSpeed()) :
|
||||||
null);
|
null);
|
||||||
extractors.put("netIpv6InSpeedData", info ->
|
extractors.put("netIpv6InSpeedData", info ->
|
||||||
info != null && info.getIpv6InSpeed() != null ?
|
info != null && info.getIpv6InSpeed() != null ?
|
||||||
new BigDecimal(info.getIpv6InSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
new BigDecimal(info.getIpv6InSpeed()) :
|
||||||
null);
|
null);
|
||||||
extractors.put("netIpv6OutSpeedData", info ->
|
extractors.put("netIpv6OutSpeedData", info ->
|
||||||
info != null && info.getIpv6OutSpeed() != null ?
|
info != null && info.getIpv6OutSpeed() != null ?
|
||||||
new BigDecimal(info.getIpv6OutSpeed()).divide(divisor, 2, RoundingMode.HALF_UP) :
|
new BigDecimal(info.getIpv6OutSpeed()) :
|
||||||
null);
|
null);
|
||||||
Map<String, Object> resultMap = EchartsDataUtils.buildEchartsDataAutoPadding(
|
Map<String, Object> resultMap = EchartsDataUtils.buildEchartsDataAutoPadding(
|
||||||
list, InitialNetBusinessTraffic::getCreateTime, extractors,
|
list, InitialNetBusinessTraffic::getCreateTime, extractors,
|
||||||
initialNetBusinessTraffic.getStartTime(), initialNetBusinessTraffic.getEndTime()
|
initialNetBusinessTraffic.getStartTime(), initialNetBusinessTraffic.getEndTime()
|
||||||
);
|
);
|
||||||
resultMap.put("unit", unit);
|
|
||||||
return resultMap;
|
return resultMap;
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
Reference in New Issue
Block a user