From 20fe6d5213f95f72bfa4bee5a0544e492ed99b34 Mon Sep 17 00:00:00 2001 From: Li Haoyu Date: Thu, 5 Dec 2019 18:18:09 +0800 Subject: [PATCH] jar包运维功能测试; 添加GPU监控功能(暂时只支持NVIDIA显卡); --- src/main/java/com/objecteye/controller/BackGroundController.java | 12 ++++++++++++ src/main/java/com/objecteye/controller/OccupationOfBasicResourcesController.java | 10 ++++++++++ src/main/java/com/objecteye/mapper/SyBasicResourceHistoryMapper.java | 11 +++++++++++ src/main/java/com/objecteye/service/IBackGroundService.java | 10 ++++++++++ src/main/java/com/objecteye/service/IOccupationOfBasicResourcesService.java | 9 +++++++++ src/main/java/com/objecteye/service/impl/BackGroundServiceImpl.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/objecteye/service/impl/OccupationOfBasicResourcesServiceImpl.java | 46 +++++++++++++++++++++++++++------------------- src/main/resources/com.objecteye.mapper/SyBasicResourceHistoryMapper.xml | 32 +++++++++++++++++++++++++------- 8 files changed, 149 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/objecteye/controller/BackGroundController.java b/src/main/java/com/objecteye/controller/BackGroundController.java index 74abb5a..f8959a7 100644 --- a/src/main/java/com/objecteye/controller/BackGroundController.java +++ b/src/main/java/com/objecteye/controller/BackGroundController.java @@ -2,12 +2,14 @@ package com.objecteye.controller; import com.alibaba.fastjson.JSONObject; import com.objecteye.common.CommonResult; +import com.objecteye.entity.SyBasicResourceHistory; import com.objecteye.service.IBackGroundService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.Map; @RestController @@ -47,4 +49,14 @@ public class BackGroundController { } return CommonResult.success(resultObj); } + + @ApiOperation("获取module对应的内容") + @RequestMapping(value = "/getModuleInfo", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public CommonResult getModuleInfo(@RequestBody Map requestMap) { + List syBasicResourceHistories = iBackGroundService.getModuleInfo(requestMap); + if (syBasicResourceHistories == null || syBasicResourceHistories.size() == 0) { + return CommonResult.success(201, "没有找到符合要求的数据", null); + } + return CommonResult.success(syBasicResourceHistories); + } } diff --git a/src/main/java/com/objecteye/controller/OccupationOfBasicResourcesController.java b/src/main/java/com/objecteye/controller/OccupationOfBasicResourcesController.java index b84b69e..02fde91 100644 --- a/src/main/java/com/objecteye/controller/OccupationOfBasicResourcesController.java +++ b/src/main/java/com/objecteye/controller/OccupationOfBasicResourcesController.java @@ -49,4 +49,14 @@ public class OccupationOfBasicResourcesController { } return CommonResult.success(resultObj); } + + @ApiOperation("停止jar包进程") + @RequestMapping(value = "/killJarTask", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public CommonResult killJarTask(@RequestBody Map requestMap) { + JSONObject resultObj = iOccupationOfBasicResourcesService.killJarTask(requestMap); + if (resultObj.containsKey("error")) { + return CommonResult.success(201, resultObj.getString("error"), null); + } + return CommonResult.success(resultObj); + } } diff --git a/src/main/java/com/objecteye/mapper/SyBasicResourceHistoryMapper.java b/src/main/java/com/objecteye/mapper/SyBasicResourceHistoryMapper.java index 5866f74..56b1622 100644 --- a/src/main/java/com/objecteye/mapper/SyBasicResourceHistoryMapper.java +++ b/src/main/java/com/objecteye/mapper/SyBasicResourceHistoryMapper.java @@ -2,6 +2,9 @@ package com.objecteye.mapper; import com.objecteye.entity.SyBasicResourceHistory; +import java.util.List; +import java.util.Map; + public interface SyBasicResourceHistoryMapper { int deleteByPrimaryKey(String id); @@ -22,4 +25,12 @@ public interface SyBasicResourceHistoryMapper { * @return 操作数量 */ int deleteLteTime(long time); + + /** + * 获取过滤后的指定module的信息 + * + * @param requestMap 请求参数 + * @return 结果集 + */ + List getModuleInfoQueryByCondition(Map requestMap); } \ No newline at end of file diff --git a/src/main/java/com/objecteye/service/IBackGroundService.java b/src/main/java/com/objecteye/service/IBackGroundService.java index f85b47f..8ea8faf 100644 --- a/src/main/java/com/objecteye/service/IBackGroundService.java +++ b/src/main/java/com/objecteye/service/IBackGroundService.java @@ -1,7 +1,9 @@ package com.objecteye.service; import com.alibaba.fastjson.JSONObject; +import com.objecteye.entity.SyBasicResourceHistory; +import java.util.List; import java.util.Map; public interface IBackGroundService { @@ -38,4 +40,12 @@ public interface IBackGroundService { * @return 返回信息 */ JSONObject removeWorkingListener(Map requestMap); + + /** + * 获取module对应的内容 + * + * @param requestMap 请求参数 + * @return 结果集 + */ + List getModuleInfo(Map requestMap); } diff --git a/src/main/java/com/objecteye/service/IOccupationOfBasicResourcesService.java b/src/main/java/com/objecteye/service/IOccupationOfBasicResourcesService.java index ec2ad28..b8271ef 100644 --- a/src/main/java/com/objecteye/service/IOccupationOfBasicResourcesService.java +++ b/src/main/java/com/objecteye/service/IOccupationOfBasicResourcesService.java @@ -3,6 +3,7 @@ package com.objecteye.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import java.util.List; import java.util.Map; /** @@ -40,4 +41,12 @@ public interface IOccupationOfBasicResourcesService { * @return 进行中的jar包信息 */ JSONObject getJpsInfo(); + + /** + * 执行Linux语句并获取返回值 + * + * @param cmd linux语句 + * @param outList 输出参数 + */ + void executeLinuxCmd(String cmd, List outList); } diff --git a/src/main/java/com/objecteye/service/impl/BackGroundServiceImpl.java b/src/main/java/com/objecteye/service/impl/BackGroundServiceImpl.java index 33e3836..15159b9 100644 --- a/src/main/java/com/objecteye/service/impl/BackGroundServiceImpl.java +++ b/src/main/java/com/objecteye/service/impl/BackGroundServiceImpl.java @@ -49,6 +49,9 @@ public class BackGroundServiceImpl implements IBackGroundService { case "memory_info": doMemoryInfo(requestMap); break; + case "GPU": + doGpuUtilization(); + break; } } } @@ -126,6 +129,17 @@ public class BackGroundServiceImpl implements IBackGroundService { } /** + * 获取module对应的内容 + * + * @param requestMap 请求参数 + * @return 结果集 + */ + @Override + public List getModuleInfo(Map requestMap) { + return syBasicResourceHistoryMapper.getModuleInfoQueryByCondition(requestMap); + } + + /** * cpu信息记录 * * @param requestMap 请求参数 @@ -159,4 +173,35 @@ public class BackGroundServiceImpl implements IBackGroundService { syBasicResourceHistoryMapper.insertSelective(syBasicResourceHistory); } } + + /** + * NVIDIA GPU信息记录(多卡就会有多条记录) + */ + @Async("taskExecutor") + public void doGpuUtilization() { + String cmd = "nvidia-smi -q -d UTILIZATION"; + List outList = new ArrayList<>(); + iOccupationOfBasicResourcesService.executeLinuxCmd(cmd, outList); + long occurrenceTime = System.currentTimeMillis(); + if (outList.size() > 0) { + boolean nextLevelRecord = false; + String lastLine = ""; + for (String s : outList) { + String nowLine = s.trim(); + if (nextLevelRecord) { + String moduleId = "GPU" + lastLine.split(" ")[1].trim(); + String occupancy = nowLine.split(":")[1].replaceAll(" ", "").replaceAll("%", ""); + SyBasicResourceHistory syBasicResourceHistory = new SyBasicResourceHistory(UUID.randomUUID().toString(), moduleId, + occurrenceTime, Double.parseDouble(occupancy)); + syBasicResourceHistoryMapper.insertSelective(syBasicResourceHistory); + } + nextLevelRecord = "Utilization".equals(nowLine); + if (!nextLevelRecord) { + lastLine = nowLine; + } + } + } + } + + } diff --git a/src/main/java/com/objecteye/service/impl/OccupationOfBasicResourcesServiceImpl.java b/src/main/java/com/objecteye/service/impl/OccupationOfBasicResourcesServiceImpl.java index b1e4fc8..1a45d1b 100644 --- a/src/main/java/com/objecteye/service/impl/OccupationOfBasicResourcesServiceImpl.java +++ b/src/main/java/com/objecteye/service/impl/OccupationOfBasicResourcesServiceImpl.java @@ -68,12 +68,13 @@ public class OccupationOfBasicResourcesServiceImpl implements IOccupationOfBasic String logPath = (String) requestMap.get("logPath"); String owner = (String) requestMap.getOrDefault("user", "-1"); if (logPath == null || "".equals(logPath)) { - logPath = jarPath.substring(0, jarPath.lastIndexOf("//")) + jarPath.substring(jarPath.lastIndexOf("//")).replaceAll("jar", "log"); + logPath = jarPath.substring(0, jarPath.lastIndexOf("/")) + jarPath.substring(jarPath.lastIndexOf("/")).replaceAll("jar", "log"); + log.info("OccupationOfBasicResourcesServiceImpl|deployJarFile|logPath: {}", logPath); } JSONObject resultObj = new JSONObject(); - String jarName = jarPath.substring(jarPath.lastIndexOf("//") + 1); - if (!jarName.endsWith("\\.jar")) { + String jarName = jarPath.substring(jarPath.lastIndexOf("/") + 1); + if (!jarName.endsWith(".jar")) { resultObj.put("error", "File type error. Please confirm your jar file is right."); } @@ -81,20 +82,21 @@ public class OccupationOfBasicResourcesServiceImpl implements IOccupationOfBasic String cmd = "nohup java -jar " + jarPath + " > " + logPath + " 2>&1 &"; executeLinuxCmd(cmd, outList); - String outStr; if (outList.size() > 0) { - outStr = outList.get(0); - String regex = "^[[0-9]*] [0-9]*$"; - if (outStr.matches(regex)) { - resultObj.put("logPath", logPath); - String taskId = outStr.split(" ")[1]; - resultObj.put("taskId", taskId); + resultObj.put("error", outList.get(0)); + return resultObj; + } + + outList = new ArrayList<>(); + String jpsCommand = "jps -l"; + executeLinuxCmd(jpsCommand, outList); + for (String jpsDetail : outList) { + String taskId = jpsDetail.split(" ")[0].trim(); + String command = jpsDetail.split(" ")[1].trim(); + if (command.equals(jarPath)) { redisTemplate.opsForHash().put(GeneralContent.REDIS_TASK_ID_OWNER, taskId, owner); - } else { - resultObj.put("error", "linux error: " + outStr); + resultObj.put("taskId", taskId); } - } else { - resultObj.put("error", "There is no response from Linux"); } return resultObj; @@ -171,23 +173,29 @@ public class OccupationOfBasicResourcesServiceImpl implements IOccupationOfBasic * @param cmd linux语句 * @param outList 输出参数 */ - private void executeLinuxCmd(String cmd, List outList) { + @Override + public void executeLinuxCmd(String cmd, List outList) { Runtime run = Runtime.getRuntime(); try { Process process; - if (cmd.endsWith("\\.sh")) { + if (cmd.endsWith(".sh")) { ProcessBuilder builder = new ProcessBuilder("/bin/chmod", "755", cmd); Process permission = builder.start(); permission.waitFor(); process = run.exec("sh " + cmd); } else { - process = run.exec(cmd); + String[] cmdList = {"/bin/sh", "-c", cmd}; + process = run.exec(cmdList); } - log.debug("OccupationOfBasicResourcesServiceImpl|executeLinuxCmd|cmd: {}", cmd); + log.info("OccupationOfBasicResourcesServiceImpl|executeLinuxCmd|cmd: {}", cmd); String line; BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream())); while ((line = stdoutReader.readLine()) != null) { - log.debug("OccupationOfBasicResourcesServiceImpl|executeLinuxCmd|line: {}", line); + log.info("OccupationOfBasicResourcesServiceImpl|executeLinuxCmd|line: {}", line); + if (line.contains("command not found") && line.contains("-bash")) { + log.error(line); + return; + } outList.add(line); } process.waitFor(); diff --git a/src/main/resources/com.objecteye.mapper/SyBasicResourceHistoryMapper.xml b/src/main/resources/com.objecteye.mapper/SyBasicResourceHistoryMapper.xml index a2c8569..8ceb36c 100644 --- a/src/main/resources/com.objecteye.mapper/SyBasicResourceHistoryMapper.xml +++ b/src/main/resources/com.objecteye.mapper/SyBasicResourceHistoryMapper.xml @@ -11,21 +11,39 @@ id, module_id, occurrence_time, occupancy + - delete from sy_basic_resource_history + delete + from sy_basic_resource_history where id = #{id,jdbcType=VARCHAR} + delete + from sy_basic_resource_history + where occurrence_time <= #{time,jdbcType=BIGINT} + ]]> - insert into sy_basic_resource_history (id, module_id, occurrence_time, - occupancy) + insert into sy_basic_resource_history (id, module_id, occurrence_time, + occupancy) values (#{id,jdbcType=VARCHAR}, #{moduleId,jdbcType=VARCHAR}, #{occurrenceTime,jdbcType=BIGINT}, #{occupancy,jdbcType=DOUBLE}) -- libgit2 0.21.4