1.修改系统管理系统监控功能添加各个接口范围查询功能
This commit is contained in:
parent
67cad8b525
commit
fd102a9518
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -18,4 +18,9 @@ public class PrometheusServerProperties {
|
|||
* node-exporter实例地址
|
||||
*/
|
||||
private String instance;
|
||||
|
||||
/**
|
||||
* 监测的网卡名称
|
||||
*/
|
||||
private String networkCardName;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ public class SourceRebuildTask implements Serializable {
|
|||
private Integer sourceStrength;
|
||||
|
||||
/**
|
||||
* 耗时
|
||||
* 耗时(分钟)
|
||||
*/
|
||||
@Null(message = "耗时必须为空",groups = {InsertGroup.class, UpdateGroup.class})
|
||||
@TableField(value = "time_consuming")
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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<String,Object> getCpuInfo();
|
||||
|
||||
/**
|
||||
* 获取CPU信息列表
|
||||
*/
|
||||
List<Map<String,Object>> getCpuInfoList(String conditions);
|
||||
|
||||
/**
|
||||
* 获取CPU核心数
|
||||
*/
|
||||
|
|
@ -20,19 +26,30 @@ public interface HostMonitorService {
|
|||
*/
|
||||
Map<String,Object> getMemoryInfo();
|
||||
|
||||
/**
|
||||
* 获取内存信息列表
|
||||
*/
|
||||
List<Map<String,Object>> getMemoryInfoList(String conditions);
|
||||
|
||||
/**
|
||||
* 获取总内存
|
||||
* @return
|
||||
*/
|
||||
Map<String, Object> getTotleMemoryInfo();
|
||||
|
||||
/**
|
||||
* 获取网络信息
|
||||
*/
|
||||
Map<String,Object> getNetworkInfo();
|
||||
|
||||
/**
|
||||
* 获取网络信息列表
|
||||
* @return
|
||||
*/
|
||||
Map<String,List<Map<String,Object>>> getNetworkInfoList(String conditions);
|
||||
|
||||
/**
|
||||
* 获取磁盘使用率
|
||||
*/
|
||||
Map<String,Object> getDiskInfo();
|
||||
|
||||
/**
|
||||
* 获取磁盘吞吐量
|
||||
* @return
|
||||
*/
|
||||
Map<String,Object> getDiskThroughputInfo();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<Map<String, Object>> getCpuInfoList(String conditions) {
|
||||
List<Map<String, Object>> 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<List<Double>> pointDatas = cpuInfoList.getValues();
|
||||
for(List<Double> pointData : pointDatas) {
|
||||
Map<String,Object> 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,6 +155,124 @@ 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 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()
|
||||
.uri(buildUri(url,usageRateQuery))
|
||||
.retrieve()
|
||||
.bodyToMono(PrometheusResponse.class)
|
||||
.block();
|
||||
if(Objects.nonNull(usageRateResponse) &&
|
||||
Objects.nonNull(usageRateResponse.getData()) &&
|
||||
CollUtil.isNotEmpty(usageRateResponse.getData().getResult())
|
||||
) {
|
||||
PrometheusResponse.Result usageRateInfo = usageRateResponse.getData().getResult().get(0);
|
||||
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, "MM/dd HH:mm:ss"));
|
||||
result.put("usageRate", usageRate);
|
||||
}
|
||||
}
|
||||
}catch (Exception e){
|
||||
log.error("获取内存信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取内存信息列表
|
||||
*
|
||||
* @param conditions
|
||||
*/
|
||||
@Override
|
||||
public List<Map<String,Object>> getMemoryInfoList(String conditions) {
|
||||
List<Map<String, Object>> 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<List<Double>> pointDatas = usageRateList.getValues();
|
||||
for(List<Double> pointData : pointDatas) {
|
||||
Map<String,Object> 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<String, Object> getTotleMemoryInfo() {
|
||||
Map<String, Object> 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))
|
||||
|
|
@ -129,45 +289,6 @@ public class HostMonitorServiceImpl implements HostMonitorService {
|
|||
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 usageRateQuery = "(1 - (node_memory_MemAvailable_bytes{instance=\""+instance+"\"} / node_memory_MemTotal_bytes{instance=\""+instance+"\"})) * 100";
|
||||
PrometheusResponse usageRateResponse = webClient.get()
|
||||
.uri(buildUri(url,usageRateQuery))
|
||||
.retrieve()
|
||||
.bodyToMono(PrometheusResponse.class)
|
||||
.block();
|
||||
if(Objects.nonNull(usageRateResponse) &&
|
||||
Objects.nonNull(usageRateResponse.getData()) &&
|
||||
CollUtil.isNotEmpty(usageRateResponse.getData().getResult())
|
||||
) {
|
||||
PrometheusResponse.Result usageRateInfo = usageRateResponse.getData().getResult().get(0);
|
||||
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("usageRate", usageRate);
|
||||
}
|
||||
}
|
||||
}catch (Exception e){
|
||||
log.error("获取内存信息错误,请检查Prometheus服务是否正常启动或Java请求参数是否正确,详细堆栈错误为:{}",e.getMessage());
|
||||
}
|
||||
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<String, List<Map<String, Object>>> getNetworkInfoList(String conditions) {
|
||||
Map<String,List<Map<String, Object>>> 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<Map<String, Object>> receiveDataList = new ArrayList<>();
|
||||
List<List<Double>> pointDatas = receiveKbpsInfo.getValues();
|
||||
for(List<Double> pointData : pointDatas) {
|
||||
Map<String,Object> 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<Map<String, Object>> transmitDataList = new ArrayList<>();
|
||||
List<List<Double>> pointDatas = transmitKbpsInfo.getValues();
|
||||
for(List<Double> pointData : pointDatas) {
|
||||
Map<String,Object> 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<String, Object> 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"));
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ public class PrometheusResponse {
|
|||
public static class Result {
|
||||
private Metric metric;
|
||||
private List<Double> value; // 单值查询
|
||||
private List<List<Double>> values; // 范围查询
|
||||
|
||||
public Metric getMetric() {
|
||||
return metric;
|
||||
|
|
@ -57,11 +58,20 @@ public class PrometheusResponse {
|
|||
this.value = value;
|
||||
}
|
||||
|
||||
public List<List<Double>> getValues() {
|
||||
return values;
|
||||
}
|
||||
|
||||
public void setValues(List<List<Double>> values) {
|
||||
this.values = values;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Result{" +
|
||||
"metric=" + metric +
|
||||
", value=" + value +
|
||||
", values=" + values +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,8 +30,10 @@
|
|||
|
||||
<select id="queryByUserId" parameterType="String">
|
||||
select sp.perms from sys_permission sp
|
||||
<if test="userId != null and userId != ''">
|
||||
inner join sys_role_permission srp on sp.id = srp.permission_id
|
||||
inner join sys_user_role sur on srp.role_id = sur.role_id
|
||||
</if>
|
||||
where sp.perms is not null
|
||||
<if test="userId != null and userId != ''">
|
||||
and sur.user_id = #{userId}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user