Просмотр исходного кода

处理机器和应用的监控

reghao 4 лет назад
Родитель
Сommit
596f56e7ad

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/message/ops/AppOps.java

@@ -6,5 +6,5 @@ package cn.reghao.autodop.common.message.ops;
  */
 public enum AppOps {
     appDeploy, appStatus, appRestart, appStop, appStart, appLog,
-    appDeployResult, appStatusResult, appRestartResult, appStopResult, appStartResult, appLogResult,
+    appDeployResult, appStatusResult, appRestartResult, appStopResult, appStartResult, appLogResult
 }

+ 153 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppOpsResultService.java

@@ -0,0 +1,153 @@
+package cn.reghao.autodop.dmaster.app.service;
+
+import cn.reghao.autodop.common.dagent.app.api.data.AppStatus;
+import cn.reghao.autodop.common.dagent.app.api.data.DeployResult;
+import cn.reghao.autodop.common.http.DefaultWebRequest;
+import cn.reghao.autodop.common.http.WebRequest;
+import cn.reghao.autodop.dmaster.app.db.query.config.AppQuery;
+import cn.reghao.autodop.dmaster.app.entity.AppDeploying;
+import cn.reghao.autodop.dmaster.app.entity.AppRunning;
+import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
+import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
+import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
+import cn.reghao.autodop.dmaster.app.repository.AppDeployingRepository;
+import cn.reghao.autodop.dmaster.app.repository.AppRunningRepository;
+import cn.reghao.autodop.dmaster.app.repository.log.BuildLogRepository;
+import cn.reghao.autodop.dmaster.app.repository.log.DeployLogRepository;
+import cn.reghao.autodop.dmaster.app.service.bd.DeployNotifyMsg;
+import cn.reghao.autodop.dmaster.monitor.service.MonitorService;
+import cn.reghao.autodop.dmaster.monitor.service.job.AppHealthCheckJob;
+import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
+import cn.reghao.autodop.dmaster.notification.entity.NotifyType;
+import cn.reghao.autodop.dmaster.notification.service.NotifyService;
+import cn.reghao.autodop.dmaster.notification.service.notifier.ding.DingMsg;
+import org.quartz.JobDataMap;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 对 AppOps Result 部分的实现
+ *
+ * @author reghao
+ * @date 2021-07-01 20:15:57
+ */
+@Service
+public class AppOpsResultService {
+    private MonitorService monitorService;
+    private AppRunningRepository runningRepository;
+    private NotifyService notifyService;
+    private WebRequest webRequest;
+    private BuildLogRepository buildLogRepository;
+    private DeployLogRepository deployLogRepository;
+    private AppDeployingRepository deployingRepository;
+    private AppQuery appQuery;
+
+    public AppOpsResultService(MonitorService monitorService,
+                               AppRunningRepository runningRepository,
+                               NotifyService notifyService,
+                               BuildLogRepository buildLogRepository,
+                               DeployLogRepository deployLogRepository,
+                               AppDeployingRepository deployingRepository,
+                               AppQuery appQuery) {
+        this.monitorService = monitorService;
+        this.runningRepository = runningRepository;
+        this.notifyService = notifyService;
+        this.webRequest = new DefaultWebRequest();
+        this.buildLogRepository = buildLogRepository;
+        this.deployLogRepository = deployLogRepository;
+        this.deployingRepository = deployingRepository;
+        this.appQuery = appQuery;
+    }
+
+    public void deployResult(DeployResult deployResult) {
+        DeployLog deployLog = DeployLog.from(deployResult);
+        deployLogRepository.save(deployLog);
+
+        String buildId = deployResult.getBuildLogId();
+        // TODO 部署时将 BuildLog 放到缓存中
+        Optional<BuildLog> optional = buildLogRepository.findById(buildId);
+        if (optional.isPresent()) {
+            BuildLog buildLog = optional.get();
+            updateDeployingStatus(buildLog, deployResult);
+            updateRunningStatus(buildLog, deployResult);
+            deployNotify(buildLog, deployResult);
+        }
+    }
+
+    private void updateDeployingStatus(BuildLog buildLog, DeployResult deployResult) {
+        String appId = buildLog.getAppId();
+        String machineId = deployResult.getMachineId();
+        AppDeploying deploying = deployingRepository.findByAppIdAndMachineId(appId, machineId);
+        if (deploying != null) {
+            deploying.update(buildLog, deployResult);
+            deployingRepository.save(deploying);
+        }
+    }
+
+    private void updateRunningStatus(BuildLog buildLog, DeployResult deployResult) {
+        String appId = buildLog.getAppId();
+        String machineId = deployResult.getMachineId();
+        AppRunning running = runningRepository.findByAppIdAndMachineId(appId, machineId);
+        if (running != null) {
+            running.update(buildLog, deployResult.getAppStatus());
+            runningRepository.save(running);
+        }
+    }
+
+    private void deployNotify(BuildLog buildLog, DeployResult deployResult) {
+        AppOrchestration app = appQuery.findByAppId(buildLog.getAppId());
+        List<NotifyGroup> notifyGroups = app.getNotifyGroups();
+        notifyGroups.forEach(notifyGroup -> {
+            String notifyType = notifyGroup.getNotifyType();
+            switch (NotifyType.valueOf(notifyType)) {
+                case ding:
+                    DingMsg dingMsg = new DeployNotifyMsg(buildLog, deployResult).dingMsg();
+                    notifyService.notify(notifyGroup, dingMsg);
+                    break;
+                case email:
+                    break;
+                case sms:
+                    break;
+                default:
+            }
+        });
+    }
+
+    public void statusResult(AppStatus appStatus) {
+        processAppStatus(appStatus);
+    }
+
+    private void processAppStatus(AppStatus appStatus) {
+        String appId = appStatus.getAppId();
+        String machineId = appStatus.getMachineId();
+        AppRunning appRunning = runningRepository.findByAppIdAndMachineId(appId, machineId);
+        if (appRunning != null) {
+            appRunning.update(appStatus);
+            runningRepository.save(appRunning);
+        }
+    }
+
+    public void restartResult(AppStatus appStatus) {
+    }
+
+    public void stopResult(AppStatus appStatus) {
+    }
+
+    public void startResult(AppStatus appStatus) {
+    }
+
+    public void addMonitor(String appId, String machineId) {
+        String jobClassName = AppHealthCheckJob.class.getSimpleName();
+        String jobId = String.format("%s-%s-%s", appId, machineId, jobClassName);
+
+        JobDataMap jobDataMap = new JobDataMap();
+        jobDataMap.put("notifyService", notifyService);
+        jobDataMap.put("notifyGroups", "");
+        jobDataMap.put("webRequest", webRequest);
+        jobDataMap.put("appId", appId);
+        jobDataMap.put("machineId", machineId);
+        jobDataMap.put("runningRepository", runningRepository);
+    }
+}

