diff --git a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteRancherService.java b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteRancherService.java index 4554648ad..59219eadb 100644 --- a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteRancherService.java +++ b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/RemoteRancherService.java @@ -54,6 +54,10 @@ public interface RemoteRancherService { @PathVariable("namespace") String namespace, @RequestHeader(TokenConstants.AUTHENTICATION) String token); + @GetMapping("/rancher/k8s/clusters/{cluster_id}/v1/pods") + Response getK8sPodList(@PathVariable("cluster_id") String cluster_id, + @RequestHeader(TokenConstants.AUTHENTICATION) String token); + @GetMapping("/rancher/k8s/clusters/{cluster_id}/v1/services/{nginxApplicationId}") Response getK8sServiceByApplicationId(@PathVariable("cluster_id") String cluster_id, @PathVariable("nginxApplicationId") String nginxApplicationId, diff --git a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteRancherFallbackFactory.java b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteRancherFallbackFactory.java index 3c07de54c..8cdbcb8ba 100644 --- a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteRancherFallbackFactory.java +++ b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/factory/RemoteRancherFallbackFactory.java @@ -64,6 +64,11 @@ public class RemoteRancherFallbackFactory implements FallbackFactory getPodStartStopStatus() { + return GenericsAjaxResult.success(microStatusService.getPodStartStopStatus()); + } +} diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sClusterStatus.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sClusterStatus.java index 581a1a11a..321eb1111 100644 --- a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sClusterStatus.java +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sClusterStatus.java @@ -49,35 +49,35 @@ public class K8sClusterStatus { private HashMap podStatus; public void setNodeCount(PrometheusResVo prometheusResVo) { - this.nodeCount = Integer.parseInt(getPromStringValue(prometheusResVo)); + this.nodeCount = Integer.parseInt(PrometheusResVo.getPromStringValue(prometheusResVo)); } public void setUnavailableNodeCount(PrometheusResVo prometheusResVo) { - this.unavailableNodeCount = Integer.parseInt(getPromStringValue(prometheusResVo)); + this.unavailableNodeCount = Integer.parseInt(PrometheusResVo.getPromStringValue(prometheusResVo)); } public void setCpuUsage(PrometheusResVo prometheusResVo) { - this.cpuUsage = Float.parseFloat(getPromStringValue(prometheusResVo)); + this.cpuUsage = Float.parseFloat(PrometheusResVo.getPromStringValue(prometheusResVo)); } public void setPodUsage(PrometheusResVo prometheusResVo) { - this.podUsage = Float.parseFloat(getPromStringValue(prometheusResVo)); + this.podUsage = Float.parseFloat(PrometheusResVo.getPromStringValue(prometheusResVo)); } public void setMemoryUsage(PrometheusResVo prometheusResVo) { - this.memoryUsage = Float.parseFloat(getPromStringValue(prometheusResVo)); + this.memoryUsage = Float.parseFloat(PrometheusResVo.getPromStringValue(prometheusResVo)); } public void setTotalRequestCountToday(PrometheusResVo prometheusResVo) { - this.totalRequestCountToday = Long.parseLong(getPromStringValue(prometheusResVo)); + this.totalRequestCountToday = Long.parseLong(PrometheusResVo.getPromStringValue(prometheusResVo)); } public void setAverageRequestProcessingTimeToday(PrometheusResVo prometheusResVo) { - this.averageRequestProcessingTimeToday = Float.parseFloat(getPromStringValue(prometheusResVo)); + this.averageRequestProcessingTimeToday = Float.parseFloat(PrometheusResVo.getPromStringValue(prometheusResVo)); } public void setRequestSuccessRateToday(PrometheusResVo prometheusResVo) { - this.requestSuccessRateToday = Float.parseFloat(getPromStringValue(prometheusResVo)); + this.requestSuccessRateToday = Float.parseFloat(PrometheusResVo.getPromStringValue(prometheusResVo)); } public void setMicroserviceApplicationCount(List k8sNamespaceList) { @@ -85,43 +85,32 @@ public class K8sClusterStatus { } public void setMicroserviceRestartCountToday(PrometheusResVo prometheusResVo) { - this.microserviceRestartCountToday = (int) Float.parseFloat(getPromStringValue(prometheusResVo)); + this.microserviceRestartCountToday = (int) Float.parseFloat(PrometheusResVo.getPromStringValue(prometheusResVo)); } public void setPodStatus(PrometheusResVo prometheusResVo) { HashMap podStatus = new HashMap<>(); - if (prometheusResVo != null && prometheusResVo.isSuccess()) { - List resultList = prometheusResVo.getData().getResult(); - for (PrometheusResultVo result : resultList) { - Integer value = result.getValue().getIntValue(1); - switch (result.getMetric().getString("phase")) { - case "Running": - podStatus.put("运行中", value); - break; - case "Pending": - podStatus.put("等待中", value); - break; - case "Succeeded": - podStatus.put("运行已完成", value); - break; - case "Unknown": - podStatus.put("未知", value); - break; - case "Failed": - podStatus.put("运行失败", value); - } + List resultList = PrometheusResVo.getPrometheusResultVoList(prometheusResVo); + for (PrometheusResultVo result : resultList) { + Integer value = result.getValue().getIntValue(1); + switch (result.getMetric().getString("phase")) { + case "Running": + podStatus.put("运行中", value); + break; + case "Pending": + podStatus.put("等待中", value); + break; + case "Succeeded": + podStatus.put("运行已完成", value); + break; + case "Unknown": + podStatus.put("未知", value); + break; + case "Failed": + podStatus.put("运行失败", value); } } this.podStatus = podStatus; } - private String getPromStringValue(PrometheusResVo prometheusResVo) { - String value = ""; - if (prometheusResVo != null && prometheusResVo.isSuccess()) { - PrometheusResultVo result = prometheusResVo.getData().getResult().get(0); - return result.getValue().getString(1); - } - return value; - } - } diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sPodStartStopDate.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sPodStartStopDate.java new file mode 100644 index 000000000..e6c9ef907 --- /dev/null +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sPodStartStopDate.java @@ -0,0 +1,26 @@ +package com.microservices.mon.k8s.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + + +@Data +@ApiModel("K8S容器启停时间") +public class K8sPodStartStopDate { + @ApiModelProperty(value = "容器名称") + private String podName; + + @ApiModelProperty(value = "启动时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startDate; + + @ApiModelProperty(value = "停止时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date stopDate; + + private Boolean isRunning = true; +} diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sPodStartStopStatus.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sPodStartStopStatus.java new file mode 100644 index 000000000..ea215c93d --- /dev/null +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/K8sPodStartStopStatus.java @@ -0,0 +1,21 @@ +package com.microservices.mon.k8s.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + + +@Data +@ApiModel("K8S容器启停状态") +public class K8sPodStartStopStatus { + @ApiModelProperty(value = "启动数") + private Integer startCount; + + @ApiModelProperty(value = "总数") + private Integer podCount; + + @ApiModelProperty(value = "启停时间列表") + private List podStartStopDateList; +} diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/PrometheusResVo.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/PrometheusResVo.java index 3362f6ff5..6972b6098 100644 --- a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/PrometheusResVo.java +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/domain/vo/PrometheusResVo.java @@ -2,6 +2,10 @@ package com.microservices.mon.k8s.domain.vo; import lombok.Data; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + @Data public class PrometheusResVo { // 状态(success代表成功) @@ -15,4 +19,20 @@ public class PrometheusResVo { && data.getResult() != null && !data.getResult().isEmpty(); } + + public static String getPromStringValue(PrometheusResVo prometheusResVo) { + String value = ""; + if (prometheusResVo != null && prometheusResVo.isSuccess()) { + PrometheusResultVo result = prometheusResVo.getData().getResult().get(0); + return result.getValue().getString(1); + } + return value; + } + + public static List getPrometheusResultVoList(PrometheusResVo prometheusResVo) { + if (prometheusResVo != null && prometheusResVo.isSuccess()) { + return prometheusResVo.getData().getResult(); + } + return Collections.emptyList(); + } } diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/IMicroStatusService.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/IMicroStatusService.java new file mode 100644 index 000000000..61f9ed1cb --- /dev/null +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/IMicroStatusService.java @@ -0,0 +1,12 @@ +package com.microservices.mon.k8s.service; + +import com.alibaba.fastjson2.JSONObject; +import com.microservices.mon.k8s.domain.*; +import com.microservices.mon.k8s.domain.vo.ApplicationEnvTypeVo; +import com.microservices.mon.k8s.domain.vo.ApplicationTypeVo; + +import java.util.List; + +public interface IMicroStatusService { + K8sPodStartStopStatus getPodStartStopStatus(); +} diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/MicroStatusServiceImpl.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/MicroStatusServiceImpl.java new file mode 100644 index 000000000..de368fd90 --- /dev/null +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/service/impl/MicroStatusServiceImpl.java @@ -0,0 +1,93 @@ +package com.microservices.mon.k8s.service.impl; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.microservices.common.core.context.SecurityContextHolder; +import com.microservices.mon.k8s.domain.K8sNamespace; +import com.microservices.mon.k8s.domain.K8sPodStartStopDate; +import com.microservices.mon.k8s.domain.K8sPodStartStopStatus; +import com.microservices.mon.k8s.domain.MetricCommonData; +import com.microservices.mon.k8s.domain.vo.*; +import com.microservices.mon.k8s.service.IK8sDashboardService; +import com.microservices.mon.k8s.service.IMicroStatusService; +import com.microservices.mon.k8s.utils.PromQLConstant; +import com.microservices.mon.k8s.utils.RancherResponseHandler; +import com.microservices.system.api.RemoteGatewayService; +import com.microservices.system.api.RemoteRancherService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class MicroStatusServiceImpl extends CommonService implements IMicroStatusService { + @Autowired + private RemoteGatewayService remoteGatewayService; + @Autowired + private IK8sDashboardService k8sDashboardService; + @Autowired + private RemoteRancherService remoteRancherService; + + @Override + public K8sPodStartStopStatus getPodStartStopStatus() { + List k8sNamespaceList = k8sDashboardService.getNamespaceDetailList(false); + List namespaceNameList = k8sNamespaceList.stream().map(K8sNamespace::getName).collect(Collectors.toList()); + K8sPodStartStopStatus k8sPodStartStopStatus = new K8sPodStartStopStatus(); + JSONObject POD_START_COUNT = remoteGatewayService.getPrometheusQueryRes(PromQLConstant.POD_START_COUNT(cluster_id, namespaceNameList), SecurityContextHolder.getUserKey()); + PrometheusResVo prometheusResVo = POD_START_COUNT.toJavaObject(PrometheusResVo.class); + k8sPodStartStopStatus.setStartCount(Integer.parseInt(PrometheusResVo.getPromStringValue(prometheusResVo))); + + JSONObject POD_STOP_COUNT = remoteGatewayService.getPrometheusQueryRes(PromQLConstant.POD_COUNT(cluster_id, namespaceNameList), SecurityContextHolder.getUserKey()); + prometheusResVo = POD_STOP_COUNT.toJavaObject(PrometheusResVo.class); + k8sPodStartStopStatus.setPodCount(Integer.parseInt(PrometheusResVo.getPromStringValue(prometheusResVo))); + + JSONObject POD_START_DATE = remoteGatewayService.getPrometheusQueryRes(PromQLConstant.POD_START_DATE(cluster_id, namespaceNameList), SecurityContextHolder.getUserKey()); + prometheusResVo = POD_START_DATE.toJavaObject(PrometheusResVo.class); + List podStartDateList = PrometheusResVo.getPrometheusResultVoList(prometheusResVo); + List podStartStopDateList = new ArrayList<>(); + for (PrometheusResultVo result : podStartDateList) { + K8sPodStartStopDate podStartStopDate = new K8sPodStartStopDate(); + String podName = result.getMetric().getString("pod"); + podStartStopDate.setPodName(podName); + Long startTimeStamp = result.getValue().getLong(1); + podStartStopDate.setStartDate(new Date(startTimeStamp * 1000)); + podStartStopDateList.add(podStartStopDate); + } + + JSONObject podListJson = RancherResponseHandler.handleJsonObject(remoteRancherService.getK8sPodList(cluster_id, SecurityContextHolder.getUserKey()), "获取所有容器列表"); + if (podListJson != null && podListJson.containsKey("data")) { + List rancherPodVoList = podListJson.getJSONArray("data").toList(RancherPodVo.class); + for (RancherPodVo rancherPodVo : rancherPodVoList) { + if (rancherPodVo.getMetadata() != null && rancherPodVo.getMetadata().getState() != null && rancherPodVo.getStatus() != null) { + RancherMetadataState status = rancherPodVo.getMetadata().getState(); + if (!"running".equalsIgnoreCase(status.getName())) { + JSONArray conditionList = rancherPodVo.getStatus().getConditions(); + for (int i = 0; i < conditionList.size(); i++) { + JSONObject condition = conditionList.getJSONObject(i); + if (condition != null && condition.containsKey("status") && !condition.getBoolean("status")) { + Date stopDate = condition.getDate("lastTransitionTime"); + podStartStopDateList + .stream() + .filter(x -> x.getPodName().equalsIgnoreCase(rancherPodVo.getMetadata().getName())) + .forEach(x -> { + x.setStopDate(stopDate); + x.setIsRunning(false); + }); + } + } + } + } + } + } + podStartStopDateList.sort(Comparator.comparing(K8sPodStartStopDate::getIsRunning)); + k8sPodStartStopStatus.setPodStartStopDateList(podStartStopDateList); + return k8sPodStartStopStatus; + } +} diff --git a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/utils/PromQLConstant.java b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/utils/PromQLConstant.java index 3d74b2ec5..94f2dc636 100644 --- a/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/utils/PromQLConstant.java +++ b/microservices-modules/microservices-modules-mon/src/main/java/com/microservices/mon/k8s/utils/PromQLConstant.java @@ -92,4 +92,19 @@ public class PromQLConstant { 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); } + + // Pod启动数 + public static String POD_START_COUNT(String clusterId, List namespaceNameList) { + return String.format("sum(kube_pod_status_phase{phase=\"Running\",cluster=\"%s\",namespace=~\"%s\"})", clusterId, String.join("|", namespaceNameList)); + } + + // Pod总数 + public static String POD_COUNT(String clusterId, List namespaceNameList) { + return String.format("sum(kube_pod_status_phase{cluster=\"%s\",namespace=~\"%s\"})", clusterId, String.join("|", namespaceNameList)); + } + + // Pod启动时间 + public static String POD_START_DATE(String clusterId, List namespaceNameList) { + return String.format("kube_pod_created{cluster=\"%s\",namespace=~\"%s\"}", clusterId, String.join("|", namespaceNameList)); + } }