Selaa lähdekoodia

test: fortest

wanghongkai 5 vuotta sitten
vanhempi
commit
328052380c

+ 2 - 3
src/main/java/cn/seecoder/paas/data/entity/Metrics.java

@@ -1,11 +1,10 @@
 package cn.seecoder.paas.data.entity;
 
-import cn.seecoder.paas.util.enums.ConfigBelongsToType;
 import cn.seecoder.paas.util.enums.MetricsSource;
+import cn.seecoder.paas.util.enums.MetricsType;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import org.springframework.jmx.support.MetricType;
 
 import javax.persistence.*;
 import java.time.LocalDateTime;
@@ -43,7 +42,7 @@ public class Metrics {
     @Basic
     @Enumerated
     @Column(name = "metrics_type")
-    private MetricType metricsType;
+    private MetricsType metricsType;
 
     /**
      * 度量类型值

+ 6 - 0
src/main/java/cn/seecoder/paas/service/MetricsService.java

@@ -3,6 +3,8 @@ package cn.seecoder.paas.service;
 import cn.seecoder.paas.service.model.vo.MetricsVO;
 import cn.seecoder.paas.util.enums.MetricsSource;
 import cn.seecoder.paas.util.enums.MetricsType;
+import io.fabric8.kubernetes.api.model.metrics.v1beta1.NodeMetrics;
+import io.fabric8.kubernetes.api.model.metrics.v1beta1.PodMetrics;
 
 import java.time.LocalDateTime;
 import java.util.List;
@@ -12,4 +14,8 @@ public interface MetricsService {
     List<MetricsVO> getMetricsBySourceAndTypeBetween(MetricsSource metricsSource, String metricsSourceValue, MetricsType metricsType, LocalDateTime startTime, LocalDateTime endTime);
 
     List<MetricsVO> getMetricsSourceCurrentStatus(MetricsSource metricsSource, String metricsSourceValue);
+
+    List<MetricsVO> statNodeMetrics(List<NodeMetrics> nodeMetricsList, MetricsSource metricsSource, String metricsSourceValue);
+
+    List<MetricsVO> statPodMetrics(List<PodMetrics> podMetricsList, MetricsSource metricsSource, String metricsSourceValue);
 }

+ 6 - 2
src/main/java/cn/seecoder/paas/service/model/converter/MetricsConverter.java

@@ -2,19 +2,23 @@ package cn.seecoder.paas.service.model.converter;
 
 import cn.seecoder.paas.data.entity.Metrics;
 import cn.seecoder.paas.service.model.vo.MetricsVO;
+import cn.seecoder.paas.util.enums.MetricsType;
 import org.springframework.beans.BeanUtils;
 
 public class MetricsConverter {
 
     public static MetricsVO convertToVO(Metrics metrics) {
         MetricsVO vo = new MetricsVO();
-        BeanUtils.copyProperties(metrics, vo);
+        BeanUtils.copyProperties(metrics, vo, "metricsType");
+        vo.setMetricsType(metrics.getMetricsType().toString());
         return vo;
     }
 
     public static Metrics convertToEntity(MetricsVO vo) {
         Metrics metrics = new Metrics();
-        BeanUtils.copyProperties(vo, metrics);
+        BeanUtils.copyProperties(vo, metrics, "metricsType");
+        MetricsType type = MetricsType.getByCode(vo.getMetricsType());
+        metrics.setMetricsType(type);
         return metrics;
     }
 }

+ 114 - 0
src/main/java/cn/seecoder/paas/service/scheduler/MetricsScheduler.java

@@ -0,0 +1,114 @@
+package cn.seecoder.paas.service.scheduler;
+
+import cn.seecoder.paas.data.dao.ApplicationDAO;
+import cn.seecoder.paas.data.dao.EnvironmentDAO;
+import cn.seecoder.paas.data.dao.MetricsDAO;
+import cn.seecoder.paas.data.entity.Application;
+import cn.seecoder.paas.data.entity.Environment;
+import cn.seecoder.paas.service.MetricsService;
+import cn.seecoder.paas.service.facade.k8s.PodApi;
+import cn.seecoder.paas.service.facade.k8s.model.K8sObjectRequest;
+import cn.seecoder.paas.service.facade.k8s.model.Pod;
+import cn.seecoder.paas.service.model.converter.MetricsConverter;
+import cn.seecoder.paas.service.model.vo.MetricsVO;
+import cn.seecoder.paas.util.ApplicationProperties;
+import cn.seecoder.paas.util.enums.MetricsSource;
+import cn.seecoder.paas.util.enums.ResourceLabel;
+import io.fabric8.kubernetes.api.model.metrics.v1beta1.NodeMetricsList;
+import io.fabric8.kubernetes.api.model.metrics.v1beta1.PodMetrics;
+import io.fabric8.kubernetes.api.model.metrics.v1beta1.PodMetricsList;
+import io.fabric8.kubernetes.client.DefaultKubernetesClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class MetricsScheduler {
+
+    private final DefaultKubernetesClient fabricK8sClient;
+
+    private final ApplicationProperties applicationProperties;
+
+    private final EnvironmentDAO environmentDAO;
+
+    private final ApplicationDAO applicationDAO;
+
+    private final MetricsDAO metricsDAO;
+
+    private final MetricsService metricsService;
+
+    private final PodApi podApi;
+
+    @Autowired
+    public MetricsScheduler(DefaultKubernetesClient fabricK8sClient, ApplicationProperties applicationProperties, EnvironmentDAO environmentDAO, ApplicationDAO applicationDAO, MetricsDAO metricsDAO, MetricsService metricsService, PodApi podApi) {
+        this.fabricK8sClient = fabricK8sClient;
+        this.applicationProperties = applicationProperties;
+        this.environmentDAO = environmentDAO;
+        this.applicationDAO = applicationDAO;
+        this.metricsDAO = metricsDAO;
+        this.metricsService = metricsService;
+        this.podApi = podApi;
+    }
+
+    // 30秒采集一次
+    @Scheduled(cron = "30 * * * * ?")
+    public void statistic() {
+        String deploymentNamespace = applicationProperties.getDeploymentNamespace();
+        PodMetricsList podMetricsList = fabricK8sClient.top().pods().metrics(deploymentNamespace);
+        NodeMetricsList nodeMetricsList = fabricK8sClient.top().nodes().metrics();
+        // 集群
+        List<MetricsVO> metrics = metricsService.getMetricsSourceCurrentStatus(MetricsSource.CLUSTER, MetricsSource.CLUSTER.getCode());
+        metricsDAO.saveAll(metrics.stream().map(MetricsConverter::convertToEntity).collect(Collectors.toList()));
+        // 节点
+        nodeMetricsList.getItems().forEach(nodeMetrics -> {
+            List<MetricsVO> values = metricsService.statNodeMetrics(Collections.singletonList(nodeMetrics), MetricsSource.NODE, nodeMetrics.getMetadata().getName());
+            if (!values.isEmpty())
+                metricsDAO.saveAll(values.stream().map(MetricsConverter::convertToEntity).collect(Collectors.toList()));
+        });
+        // POD
+        podMetricsList.getItems().forEach(podMetrics -> {
+            List<MetricsVO> values = metricsService.statPodMetrics(Collections.singletonList(podMetrics), MetricsSource.POD, podMetrics.getMetadata().getName());
+            if (!values.isEmpty())
+                metricsDAO.saveAll(values.stream().map(MetricsConverter::convertToEntity).collect(Collectors.toList()));
+        });
+        // ENVIRONMENT
+        List<Environment> environments = environmentDAO.findAll();
+        environments.forEach(environment -> {
+            String labelKey = ResourceLabel.RESOURCE.getCode();
+            String labelValue = ResourceLabel.RESOURCE.getGenerator().gen("environment", String.valueOf(environment.getAppId()), String.valueOf(environment.getId()));
+            K8sObjectRequest request = K8sObjectRequest.builder().namespace(applicationProperties.getDeploymentNamespace()).labels(Collections.singletonMap(labelKey, labelValue)).build();
+            List<Pod> pods = podApi.getByCondition(request);
+            List<String> podNames = pods.stream().map(item -> item.getName()).collect(Collectors.toList());
+            if (!pods.isEmpty()) {
+                List<PodMetrics> podMetricsValues = podMetricsList.getItems().stream().filter(item -> podNames.contains(item.getMetadata().getName())).collect(Collectors.toList());
+                List<MetricsVO> values = metricsService.statPodMetrics(podMetricsValues, MetricsSource.ENVIRONMENT, String.valueOf(environment.getId()));
+                if (!values.isEmpty())
+                    metricsDAO.saveAll(values.stream().map(MetricsConverter::convertToEntity).collect(Collectors.toList()));
+            }
+        });
+        // APPLICATION
+        List<Application> applications = applicationDAO.findAll();
+        applications.forEach(application -> {
+            List<Environment> appEnvs = environmentDAO.findAllByAppId(application.getId());
+            List<Pod> pods = new ArrayList<>();
+            appEnvs.forEach(environment -> {
+                String labelKey = ResourceLabel.RESOURCE.getCode();
+                String labelValue = ResourceLabel.RESOURCE.getGenerator().gen("environment", String.valueOf(environment.getAppId()), String.valueOf(environment.getId()));
+                K8sObjectRequest request = K8sObjectRequest.builder().namespace(applicationProperties.getDeploymentNamespace()).labels(Collections.singletonMap(labelKey, labelValue)).build();
+                pods.addAll(podApi.getByCondition(request));
+            });
+            List<String> podNames = pods.stream().map(item -> item.getName()).collect(Collectors.toList());
+            if (!pods.isEmpty()) {
+                List<PodMetrics> podMetricsValues = podMetricsList.getItems().stream().filter(item -> podNames.contains(item.getMetadata().getName())).collect(Collectors.toList());
+                List<MetricsVO> values = metricsService.statPodMetrics(podMetricsValues, MetricsSource.APPLICATION, String.valueOf(application.getId()));
+                if (!values.isEmpty())
+                    metricsDAO.saveAll(values.stream().map(MetricsConverter::convertToEntity).collect(Collectors.toList()));
+            }
+        });
+    }
+}

+ 0 - 3
src/main/java/cn/seecoder/paas/util/K8sApiConfiguration.java

@@ -1,6 +1,5 @@
 package cn.seecoder.paas.util;
 
-import io.fabric8.kubernetes.api.model.metrics.v1beta1.NodeMetricsList;
 import io.fabric8.kubernetes.client.ConfigBuilder;
 import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.kubernetes.client.Exec;
@@ -8,8 +7,6 @@ import io.kubernetes.client.openapi.ApiClient;
 import io.kubernetes.client.openapi.apis.AppsV1Api;
 import io.kubernetes.client.openapi.apis.CoreV1Api;
 import io.kubernetes.client.openapi.apis.ExtensionsV1beta1Api;
-import io.kubernetes.client.openapi.models.V1Pod;
-import io.kubernetes.client.openapi.models.V1PodList;
 import io.kubernetes.client.util.Config;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;