+ 0 - 44
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppOpsService.java

@@ -1,44 +0,0 @@
-package cn.reghao.autodop.dmaster.app.service;
-
-import cn.reghao.autodop.common.http.DefaultWebRequest;
-import cn.reghao.autodop.common.http.WebRequest;
-import cn.reghao.autodop.dmaster.app.repository.AppRunningRepository;
-import cn.reghao.autodop.dmaster.monitor.service.MonitorService;
-import cn.reghao.autodop.dmaster.monitor.service.job.app.AppHealthCheckJob;
-import cn.reghao.autodop.dmaster.notification.service.NotifyService;
-import org.quartz.JobDataMap;
-import org.springframework.stereotype.Service;
-
-/**
- * @author reghao
- * @date 2021-07-01 20:15:57
- */
-@Service
-public class AppOpsService {
-    private MonitorService monitorService;
-    private AppRunningRepository runningRepository;
-    private NotifyService notifyService;
-    private WebRequest webRequest;
-
-    public AppOpsService(MonitorService monitorService,
-                         AppRunningRepository runningRepository,
-                         NotifyService notifyService) {
-        this.monitorService = monitorService;
-        this.runningRepository = runningRepository;
-        this.notifyService = notifyService;
-        this.webRequest = new DefaultWebRequest();
-    }
-
-    public void addMonitor(String appId, String machineId) {
-        String jobClassName = AppHealthCheckJob.class.getSimpleName();
-        String jobId = String.format("%s-%s-%s", appId, machineId, jobClassName);
-
-        JobDataMap jobDataMap = new JobDataMap();
-        jobDataMap.put("notifyService", notifyService);
-        jobDataMap.put("notifyGroups", "");
-        jobDataMap.put("webRequest", webRequest);
-        jobDataMap.put("appId", appId);
-        jobDataMap.put("machineId", machineId);
-        jobDataMap.put("runningRepository", runningRepository);
-    }
-}

