ソースを参照

处理机器和应用的监控

reghao 4 年 前
コミット
e73f4649bb

+ 5 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/crud/config/AppCrudService.java

@@ -5,6 +5,7 @@ import cn.reghao.autodop.common.result.ResultStatus;
 import cn.reghao.autodop.dmaster.app.constant.AppType;
 import cn.reghao.autodop.dmaster.app.constant.EnvType;
 import cn.reghao.autodop.dmaster.app.entity.config.ProjOrchestration;
+import cn.reghao.autodop.dmaster.machine.db.crud.MachineInfoCrudService;
 import cn.reghao.autodop.dmaster.notification.entity.NotifyType;
 import cn.reghao.autodop.dmaster.app.entity.AppRunning;
 import cn.reghao.autodop.dmaster.app.entity.config.deploy.DeployConfig;
@@ -33,18 +34,18 @@ import java.util.stream.Collectors;
 @Service
 public class AppCrudService {
     private AppOrchestrationRepository appRepository;
-    private MachineInfoRepository machineRepository;
+    private MachineInfoCrudService infoCrudService;
     private SharedEntityChecker sharedEntityChecker;
     private AppBuildDeployService appBuildService;
     private AppRunningRepository runningRepository;
 
     public AppCrudService(AppOrchestrationRepository appRepository,
-                          MachineInfoRepository machineRepository,
+                          MachineInfoCrudService infoCrudService,
                           SharedEntityChecker sharedEntityChecker,
                           AppBuildDeployService appBuildService,
                           AppRunningRepository runningRepository) {
         this.appRepository = appRepository;
-        this.machineRepository = machineRepository;
+        this.infoCrudService = infoCrudService;
         this.sharedEntityChecker = sharedEntityChecker;
         this.appBuildService = appBuildService;
         this.runningRepository = runningRepository;
@@ -131,7 +132,7 @@ public class AppCrudService {
         List<DeployConfig> deployConfigs = app.getDeployConfigs().stream()
                 .map(deployConfig -> {
                     String machineId = deployConfig.getMachineId();
-                    MachineInfo machineInfo = machineRepository.findByMachineId(machineId);
+                    MachineInfo machineInfo = infoCrudService.selectByUk(machineId);
                     if (machineInfo != null && !machineInfo.getNetworkInfos().isEmpty()) {
                         deployConfig.setMachineIpv4(machineInfo.getNetworkInfos().get(0).getIpv4());
                         deployConfig.setPackType(packType);

+ 31 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/MachineController.java

@@ -0,0 +1,31 @@
+package cn.reghao.autodop.dmaster.machine.controller;
+
+import cn.reghao.autodop.dmaster.machine.service.MachineService;
+import cn.reghao.autodop.dmaster.utils.WebBody;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author reghao
+ * @date 2019-08-30 18:49:15
+ */
+@Slf4j
+@Api(tags = "机器接口")
+@RestController
+@RequestMapping("/api/machine")
+public class MachineController {
+    private MachineService machineService;
+
+    public MachineController(MachineService machineService) {
+        this.machineService = machineService;
+    }
+
+    @ApiOperation(value = "删除机器")
+    @DeleteMapping("/host")
+    public ResponseEntity<String> machine() {
+        return ResponseEntity.ok().body(WebBody.success());
+    }
+}

+ 17 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/crud/MachineInfoCrudService.java

@@ -2,6 +2,9 @@ package cn.reghao.autodop.dmaster.machine.db.crud;
 
 import cn.reghao.autodop.dmaster.machine.entity.info.MachineInfo;
 import cn.reghao.autodop.dmaster.machine.repository.MachineInfoRepository;
+import cn.reghao.autodop.dmaster.machine.repository.MachineStatRepository;
+import cn.reghao.autodop.dmaster.monitor.service.MonitorService;
+import cn.reghao.autodop.dmaster.monitor.service.job.MachineHeartbeatCheckJob;
 import org.springframework.cache.annotation.CacheConfig;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -18,9 +21,15 @@ import java.util.Optional;
 @Service
 public class MachineInfoCrudService {
     private MachineInfoRepository infoRepository;
+    private MachineStatCrudService statCrudService;
+    private MonitorService monitorService;
 
-    public MachineInfoCrudService(MachineInfoRepository infoRepository) {
+    public MachineInfoCrudService(MachineInfoRepository infoRepository,
+                                  MachineStatCrudService statCrudService,
+                                  MonitorService monitorService) {
         this.infoRepository = infoRepository;
+        this.statCrudService = statCrudService;
+        this.monitorService = monitorService;
     }
 
     public void insertOrUpdate(MachineInfo machineInfo) {
@@ -35,6 +44,13 @@ public class MachineInfoCrudService {
     }
 
     public void delete(MachineInfo machineInfo) {
+        // TODO 删除所有与 machine 关联的数据
+        String machineId = machineInfo.getMachineId();
+        statCrudService.deleteByUk(machineId);
+
+        String jobClassName = MachineHeartbeatCheckJob.class.getSimpleName();
+        String jobId = String.format("%s-%s", machineId, jobClassName);
+        monitorService.deleteJob(jobId);
         infoRepository.delete(machineInfo);
     }
 

+ 4 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/crud/MachineStatCrudService.java

@@ -30,6 +30,10 @@ public class MachineStatCrudService {
         statRepository.delete(machineStat);
     }
 
+    public void deleteByUk(String machineId) {
+        statRepository.deleteByMachineId(machineId);
+    }
+
     public MachineStat selectByUk(String machineId) {
         return statRepository.findByMachineId(machineId);
         //return (MachineStat) cache.getIfPresent(machineId);

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/repository/MachineStatRepository.java

@@ -9,4 +9,5 @@ import org.springframework.data.mongodb.repository.MongoRepository;
  */
 public interface MachineStatRepository extends MongoRepository<MachineStat, String> {
     MachineStat findByMachineId(String machineId);
+    void deleteByMachineId(String machineId);
 }

+ 12 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/DagentOpsService.java

@@ -5,6 +5,7 @@ import cn.reghao.autodop.dmaster.machine.db.crud.MachineStatCrudService;
 import cn.reghao.autodop.dmaster.machine.entity.info.MachineInfo;
 import cn.reghao.autodop.dmaster.machine.entity.stat.MachineStat;
 import cn.reghao.autodop.dmaster.machine.entity.stat.StatusType;
+import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
 import cn.reghao.autodop.dmaster.monitor.service.MonitorService;
 import cn.reghao.autodop.dmaster.monitor.service.job.MachineHeartbeatCheckJob;
 import cn.reghao.autodop.dmaster.sys.db.AppRuntimeLogCrudService;
@@ -47,16 +48,22 @@ public class DagentOpsService {
 
         MachineInfo infoEntity = infoCrudService.selectByUk(machineId);
         if (infoEntity != null) {
-
             infoCrudService.insertOrUpdate(machineInfo);
         } else {
-            // TODO 开启心跳检测任务
-            String jobClassName = MachineHeartbeatCheckJob.class.getSimpleName();
-            String jobId = String.format("%s-%s", machineId, jobClassName);
-            //monitorService.addOrModifyJob();
+            // 先存储数据,然后再添加监控任务,若任务添加失败则回滚
+            infoCrudService.insertOrUpdate(machineInfo);
+            addOrStartMonitorJob(machineId);
         }
     }
 
+    private void addOrStartMonitorJob(String machineId) {
+        String jobClassName = MachineHeartbeatCheckJob.class.getSimpleName();
+        String jobId = String.format("%s-%s", machineId, jobClassName);
+
+        MonitorJob monitorJob = new MonitorJob(jobId, jobClassName);
+        monitorService.addOrModifyJob(monitorJob);
+    }
+
     public void heartbeat(MachineStat machineStat) {
         MachineStat stat = statCrudService.selectByUk(machineStat.getMachineId());
         if (stat != null) {

+ 4 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/MachineService.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.machine.service;
 
+import cn.reghao.autodop.dmaster.machine.db.crud.MachineInfoCrudService;
 import cn.reghao.autodop.dmaster.machine.db.crud.MachineStatCrudService;
 import cn.reghao.autodop.dmaster.machine.entity.info.MachineInfo;
 import cn.reghao.autodop.dmaster.machine.entity.stat.MachineStat;
@@ -12,9 +13,11 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class MachineService {
+    private MachineInfoCrudService infoCrudService;
     private MachineStatCrudService statCrudService;
 
-    public MachineService(MachineStatCrudService statCrudService) {
+    public MachineService(MachineInfoCrudService infoCrudService, MachineStatCrudService statCrudService) {
+        this.infoCrudService = infoCrudService;
         this.statCrudService = statCrudService;
     }
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/MonitorJob.java

@@ -38,7 +38,7 @@ public class MonitorJob extends BaseEntity<Integer> {
     public MonitorJob(String jobId, String jobClassName) {
         this.jobId = jobId;
         this.jobClassName = jobClassName;
-        this.cronExp = "待设置";
+        this.cronExp = "0/10 * * * * ?";
         this.enable = false;
     }
 }

+ 4 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/repository/MonitorJobRepository.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.dmaster.monitor.repository;
 
 import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @author reghao
@@ -9,4 +10,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
  */
 public interface MonitorJobRepository extends JpaRepository<MonitorJob, Integer> {
     MonitorJob findByJobId(String jobId);
+
+    @Transactional
+    void deleteByJobId(String jobId);
 }

+ 14 - 33
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorServiceImpl.java

@@ -32,8 +32,6 @@ public class MonitorServiceImpl implements MonitorService {
     @Override
     public synchronized void addOrModifyJob(MonitorJob monitorJob) {
         String jobId = monitorJob.getJobId();
-        //jobId = String.format("%s-%s", monitor.getMachineId(), monitorJob.getJobClassName());
-
         Integer id = monitorJob.getId();
         try {
             if (id == null) {
@@ -52,63 +50,46 @@ public class MonitorServiceImpl implements MonitorService {
 
     @Override
     public synchronized void deleteJob(String jobId) {
-        /*Map<String, MonitorJob> map = monitor.getJobMap();
-        MonitorJob monitorJob = map.get(jobId);
-        map.remove(jobId);
-        int totalJobs = monitor.getTotalJobs();
-        monitor.setTotalJobs(totalJobs-1);
-        if (monitorJob.getEnable()) {
-            int runningJobs = monitor.getRunningJobs();
-            monitor.setRunningJobs(runningJobs-1);
-        }
-
         try {
             monitorScheduler.deleteJob(jobId);
-            MonitorJobRepository.save(monitor);
+            monitorJobRepository.deleteByJobId(jobId);
         } catch (SchedulerException e) {
             log.error("{}", e.getMessage());
-        }*/
+        }
     }
 
     @Override
     public synchronized void startJob(String jobId) {
-        /*MonitorJob monitorJob = monitor.getJobMap().get(jobId);
+        MonitorJob monitorJob = monitorJobRepository.findByJobId(jobId);
+        if (monitorJob.getNotifyGroups().isEmpty()) {
+            log.error("{} 没有通知组,添加通知组后再启用", jobId);
+            return;
+        }
+
         boolean isEnable = monitorJob.getEnable();
         if (!isEnable) {
             monitorJob.setEnable(true);
-            int runningJobs = monitor.getRunningJobs();
-            monitor.setRunningJobs(runningJobs+1);
-
             try {
-                boolean isExist = monitorScheduler.isJobExist(jobId);
-                if (isExist) {
-                    monitorScheduler.resumeJob(monitorJob.getJobId());
-                } else {
-                    //monitorScheduler.addMonitorJobJob(monitor, jobId);
-                }
-                MonitorJobRepository.save(monitor);
+                monitorScheduler.resumeJob(monitorJob.getJobId());
+                monitorJobRepository.save(monitorJob);
             } catch (SchedulerException e) {
                 e.printStackTrace();
             }
-        }*/
+        }
     }
 
     @Override
     public synchronized void pauseJob(String jobId) {
-        /*MonitorJob monitorJob = monitor.getJobMap().get(jobId);
+        MonitorJob monitorJob = monitorJobRepository.findByJobId(jobId);
         boolean isEnable = monitorJob.getEnable();
         if (isEnable) {
             monitorJob.setEnable(false);
-            int runningJobs = monitor.getRunningJobs();
-            monitor.setRunningJobs(runningJobs-1);
-
             try {
                 monitorScheduler.pauseJob(monitorJob.getJobId());
-                MonitorJobRepository.save(monitor);
+                monitorJobRepository.save(monitorJob);
             } catch (SchedulerException e) {
                 log.error("{}", e.getMessage());
             }
-
-        }*/
+        }
     }
 }

+ 2 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/job/MachineHeartbeatCheckJob.java

@@ -17,9 +17,10 @@ import java.util.List;
 
 /**
  * 机器心跳监控任务
- * 接收到 dagentStart 事件时添加(若 machine 是第一次注册)并启动任务
+ * 接收到 dagentStart 事件时添加(若 machine 是第一次注册)并启动(若不是第一次注册且存在通知组)任务
  * 接收到 dagnetShutdown 事件时停止任务
  * 删除 MachineInfo 时删除任务
+ * 任务需要设置通知组后才能启用
  *
  * @author reghao
  * @date 2021-06-22 19:04:10