diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusQueryTypeEnum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusQueryTypeEnum.java new file mode 100644 index 0000000..23739a9 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/PrometheusQueryTypeEnum.java @@ -0,0 +1,64 @@ +package org.jeecg.common.constant.enums; + +import java.time.Instant; + +/** + * Prometheus 范围查询条件枚举 + */ +public enum PrometheusQueryTypeEnum { + + FIVE_MIN("Last 5 minutes",(5*60),"15s"), + THIRTY_MIN("Last 30 minutes",(30*60),"15s"), + ONE_HOUR("Last 1 hour",(60*60),"15s"), + THREE_HOURS("Last 3 hours",(3*60*60),"15s"), + SIX_HOURS("Last 6 hours",(6*60*60),"15s"), + TWELVE_HOURS("Last 12 hours",(12*60*60),"1m0s"), + TWENTY_FOUR_HOURS("Last 24 hours",(24*60*60),"2m0s"), + TWO_DAYS("Last 2 days",(2*24*60*60),"5m0s"), + SEVEN_DAYS("Last 7 days",(7*24*60*60),"15m0s"); + + /** + * Prometheus 范围查询条件 + */ + private String conditions; + /** + * Prometheus 范围起始时间需要减的值(秒) + */ + private long lastSecond; + /** + * 间隔步长 + */ + private String step; + + PrometheusQueryTypeEnum(String conditions, Integer number, String step) { + this.conditions = conditions; + this.lastSecond = number; + this.step = step; + } + + public String getConditions() { + return conditions; + } + + public long getLastSecond() { + return lastSecond; + } + + public String getStep() { + return step; + } + + /** + * 返回对应枚举 + * @param conditions + * @return + */ + public static PrometheusQueryTypeEnum getQueryTypeEnum(String conditions) { + for (PrometheusQueryTypeEnum queryTypeEnum : PrometheusQueryTypeEnum.values()) { + if (queryTypeEnum.getConditions().equals(conditions)) { + return queryTypeEnum; + } + } + return null; + } +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java index eeef974..683cc2d 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java @@ -18,4 +18,9 @@ public class PrometheusServerProperties { * node-exporter实例地址 */ private String instance; + + /** + * 监测的网卡名称 + */ + private String networkCardName; } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/SourceRebuildTask.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/SourceRebuildTask.java index f0c99d6..e7e4d6b 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/SourceRebuildTask.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/SourceRebuildTask.java @@ -142,7 +142,7 @@ public class SourceRebuildTask implements Serializable { private Integer sourceStrength; /** - * 耗时 + * 耗时(分钟) */ @Null(message = "耗时必须为空",groups = {InsertGroup.class, UpdateGroup.class}) @TableField(value = "time_consuming") diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ServiceMonitorController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ServiceMonitorController.java index b080619..100341a 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ServiceMonitorController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/controller/ServiceMonitorController.java @@ -1,13 +1,16 @@ package org.jeecg.modules.monitor.controller; +import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.modules.monitor.service.HostMonitorService; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +@Validated @RestController @RequestMapping("monitor") @RequiredArgsConstructor @@ -15,30 +18,54 @@ public class ServiceMonitorController { private final HostMonitorService hostMonitorService; - @AutoLog(value = "获取CPU信息") + @AutoLog(value = "查询当前时刻的CPU使用率") @GetMapping("getCpuInfo") public Result getCpuInfo() { return Result.OK(hostMonitorService.getCpuInfo()); } + @AutoLog(value = "查询过去指定时间范围内的CPU使用率") + @GetMapping("getCpuInfoList") + public Result getCpuInfoList(@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(hostMonitorService.getCpuInfoList(conditions)); + } + @AutoLog(value = "获取CPU核心数") @GetMapping("getCpuCoreInfo") public Result getCpuCoreInfo() { return Result.OK(hostMonitorService.getCpuCoreInfo()); } - @AutoLog(value = "获取内存监测数据") + @AutoLog(value = "查询当前时刻的内存使用率") @GetMapping("getMemoryInfo") public Result getMemoryInfo() { return Result.OK(hostMonitorService.getMemoryInfo()); } + @AutoLog(value = "获取总内存") + @GetMapping("getTotleMemoryInfo") + public Result getTotleMemoryInfo() { + return Result.OK(hostMonitorService.getTotleMemoryInfo()); + } + + @AutoLog(value = "查询过去指定时间范围内的内存使用率") + @GetMapping("getMemoryInfoList") + public Result getMemoryInfoList(@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(hostMonitorService.getMemoryInfoList(conditions)); + } + @AutoLog(value = "获取网络带宽监测数据") @GetMapping("getNetworkInfo") public Result getNetworkInfo() { return Result.OK(hostMonitorService.getNetworkInfo()); } + @AutoLog(value = "获取网络带宽监测数据") + @GetMapping("getNetworkInfoList") + public Result getNetworkInfoList(@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(hostMonitorService.getNetworkInfoList(conditions)); + } + @AutoLog(value = "获取磁盘使用率") @GetMapping("getDiskInfo") public Result getDiskInfo() { diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java index 71b8e41..daab3b0 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java @@ -1,6 +1,7 @@ package org.jeecg.modules.monitor.service; +import java.util.List; import java.util.Map; public interface HostMonitorService { @@ -10,6 +11,11 @@ public interface HostMonitorService { */ Map getCpuInfo(); + /** + * 获取CPU信息列表 + */ + List> getCpuInfoList(String conditions); + /** * 获取CPU核心数 */ @@ -20,19 +26,30 @@ public interface HostMonitorService { */ Map getMemoryInfo(); + /** + * 获取内存信息列表 + */ + List> getMemoryInfoList(String conditions); + + /** + * 获取总内存 + * @return + */ + Map getTotleMemoryInfo(); + /** * 获取网络信息 */ Map getNetworkInfo(); + /** + * 获取网络信息列表 + * @return + */ + Map>> getNetworkInfoList(String conditions); + /** * 获取磁盘使用率 */ Map getDiskInfo(); - - /** - * 获取磁盘吞吐量 - * @return - */ - Map getDiskThroughputInfo(); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java index 4099aba..026cab0 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java @@ -4,21 +4,18 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.constant.enums.PrometheusQueryTypeEnum; import org.jeecg.common.properties.PrometheusServerProperties; import org.jeecg.modules.monitor.service.HostMonitorService; import org.jeecg.modules.monitor.vo.PrometheusResponse; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.util.UriComponentsBuilder; -import reactor.core.publisher.Mono; - import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URI; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; +import java.time.Instant; +import java.util.*; /** * 基于Prometheus的主机监控 @@ -43,7 +40,7 @@ public class HostMonitorServiceImpl implements HostMonitorService { //目标主机实例(node-exporter 的地址) String instance = serverProperties.getInstance(); //查询CPU利用率 - String cpuQuery = "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\", instance=\""+instance+"\"}[1m0s])))"; + String cpuQuery = "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\", instance=\""+instance+"\"}[15s])))"; PrometheusResponse response = webClient.get() .uri(buildUri(url,cpuQuery)) .retrieve() @@ -57,7 +54,7 @@ public class HostMonitorServiceImpl implements HostMonitorService { if(CollUtil.isNotEmpty(cpuInfo.getValue())) { Date date = new Date(cpuInfo.getValue().get(0).longValue()*1000); Double useRate = BigDecimal.valueOf(cpuInfo.getValue().get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); - result.put("date", DateUtil.format(date, "yyyy-MM-dd HH:mm:ss")); + result.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); result.put("usageRate", useRate); } } @@ -67,6 +64,51 @@ public class HostMonitorServiceImpl implements HostMonitorService { return result; } + /** + * 获取CPU信息列表 + */ + @Override + public List> getCpuInfoList(String conditions) { + List> result = new ArrayList<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getInstance(); + //查询CPU利用率 + String cpuQuery = "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\", instance=\""+instance+"\"}[15s])))"; + PrometheusQueryTypeEnum queryTypeEnum = PrometheusQueryTypeEnum.getQueryTypeEnum(conditions); + long end = Instant.now().getEpochSecond(); + long start = end - queryTypeEnum.getLastSecond(); + String step = queryTypeEnum.getStep(); + PrometheusResponse response = webClient.get() + .uri(buildUri(url,cpuQuery,start,end,step)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(response) && + Objects.nonNull(response.getData()) && + CollUtil.isNotEmpty(response.getData().getResult()) + ) { + PrometheusResponse.Result cpuInfoList = response.getData().getResult().get(0); + if(CollUtil.isNotEmpty(cpuInfoList.getValues())) { + List> pointDatas = cpuInfoList.getValues(); + for(List pointData : pointDatas) { + Map pointDataMap = new HashMap<>(); + Date date = new Date(pointData.get(0).longValue()*1000); + Double useRate = BigDecimal.valueOf(pointData.get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + pointDataMap.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); + pointDataMap.put("usageRate", useRate); + result.add(pointDataMap); + } + } + } + }catch (Exception e){ + log.error("获取CPU信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; + } + /** * 获取CPU核心数 */ @@ -113,39 +155,39 @@ public class HostMonitorServiceImpl implements HostMonitorService { //目标主机实例(node-exporter 的地址) String instance = serverProperties.getInstance(); //查询总内存 - String totalMemoryQuery = "node_memory_MemTotal_bytes{instance=\"" + instance + "\"}"; - PrometheusResponse totalMemoryResponse = webClient.get() - .uri(buildUri(url,totalMemoryQuery)) - .retrieve() - .bodyToMono(PrometheusResponse.class) - .block(); - if(Objects.nonNull(totalMemoryResponse) && - Objects.nonNull(totalMemoryResponse.getData()) && - CollUtil.isNotEmpty(totalMemoryResponse.getData().getResult()) - ) { - PrometheusResponse.Result totalMemoryInfo = totalMemoryResponse.getData().getResult().get(0); - if(CollUtil.isNotEmpty(totalMemoryInfo.getValue())) { - Double totalMemory = BigDecimal.valueOf(totalMemoryInfo.getValue().get(1)/1024/1024/1024).setScale(2, RoundingMode.HALF_UP).doubleValue(); - result.put("totalMemory",totalMemory); - } - } +// String totalMemoryQuery = "node_memory_MemTotal_bytes{instance=\"" + instance + "\"}"; +// PrometheusResponse totalMemoryResponse = webClient.get() +// .uri(buildUri(url,totalMemoryQuery)) +// .retrieve() +// .bodyToMono(PrometheusResponse.class) +// .block(); +// if(Objects.nonNull(totalMemoryResponse) && +// Objects.nonNull(totalMemoryResponse.getData()) && +// CollUtil.isNotEmpty(totalMemoryResponse.getData().getResult()) +// ) { +// PrometheusResponse.Result totalMemoryInfo = totalMemoryResponse.getData().getResult().get(0); +// if(CollUtil.isNotEmpty(totalMemoryInfo.getValue())) { +// Double totalMemory = BigDecimal.valueOf(totalMemoryInfo.getValue().get(1)/1024/1024/1024).setScale(2, RoundingMode.HALF_UP).doubleValue(); +// result.put("totalMemory",totalMemory); +// } +// } //剩余可用内存 - String availableMemoryQuery = "node_memory_MemAvailable_bytes{instance=\"" + instance + "\"}"; - PrometheusResponse availableMemoryResponse = webClient.get() - .uri(buildUri(url,availableMemoryQuery)) - .retrieve() - .bodyToMono(PrometheusResponse.class) - .block();; - if(Objects.nonNull(availableMemoryResponse) && - Objects.nonNull(availableMemoryResponse.getData()) && - CollUtil.isNotEmpty(availableMemoryResponse.getData().getResult()) - ) { - PrometheusResponse.Result availableMemoryInfo = availableMemoryResponse.getData().getResult().get(0); - if(CollUtil.isNotEmpty(availableMemoryInfo.getValue())) { - Double availableMemory = BigDecimal.valueOf(availableMemoryInfo.getValue().get(1)/1024/1024/1024).setScale(2, RoundingMode.HALF_UP).doubleValue(); - result.put("availableMemory",availableMemory); - } - } +// String availableMemoryQuery = "node_memory_MemAvailable_bytes{instance=\"" + instance + "\"}"; +// PrometheusResponse availableMemoryResponse = webClient.get() +// .uri(buildUri(url,availableMemoryQuery)) +// .retrieve() +// .bodyToMono(PrometheusResponse.class) +// .block();; +// if(Objects.nonNull(availableMemoryResponse) && +// Objects.nonNull(availableMemoryResponse.getData()) && +// CollUtil.isNotEmpty(availableMemoryResponse.getData().getResult()) +// ) { +// PrometheusResponse.Result availableMemoryInfo = availableMemoryResponse.getData().getResult().get(0); +// if(CollUtil.isNotEmpty(availableMemoryInfo.getValue())) { +// Double availableMemory = BigDecimal.valueOf(availableMemoryInfo.getValue().get(1)/1024/1024/1024).setScale(2, RoundingMode.HALF_UP).doubleValue(); +// result.put("availableMemory",availableMemory); +// } +// } //使用率 String usageRateQuery = "(1 - (node_memory_MemAvailable_bytes{instance=\""+instance+"\"} / node_memory_MemTotal_bytes{instance=\""+instance+"\"})) * 100"; PrometheusResponse usageRateResponse = webClient.get() @@ -161,7 +203,7 @@ public class HostMonitorServiceImpl implements HostMonitorService { if(CollUtil.isNotEmpty(usageRateInfo.getValue())) { Date date = new Date(usageRateInfo.getValue().get(0).longValue()*1000); Double usageRate = BigDecimal.valueOf(usageRateInfo.getValue().get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); - result.put("date", DateUtil.format(date, "yyyy-MM-dd HH:mm:ss")); + result.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); result.put("usageRate", usageRate); } } @@ -171,6 +213,85 @@ public class HostMonitorServiceImpl implements HostMonitorService { return result; } + /** + * 获取内存信息列表 + * + * @param conditions + */ + @Override + public List> getMemoryInfoList(String conditions) { + List> result = new ArrayList<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getInstance(); + //使用率 + String usageRateQuery = "(1 - (node_memory_MemAvailable_bytes{instance=\""+instance+"\"} / node_memory_MemTotal_bytes{instance=\""+instance+"\"})) * 100"; + PrometheusQueryTypeEnum queryTypeEnum = PrometheusQueryTypeEnum.getQueryTypeEnum(conditions); + long end = Instant.now().getEpochSecond(); + long start = end - queryTypeEnum.getLastSecond(); + String step = queryTypeEnum.getStep(); + PrometheusResponse response = webClient.get() + .uri(buildUri(url,usageRateQuery,start,end,step)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(response) && + Objects.nonNull(response.getData()) && + CollUtil.isNotEmpty(response.getData().getResult()) + ) { + PrometheusResponse.Result usageRateList = response.getData().getResult().get(0); + if(CollUtil.isNotEmpty(usageRateList.getValues())) { + List> pointDatas = usageRateList.getValues(); + for(List pointData : pointDatas) { + Map pointDataMap = new HashMap<>(); + Date date = new Date(pointData.get(0).longValue()*1000); + Double useRate = BigDecimal.valueOf(pointData.get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + pointDataMap.put("date", DateUtil.format(date, "MM/dd HH:mm:ss")); + pointDataMap.put("usageRate", useRate); + result.add(pointDataMap); + } + } + } + }catch (Exception e){ + log.error("获取CPU信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; + } + + /** + * 获取总内存 + * + * @return + */ + @Override + public Map getTotleMemoryInfo() { + Map result = new HashMap<>(); + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getInstance(); + //查询总内存 + String totalMemoryQuery = "node_memory_MemTotal_bytes{instance=\"" + instance + "\"}"; + PrometheusResponse totalMemoryResponse = webClient.get() + .uri(buildUri(url,totalMemoryQuery)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(totalMemoryResponse) && + Objects.nonNull(totalMemoryResponse.getData()) && + CollUtil.isNotEmpty(totalMemoryResponse.getData().getResult()) + ) { + PrometheusResponse.Result totalMemoryInfo = totalMemoryResponse.getData().getResult().get(0); + if(CollUtil.isNotEmpty(totalMemoryInfo.getValue())) { + Double totalMemory = BigDecimal.valueOf(totalMemoryInfo.getValue().get(1)/1024/1024/1024).setScale(2, RoundingMode.HALF_UP).doubleValue(); + result.put("totalMemory",totalMemory); + } + } + return result; + } + /** * 获取网络信息 */ @@ -183,7 +304,7 @@ public class HostMonitorServiceImpl implements HostMonitorService { //目标主机实例(node-exporter 的地址) String instance = serverProperties.getInstance(); //接收带宽 (Kbps) - String receiveKbpsQuery = "rate(node_network_receive_bytes_total{instance=\"" + instance + "\", device=\"ens32\"}[1m]) * 8 / 1000"; + String receiveKbpsQuery = "rate(node_network_receive_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}[15s]) * 8 / 1000"; PrometheusResponse receiveKbpsResponse = webClient.get() .uri(buildUri(url,receiveKbpsQuery)) .retrieve() @@ -197,13 +318,13 @@ public class HostMonitorServiceImpl implements HostMonitorService { if(CollUtil.isNotEmpty(receiveKbpsInfo.getValue())) { Date date = new Date(receiveKbpsInfo.getValue().get(0).longValue()*1000); Double receiveKbps = BigDecimal.valueOf(receiveKbpsInfo.getValue().get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); - result.put("receiveDate", DateUtil.format(date, "yyyy-MM-dd HH:mm:ss")); + result.put("receiveDate", DateUtil.format(date, "MM/dd HH:mm:ss")); result.put("receiveKbps", receiveKbps); } } //发送带宽 (Kbps) - String transmitKbpsQuery = "rate(node_network_transmit_bytes_total{instance=\"" + instance + "\", device=\"ens32\"}[1m]) * 8 / 1000"; + String transmitKbpsQuery = "rate(node_network_transmit_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}[15s]) * 8 / 1000"; PrometheusResponse transmitKbpsResponse = webClient.get() .uri(buildUri(url,transmitKbpsQuery)) .retrieve() @@ -217,7 +338,7 @@ public class HostMonitorServiceImpl implements HostMonitorService { if(CollUtil.isNotEmpty(transmitKbpsInfo.getValue())) { Date date = new Date(transmitKbpsInfo.getValue().get(0).longValue()*1000); Double transmitKbps = BigDecimal.valueOf(transmitKbpsInfo.getValue().get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); - result.put("transmitDate", DateUtil.format(date, "yyyy-MM-dd HH:mm:ss")); + result.put("transmitDate", DateUtil.format(date, "MM/dd HH:mm:ss")); result.put("transmitKbps", transmitKbps); } } @@ -227,6 +348,83 @@ public class HostMonitorServiceImpl implements HostMonitorService { return result; } + /** + * 获取网络信息列表 + * + * @return + */ + @Override + public Map>> getNetworkInfoList(String conditions) { + Map>> result = new HashMap<>(); + try { + //Prometheus 服务器地址 + String url = serverProperties.getServerUrl(); + //目标主机实例(node-exporter 的地址) + String instance = serverProperties.getInstance(); + //构建查询参数 + PrometheusQueryTypeEnum queryTypeEnum = PrometheusQueryTypeEnum.getQueryTypeEnum(conditions); + long end = Instant.now().getEpochSecond(); + long start = end - queryTypeEnum.getLastSecond(); + String step = queryTypeEnum.getStep(); + //接收带宽 (Kbps) + String receiveKbpsQuery = "rate(node_network_receive_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}[15s]) * 8 / 1000"; + PrometheusResponse receiveKbpsResponse = webClient.get() + .uri(buildUri(url,receiveKbpsQuery,start,end,step)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(receiveKbpsResponse) && + Objects.nonNull(receiveKbpsResponse.getData()) && + CollUtil.isNotEmpty(receiveKbpsResponse.getData().getResult()) + ) { + PrometheusResponse.Result receiveKbpsInfo = receiveKbpsResponse.getData().getResult().get(0); + if(CollUtil.isNotEmpty(receiveKbpsInfo.getValues())) { + List> receiveDataList = new ArrayList<>(); + List> pointDatas = receiveKbpsInfo.getValues(); + for(List pointData : pointDatas) { + Map pointDataMap = new HashMap<>(); + Date date = new Date(pointData.get(0).longValue()*1000); + Double useRate = BigDecimal.valueOf(pointData.get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + pointDataMap.put("receiveDate", DateUtil.format(date, "MM/dd HH:mm:ss")); + pointDataMap.put("receiveKbps", useRate); + receiveDataList.add(pointDataMap); + } + result.put("receiveData", receiveDataList); + } + } + + //发送带宽 (Kbps) + String transmitKbpsQuery = "rate(node_network_transmit_bytes_total{instance=\"" + instance + "\", device=\""+serverProperties.getNetworkCardName()+"\"}[15s]) * 8 / 1000"; + PrometheusResponse transmitKbpsResponse = webClient.get() + .uri(buildUri(url,transmitKbpsQuery,start,end,step)) + .retrieve() + .bodyToMono(PrometheusResponse.class) + .block(); + if(Objects.nonNull(transmitKbpsResponse) && + Objects.nonNull(transmitKbpsResponse.getData()) && + CollUtil.isNotEmpty(transmitKbpsResponse.getData().getResult()) + ) { + PrometheusResponse.Result transmitKbpsInfo = transmitKbpsResponse.getData().getResult().get(0); + if(CollUtil.isNotEmpty(transmitKbpsInfo.getValues())) { + List> transmitDataList = new ArrayList<>(); + List> pointDatas = transmitKbpsInfo.getValues(); + for(List pointData : pointDatas) { + Map pointDataMap = new HashMap<>(); + Date date = new Date(pointData.get(0).longValue()*1000); + Double useRate = BigDecimal.valueOf(pointData.get(1)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + pointDataMap.put("receiveDate", DateUtil.format(date, "MM/dd HH:mm:ss")); + pointDataMap.put("receiveKbps", useRate); + transmitDataList.add(pointDataMap); + } + result.put("transmitData", transmitDataList); + } + } + }catch (Exception e){ + log.error("获取网络信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage()); + } + return result; + } + /** * 获取磁盘使用率 */ @@ -261,18 +459,6 @@ public class HostMonitorServiceImpl implements HostMonitorService { return result; } - /** - * 获取磁盘吞吐量 - * - * @return - */ - @Override - public Map getDiskThroughputInfo() { - //Expr: irate(node_disk_read_bytes_total{instance="192.168.186.143:9100",job="Prometheus服务器",device=~"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+"}[1m0s]) - //irate(node_disk_written_bytes_total{instance="192.168.186.143:9100",job="Prometheus服务器",device=~"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+"}[1m0s]) - return Map.of(); - } - /** * 构建URI * @param url @@ -287,6 +473,28 @@ public class HostMonitorServiceImpl implements HostMonitorService { return uri; } + /** + * 构建URI + * @param url + * @param query + * @return + */ + private URI buildUri(String url,String query,Long start,Long end,String step){ + String uriAddr = String.format( + "%s/api/v1/query_range?query=%s&start=%d&end=%d&step=%s", + url, + query, + start, + end, + step + ); + URI uri = UriComponentsBuilder.fromHttpUrl(uriAddr) + .build() + .toUri(); + return uri; + } + + //&start=%d&end=%d&step=%s public static void main(String[] args) { Date date = new Date(1758868629*1000L); System.out.println(DateUtil.format(date, "yyyy-MM-dd HH:mm:ss")); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/vo/PrometheusResponse.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/vo/PrometheusResponse.java index f864e84..971cc08 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/vo/PrometheusResponse.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/vo/PrometheusResponse.java @@ -40,6 +40,7 @@ public class PrometheusResponse { public static class Result { private Metric metric; private List value; // 单值查询 + private List> values; // 范围查询 public Metric getMetric() { return metric; @@ -57,11 +58,20 @@ public class PrometheusResponse { this.value = value; } + public List> getValues() { + return values; + } + + public void setValues(List> values) { + this.values = values; + } + @Override public String toString() { return "Result{" + "metric=" + metric + ", value=" + value + + ", values=" + values + '}'; } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml index 3f22e8c..e05f39a 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml @@ -30,8 +30,10 @@