feat(运维监控模块): 新增获取Node状态接口

1. 创建 [K8sNodeStatus] 实例并设置节点IP。
2. 构造PromQL查询语句,调用 Prometheus 接口获取节点CPU使用率:
   - 使用 [PromQLConstant.NODE_CPU_USAGE(nodeIp)] 生成查询语句。
   - 调用 `remoteGatewayService.getPrometheusQueryRes(...)` 发送请求。
   - 解析响应结果,若成功则提取CPU使用率数值并设置到对象中。
3. 同理,查询节点内存使用率并设置到对象中。
4. 返回封装好的 [K8sNodeStatus]对象。
This commit is contained in:
OTTO 2025-05-22 15:40:14 +08:00
parent 274af358dd
commit 213aee5587
6 changed files with 53 additions and 1 deletions

View File

@ -66,4 +66,10 @@ public class K8sDashboardController extends BaseController {
public GenericsAjaxResult<K8sPodContainerStatus> podContainerStatus(@PathVariable("containerID") String containerID) {
return GenericsAjaxResult.success(k8sNamespaceService.getPodContainerStatus(containerID));
}
@ApiOperation(value = "获取服务器节点状态")
@GetMapping("/cluster/nodeStatus/{nodeIp}")
public GenericsAjaxResult<K8sNodeStatus> nodeStatus(@PathVariable("nodeIp") String nodeIp) {
return GenericsAjaxResult.success(k8sNamespaceService.getNodeStatus(nodeIp));
}
}

View File

@ -0,0 +1,19 @@
package com.microservices.mon.k8s.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("K8S Node状态")
public class K8sNodeStatus {
@ApiModelProperty(value = "节点IP")
private String nodeIp;
@ApiModelProperty(value = "CPU使用率")
private Float cpuUsage;
@ApiModelProperty(value = "内存使用率")
private Float memoryUsage;
}

View File

@ -16,6 +16,6 @@ public class K8sPodContainerStatus {
@ApiModelProperty(value = "CPU使用率")
private Float cpuUsage;
@ApiModelProperty(value = "内存使用")
@ApiModelProperty(value = "内存使用情况")
private String memoryUsage;
}

View File

@ -19,4 +19,6 @@ public interface IK8sDashboardService {
List<ApplicationRequestCountData> getApplicationRequestCount();
K8sPodContainerStatus getPodContainerStatus(String containerID);
K8sNodeStatus getNodeStatus(String nodeIp);
}

View File

@ -218,6 +218,25 @@ public class K8SDashboardServiceImpl extends CommonService implements IK8sDashbo
return k8sPodContainerStatus;
}
@Override
public K8sNodeStatus getNodeStatus(String nodeIp) {
K8sNodeStatus k8sNodeStatus = new K8sNodeStatus();
k8sNodeStatus.setNodeIp(nodeIp);
JSONObject cpuUsageJson = remoteGatewayService.getPrometheusQueryRes(PromQLConstant.NODE_CPU_USAGE(nodeIp), SecurityContextHolder.getUserKey());
PrometheusResVo cpuPrometheusResVo = cpuUsageJson.toJavaObject(PrometheusResVo.class);
if (cpuPrometheusResVo != null && cpuPrometheusResVo.isSuccess()) {
PrometheusResultVo result = cpuPrometheusResVo.getData().getResult().get(0);
k8sNodeStatus.setCpuUsage(result.getValue().getFloatValue(1));
}
JSONObject memoryUsageJson = remoteGatewayService.getPrometheusQueryRes(PromQLConstant.NODE_MEMORY_USAGE(nodeIp), SecurityContextHolder.getUserKey());
PrometheusResVo memoryPrometheusResVo = memoryUsageJson.toJavaObject(PrometheusResVo.class);
if (memoryPrometheusResVo != null && memoryPrometheusResVo.isSuccess()) {
PrometheusResultVo result = memoryPrometheusResVo.getData().getResult().get(0);
k8sNodeStatus.setMemoryUsage(result.getValue().getFloatValue(1));
}
return k8sNodeStatus;
}
private List<K8sNamespace> getK8sNamespaceList() {
List<K8sNamespace> k8sNamespaceList = new ArrayList<>();
List<RancherNamespaceVo> rancherNamespaceVoList;

View File

@ -47,4 +47,10 @@ public class PromQLConstant {
public static String POD_MEMORY_USAGE(String containerId) {
return String.format("sum without (dc,from,id) (container_memory_usage_bytes{container_label_io_kubernetes_sandbox_id=\"%s\"} - container_memory_cache{container_label_io_kubernetes_sandbox_id=\"%s\"})", containerId, containerId);
}
public static String NODE_CPU_USAGE(String nodeIp) {
return String.format("(sum by(instance) (irate(node_cpu_seconds_total{ip=\"%s\",mode!=\"idle\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{ip=\"%s\"}[1m])))) * 100", nodeIp, nodeIp);
}
public static String NODE_MEMORY_USAGE(String nodeIp) {
return String.format("100 - ((node_memory_MemAvailable_bytes{ip=\"%s\"} * 100) / node_memory_MemTotal_bytes{ip=\"%s\"})", nodeIp, nodeIp);
}
}