+ 2 - 8
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/crud/MachineStatCrudService.java

@@ -5,8 +5,6 @@ import cn.reghao.autodop.dmaster.machine.repository.MachineStatRepository;
 import com.github.benmanes.caffeine.cache.Cache;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDateTime;
-
 /**
  * TODO 系统启动时将所有数据放入缓存,系统结束前将所有数据持久化到数据库
  *
@@ -23,17 +21,13 @@ public class MachineStatCrudService {
         this.statRepository = statRepository;
     }
 
-    public void insert(MachineStat machineStat) {
+    public void insertOrUpdate(MachineStat machineStat) {
         statRepository.save(machineStat);
         //cache.put(machineStat.getMachineId(), machineStat);
     }
 
-    public void update(MachineStat machineStat) {
-        machineStat.setLastCheck(LocalDateTime.now());
-        statRepository.save(machineStat);
-    }
-
     public void delete(MachineStat machineStat) {
+        statRepository.delete(machineStat);
     }
 
     public MachineStat selectByUk(String machineId) {

+ 16 - 15
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/DagentOpsService.java

@@ -6,12 +6,14 @@ 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.service.MonitorService;
-import cn.reghao.autodop.dmaster.monitor.service.job.machine.MachineHeartbeatCheckJob;
+import cn.reghao.autodop.dmaster.monitor.service.job.MachineHeartbeatCheckJob;
 import cn.reghao.autodop.dmaster.sys.db.AppRuntimeLogCrudService;
 import cn.reghao.autodop.dmaster.sys.entity.AppRuntimeLog;
 import org.springframework.stereotype.Service;
 
 /**
+ * 对 DagentOps 的实现
+ *
  * @author reghao
  * @date 2021-07-01 19:11:54
  */
@@ -35,25 +37,24 @@ public class DagentOpsService {
     public void start(MachineInfo machineInfo) {
         String machineId = machineInfo.getMachineId();
         MachineStat stat = statCrudService.selectByUk(machineId);
-        if (stat == null) {
-            stat = new MachineStat(machineInfo.getMachineId());
-            statCrudService.insert(stat);
-        } else {
+        if (stat != null) {
             stat.setStatus(StatusType.UP.name());
-            statCrudService.update(stat);
+            statCrudService.insertOrUpdate(stat);
+        } else {
+            stat = new MachineStat(machineInfo.getMachineId());
+            statCrudService.insertOrUpdate(stat);
         }
 
         MachineInfo infoEntity = infoCrudService.selectByUk(machineId);
-        if (infoEntity == null) {
+        if (infoEntity != null) {
+
             infoCrudService.insertOrUpdate(machineInfo);
         } else {
-
+            // TODO 开启心跳检测任务
+            String jobClassName = MachineHeartbeatCheckJob.class.getSimpleName();
+            String jobId = String.format("%s-%s", machineId, jobClassName);
+            //monitorService.addOrModifyJob();
         }
-
-        // TODO 开启心跳检测任务
-        String jobClassName = MachineHeartbeatCheckJob.class.getSimpleName();
-        String jobId = String.format("%s-%s", machineId, jobClassName);
-        //monitorService.addOrModifyJob();
     }
 
     public void heartbeat(MachineStat machineStat) {
@@ -62,7 +63,7 @@ public class DagentOpsService {
             if (stat.getStatus().equals(StatusType.DOWN.name())) {
                 stat.setStatus(StatusType.UP.name());
             }
-            statCrudService.update(stat);
+            statCrudService.insertOrUpdate(stat);
         }
     }
 
@@ -71,7 +72,7 @@ public class DagentOpsService {
         if (machineStat != null) {
             // TODO 停止心跳检测任务
             machineStat.setStatus(StatusType.DOWN.name());
-            statCrudService.update(machineStat);
+            statCrudService.insertOrUpdate(machineStat);
         }
     }
 

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorListService.java

@@ -6,8 +6,8 @@ import cn.reghao.autodop.dmaster.machine.entity.info.MachineInfo;
 import cn.reghao.autodop.dmaster.machine.repository.MachineInfoRepository;
 import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
 import cn.reghao.autodop.dmaster.monitor.repository.MonitorJobRepository;
-import cn.reghao.autodop.dmaster.monitor.service.job.app.AppHealthCheckJob;
-import cn.reghao.autodop.dmaster.monitor.service.job.machine.MachineHeartbeatCheckJob;
+import cn.reghao.autodop.dmaster.monitor.service.job.AppHealthCheckJob;
+import cn.reghao.autodop.dmaster.monitor.service.job.MachineHeartbeatCheckJob;
 import org.springframework.stereotype.Service;
 
 import java.util.List;

+ 9 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/job/app/AppHealthCheckJob.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/job/AppHealthCheckJob.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.monitor.service.job.app;
+package cn.reghao.autodop.dmaster.monitor.service.job;
 
 import cn.reghao.autodop.common.http.WebRequest;
 import cn.reghao.autodop.dmaster.app.entity.AppRunning;
@@ -17,7 +17,14 @@ import java.util.List;
 
 /**
  * 应用健康检查任务
- * TODO 应用部署时跳过健康检查,部署完成后才继续,使用 AOP 实现
+ * 发送 appDeploy 事件前停止任务
+ * 接收 appDeployResult 事件后添加(若是第一次部署)并启动任务
+ *
+ * 发送 appRestart 事件前停止任务
+ * 接收 appRestartResult 事件后启动任务
+ *
+ * 发送 appStop 事件前停止任务
+ * 接收 appStartResult 事件后启动任务
  *
  * @author reghao
  * @date 2021-06-22 19:04:10

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

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.monitor.service.job.machine;
+package cn.reghao.autodop.dmaster.monitor.service.job;
 
 import cn.reghao.autodop.common.utils.DateTimeConverter;
 import cn.reghao.autodop.dmaster.machine.db.crud.MachineStatCrudService;
@@ -17,6 +17,9 @@ import java.util.List;
 
 /**
  * 机器心跳监控任务
+ * 接收到 dagentStart 事件时添加(若 machine 是第一次注册)并启动任务
+ * 接收到 dagnetShutdown 事件时停止任务
+ * 删除 MachineInfo 时删除任务
  *
  * @author reghao
  * @date 2021-06-22 19:04:10
@@ -41,7 +44,7 @@ public class MachineHeartbeatCheckJob implements Job {
         if (result > 10_000) {
             // TODO 通知三次后,停止心跳检测
             machineStat.setStatus(StatusType.DOWN.name());
-            statCrudService.update(machineStat);
+            statCrudService.insertOrUpdate(machineStat);
             // TODO 检测 IP 是否能 ping 通
             // TODO 检测 MQTT 服务器是否正常连接
             String msg = String.format("距离上次接收到 %s 的心跳消息已过去 %ss", machineStat.getMachineId(), result/1000);

+ 37 - 101
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/processor/AppOpsProcessor.java

@@ -6,32 +6,16 @@ import cn.reghao.autodop.common.message.CallResult;
 import cn.reghao.autodop.common.message.ops.AppOps;
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
 import cn.reghao.autodop.common.utils.serializer.JsonConverter;
-import cn.reghao.autodop.dmaster.app.db.query.config.AppQuery;
-import cn.reghao.autodop.dmaster.app.entity.AppDeploying;
-import cn.reghao.autodop.dmaster.app.entity.AppRunning;
-import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
-import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
-import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
-import cn.reghao.autodop.dmaster.app.repository.AppDeployingRepository;
-import cn.reghao.autodop.dmaster.app.repository.AppRunningRepository;
-import cn.reghao.autodop.dmaster.app.repository.log.BuildLogRepository;
-import cn.reghao.autodop.dmaster.app.repository.log.DeployLogRepository;
-import cn.reghao.autodop.dmaster.app.service.bd.DeployNotifyMsg;
+import cn.reghao.autodop.dmaster.app.service.AppOpsResultService;
 import cn.reghao.autodop.common.message.ops.OpsProcessor;
-import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
-import cn.reghao.autodop.dmaster.notification.entity.NotifyType;
-import cn.reghao.autodop.dmaster.notification.service.notifier.ding.DingMsg;
-import cn.reghao.autodop.dmaster.notification.service.NotifyService;
 import com.google.gson.reflect.TypeToken;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 import java.lang.reflect.Type;
-import java.util.List;
-import java.util.Optional;
 
 /**
- * 分发 App 相关的消息
+ * 分发 App Result 相关的消息
  *
  * @author reghao
  * @date 2020-12-30 10:26:47
@@ -39,27 +23,11 @@ import java.util.Optional;
 @Slf4j
 @Component
 public class AppOpsProcessor implements OpsProcessor {
-    private BuildLogRepository buildLogRepository;
-    private DeployLogRepository deployLogRepository;
-    private AppDeployingRepository deployingRepository;
-    private AppRunningRepository runningRepository;
-    private AppQuery appQuery;
-    private NotifyService notifyService;
+    private AppOpsResultService appOpsResultService;
     private DefaultMqttClient mqttClient;
 
-    public AppOpsProcessor(BuildLogRepository buildLogRepository,
-                           DeployLogRepository deployLogRepository,
-                           AppDeployingRepository deployingRepository,
-                           AppRunningRepository runningRepository,
-                           AppQuery appQuery,
-                           NotifyService notifyService,
-                           DefaultMqttClient mqttClient) {
-        this.buildLogRepository = buildLogRepository;
-        this.deployLogRepository = deployLogRepository;
-        this.deployingRepository = deployingRepository;
-        this.runningRepository = runningRepository;
-        this.appQuery = appQuery;
-        this.notifyService = notifyService;
+    public AppOpsProcessor(AppOpsResultService appOpsResultService, DefaultMqttClient mqttClient) {
+        this.appOpsResultService = appOpsResultService;
         this.mqttClient = mqttClient;
     }
 
@@ -71,18 +39,16 @@ public class AppOpsProcessor implements OpsProcessor {
                 processAppDeployResult(payload);
                 break;
             case appStatusResult:
-                processAppStatus(payload);
+                processAppStatusResult(payload);
                 break;
             case appRestartResult:
-                processAppStatus(payload);
+                processAppRestartResult(payload);
                 break;
             case appStopResult:
-                processAppStatus(payload);
+                processAppStopResult(payload);
                 break;
             case appStartResult:
-                processAppStatus(payload);
-                break;
-            case appLogResult:
+                processAppStartResult(payload);
                 break;
             default:
                 log.error("AppOps 中没有相应类型...");
@@ -92,76 +58,46 @@ public class AppOpsProcessor implements OpsProcessor {
 
     private void processAppDeployResult(String payload) {
         DeployResult deployResult = JsonConverter.jsonToObject(payload, DeployResult.class);
-        DeployLog deployLog = DeployLog.from(deployResult);
-        deployLogRepository.save(deployLog);
-
-        String buildId = deployResult.getBuildLogId();
-        // TODO 部署时将 BuildLog 放到缓存中
-        Optional<BuildLog> optional = buildLogRepository.findById(buildId);
-        if (optional.isPresent()) {
-            BuildLog buildLog = optional.get();
-            updateDeployingStatus(buildLog, deployResult);
-            updateRunningStatus(buildLog, deployResult);
-            deployNotify(buildLog, deployResult);
-        }
-    }
-
-    private void updateDeployingStatus(BuildLog buildLog, DeployResult deployResult) {
-        String appId = buildLog.getAppId();
-        String machineId = deployResult.getMachineId();
-        AppDeploying deploying = deployingRepository.findByAppIdAndMachineId(appId, machineId);
-        if (deploying != null) {
-            deploying.update(buildLog, deployResult);
-            deployingRepository.save(deploying);
-        }
+        appOpsResultService.deployResult(deployResult);
     }
 
-    private void updateRunningStatus(BuildLog buildLog, DeployResult deployResult) {
-        String appId = buildLog.getAppId();
-        String machineId = deployResult.getMachineId();
-        AppRunning running = runningRepository.findByAppIdAndMachineId(appId, machineId);
-        if (running != null) {
-            running.update(buildLog, deployResult.getAppStatus());
-            runningRepository.save(running);
+    private void processAppStatusResult(String payload) {
+        AppStatus appStatus = processCallResult(payload);
+        if (appStatus != null) {
+            appOpsResultService.statusResult(appStatus);
         }
     }
 
-    private void deployNotify(BuildLog buildLog, DeployResult deployResult) {
-        AppOrchestration app = appQuery.findByAppId(buildLog.getAppId());
-        List<NotifyGroup> notifyGroups = app.getNotifyGroups();
-        notifyGroups.forEach(notifyGroup -> {
-            String notifyType = notifyGroup.getNotifyType();
-            switch (NotifyType.valueOf(notifyType)) {
-                case ding:
-                    DingMsg dingMsg = new DeployNotifyMsg(buildLog, deployResult).dingMsg();
-                    notifyService.notify(notifyGroup, dingMsg);
-                    break;
-                case email:
-                    break;
-                case sms:
-                    break;
-                default:
-                    log.error("通知类型不存在...");
-            }
-        });
-    }
-
-    private void processAppStatus(String payload) {
+    private AppStatus processCallResult(String payload) {
         Type type = new TypeToken<CallResult<AppStatus>>(){}.getType();
         CallResult<AppStatus> callResult = JsonConverter.jsonToObject(payload, type);
         if (callResult.getCode() != 0) {
             // TODO 处理调用失败的情况
             log.error("调用失败, 原因: {}", callResult.getMsg());
-            return;
+            return null;
+        } else {
+            return callResult.getData();
         }
+    }
+
+    private void processAppRestartResult(String payload) {
+        AppStatus appStatus = processCallResult(payload);
+        if (appStatus != null) {
+            appOpsResultService.restartResult(appStatus);
+        }
+    }
+
+    private void processAppStopResult(String payload) {
+        AppStatus appStatus = processCallResult(payload);
+        if (appStatus != null) {
+            appOpsResultService.stopResult(appStatus);
+        }
+    }
 
-        AppStatus appStatus = callResult.getData();
-        String appId = appStatus.getAppId();
-        String machineId = appStatus.getMachineId();
-        AppRunning appRunning = runningRepository.findByAppIdAndMachineId(appId, machineId);
-        if (appRunning != null) {
-            appRunning.update(appStatus);
-            runningRepository.save(appRunning);
+    private void processAppStartResult(String payload) {
+        AppStatus appStatus = processCallResult(payload);
+        if (appStatus != null) {
+            appOpsResultService.startResult(appStatus);
         }
     }
 }