Commit 20fe6d5213f95f72bfa4bee5a0544e492ed99b34

Authored by Liu Haoyu
1 parent 4ba5b210

jar包运维功能测试;

添加GPU监控功能(暂时只支持NVIDIA显卡);
src/main/java/com/objecteye/controller/BackGroundController.java
... ... @@ -2,12 +2,14 @@ package com.objecteye.controller;
2 2  
3 3 import com.alibaba.fastjson.JSONObject;
4 4 import com.objecteye.common.CommonResult;
  5 +import com.objecteye.entity.SyBasicResourceHistory;
5 6 import com.objecteye.service.IBackGroundService;
6 7 import io.swagger.annotations.Api;
7 8 import io.swagger.annotations.ApiOperation;
8 9 import org.springframework.beans.factory.annotation.Autowired;
9 10 import org.springframework.web.bind.annotation.*;
10 11  
  12 +import java.util.List;
11 13 import java.util.Map;
12 14  
13 15 @RestController
... ... @@ -47,4 +49,14 @@ public class BackGroundController {
47 49 }
48 50 return CommonResult.success(resultObj);
49 51 }
  52 +
  53 + @ApiOperation("获取module对应的内容")
  54 + @RequestMapping(value = "/getModuleInfo", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
  55 + public CommonResult getModuleInfo(@RequestBody Map<String, Object> requestMap) {
  56 + List<SyBasicResourceHistory> syBasicResourceHistories = iBackGroundService.getModuleInfo(requestMap);
  57 + if (syBasicResourceHistories == null || syBasicResourceHistories.size() == 0) {
  58 + return CommonResult.success(201, "没有找到符合要求的数据", null);
  59 + }
  60 + return CommonResult.success(syBasicResourceHistories);
  61 + }
50 62 }
... ...
src/main/java/com/objecteye/controller/OccupationOfBasicResourcesController.java
... ... @@ -49,4 +49,14 @@ public class OccupationOfBasicResourcesController {
49 49 }
50 50 return CommonResult.success(resultObj);
51 51 }
  52 +
  53 + @ApiOperation("停止jar包进程")
  54 + @RequestMapping(value = "/killJarTask", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
  55 + public CommonResult killJarTask(@RequestBody Map<String, Object> requestMap) {
  56 + JSONObject resultObj = iOccupationOfBasicResourcesService.killJarTask(requestMap);
  57 + if (resultObj.containsKey("error")) {
  58 + return CommonResult.success(201, resultObj.getString("error"), null);
  59 + }
  60 + return CommonResult.success(resultObj);
  61 + }
52 62 }
... ...
src/main/java/com/objecteye/mapper/SyBasicResourceHistoryMapper.java
... ... @@ -2,6 +2,9 @@ package com.objecteye.mapper;
2 2  
3 3 import com.objecteye.entity.SyBasicResourceHistory;
4 4  
  5 +import java.util.List;
  6 +import java.util.Map;
  7 +
5 8 public interface SyBasicResourceHistoryMapper {
6 9 int deleteByPrimaryKey(String id);
7 10  
... ... @@ -22,4 +25,12 @@ public interface SyBasicResourceHistoryMapper {
22 25 * @return 操作数量
23 26 */
24 27 int deleteLteTime(long time);
  28 +
  29 + /**
  30 + * 获取过滤后的指定module的信息
  31 + *
  32 + * @param requestMap 请求参数
  33 + * @return 结果集
  34 + */
  35 + List<SyBasicResourceHistory> getModuleInfoQueryByCondition(Map<String, Object> requestMap);
25 36 }
26 37 \ No newline at end of file
... ...
src/main/java/com/objecteye/service/IBackGroundService.java
1 1 package com.objecteye.service;
2 2  
3 3 import com.alibaba.fastjson.JSONObject;
  4 +import com.objecteye.entity.SyBasicResourceHistory;
4 5  
  6 +import java.util.List;
5 7 import java.util.Map;
6 8  
7 9 public interface IBackGroundService {
... ... @@ -38,4 +40,12 @@ public interface IBackGroundService {
38 40 * @return 返回信息
39 41 */
40 42 JSONObject removeWorkingListener(Map<String, Object> requestMap);
  43 +
  44 + /**
  45 + * 获取module对应的内容
  46 + *
  47 + * @param requestMap 请求参数
  48 + * @return 结果集
  49 + */
  50 + List<SyBasicResourceHistory> getModuleInfo(Map<String, Object> requestMap);
41 51 }
... ...
src/main/java/com/objecteye/service/IOccupationOfBasicResourcesService.java
... ... @@ -3,6 +3,7 @@ package com.objecteye.service;
3 3 import com.alibaba.fastjson.JSONArray;
4 4 import com.alibaba.fastjson.JSONObject;
5 5  
  6 +import java.util.List;
6 7 import java.util.Map;
7 8  
8 9 /**
... ... @@ -40,4 +41,12 @@ public interface IOccupationOfBasicResourcesService {
40 41 * @return 进行中的jar包信息
41 42 */
42 43 JSONObject getJpsInfo();
  44 +
  45 + /**
  46 + * 执行Linux语句并获取返回值
  47 + *
  48 + * @param cmd linux语句
  49 + * @param outList 输出参数
  50 + */
  51 + void executeLinuxCmd(String cmd, List<String> outList);
43 52 }
... ...
src/main/java/com/objecteye/service/impl/BackGroundServiceImpl.java
... ... @@ -49,6 +49,9 @@ public class BackGroundServiceImpl implements IBackGroundService {
49 49 case "memory_info":
50 50 doMemoryInfo(requestMap);
51 51 break;
  52 + case "GPU":
  53 + doGpuUtilization();
  54 + break;
52 55 }
53 56 }
54 57 }
... ... @@ -126,6 +129,17 @@ public class BackGroundServiceImpl implements IBackGroundService {
126 129 }
127 130  
128 131 /**
  132 + * 获取module对应的内容
  133 + *
  134 + * @param requestMap 请求参数
  135 + * @return 结果集
  136 + */
  137 + @Override
  138 + public List<SyBasicResourceHistory> getModuleInfo(Map<String, Object> requestMap) {
  139 + return syBasicResourceHistoryMapper.getModuleInfoQueryByCondition(requestMap);
  140 + }
  141 +
  142 + /**
129 143 * cpu信息记录
130 144 *
131 145 * @param requestMap 请求参数
... ... @@ -159,4 +173,35 @@ public class BackGroundServiceImpl implements IBackGroundService {
159 173 syBasicResourceHistoryMapper.insertSelective(syBasicResourceHistory);
160 174 }
161 175 }
  176 +
  177 + /**
  178 + * NVIDIA GPU信息记录(多卡就会有多条记录)
  179 + */
  180 + @Async("taskExecutor")
  181 + public void doGpuUtilization() {
  182 + String cmd = "nvidia-smi -q -d UTILIZATION";
  183 + List<String> outList = new ArrayList<>();
  184 + iOccupationOfBasicResourcesService.executeLinuxCmd(cmd, outList);
  185 + long occurrenceTime = System.currentTimeMillis();
  186 + if (outList.size() > 0) {
  187 + boolean nextLevelRecord = false;
  188 + String lastLine = "";
  189 + for (String s : outList) {
  190 + String nowLine = s.trim();
  191 + if (nextLevelRecord) {
  192 + String moduleId = "GPU" + lastLine.split(" ")[1].trim();
  193 + String occupancy = nowLine.split(":")[1].replaceAll(" ", "").replaceAll("%", "");
  194 + SyBasicResourceHistory syBasicResourceHistory = new SyBasicResourceHistory(UUID.randomUUID().toString(), moduleId,
  195 + occurrenceTime, Double.parseDouble(occupancy));
  196 + syBasicResourceHistoryMapper.insertSelective(syBasicResourceHistory);
  197 + }
  198 + nextLevelRecord = "Utilization".equals(nowLine);
  199 + if (!nextLevelRecord) {
  200 + lastLine = nowLine;
  201 + }
  202 + }
  203 + }
  204 + }
  205 +
  206 +
162 207 }
... ...
src/main/java/com/objecteye/service/impl/OccupationOfBasicResourcesServiceImpl.java
... ... @@ -68,12 +68,13 @@ public class OccupationOfBasicResourcesServiceImpl implements IOccupationOfBasic
68 68 String logPath = (String) requestMap.get("logPath");
69 69 String owner = (String) requestMap.getOrDefault("user", "-1");
70 70 if (logPath == null || "".equals(logPath)) {
71   - logPath = jarPath.substring(0, jarPath.lastIndexOf("//")) + jarPath.substring(jarPath.lastIndexOf("//")).replaceAll("jar", "log");
  71 + logPath = jarPath.substring(0, jarPath.lastIndexOf("/")) + jarPath.substring(jarPath.lastIndexOf("/")).replaceAll("jar", "log");
  72 + log.info("OccupationOfBasicResourcesServiceImpl|deployJarFile|logPath: {}", logPath);
72 73 }
73 74  
74 75 JSONObject resultObj = new JSONObject();
75   - String jarName = jarPath.substring(jarPath.lastIndexOf("//") + 1);
76   - if (!jarName.endsWith("\\.jar")) {
  76 + String jarName = jarPath.substring(jarPath.lastIndexOf("/") + 1);
  77 + if (!jarName.endsWith(".jar")) {
77 78 resultObj.put("error", "File type error. Please confirm your jar file is right.");
78 79 }
79 80  
... ... @@ -81,20 +82,21 @@ public class OccupationOfBasicResourcesServiceImpl implements IOccupationOfBasic
81 82 String cmd = "nohup java -jar " + jarPath + " > " + logPath + " 2>&1 &";
82 83 executeLinuxCmd(cmd, outList);
83 84  
84   - String outStr;
85 85 if (outList.size() > 0) {
86   - outStr = outList.get(0);
87   - String regex = "^[[0-9]*] [0-9]*$";
88   - if (outStr.matches(regex)) {
89   - resultObj.put("logPath", logPath);
90   - String taskId = outStr.split(" ")[1];
91   - resultObj.put("taskId", taskId);
  86 + resultObj.put("error", outList.get(0));
  87 + return resultObj;
  88 + }
  89 +
  90 + outList = new ArrayList<>();
  91 + String jpsCommand = "jps -l";
  92 + executeLinuxCmd(jpsCommand, outList);
  93 + for (String jpsDetail : outList) {
  94 + String taskId = jpsDetail.split(" ")[0].trim();
  95 + String command = jpsDetail.split(" ")[1].trim();
  96 + if (command.equals(jarPath)) {
92 97 redisTemplate.opsForHash().put(GeneralContent.REDIS_TASK_ID_OWNER, taskId, owner);
93   - } else {
94   - resultObj.put("error", "linux error: " + outStr);
  98 + resultObj.put("taskId", taskId);
95 99 }
96   - } else {
97   - resultObj.put("error", "There is no response from Linux");
98 100 }
99 101  
100 102 return resultObj;
... ... @@ -171,23 +173,29 @@ public class OccupationOfBasicResourcesServiceImpl implements IOccupationOfBasic
171 173 * @param cmd linux语句
172 174 * @param outList 输出参数
173 175 */
174   - private void executeLinuxCmd(String cmd, List<String> outList) {
  176 + @Override
  177 + public void executeLinuxCmd(String cmd, List<String> outList) {
175 178 Runtime run = Runtime.getRuntime();
176 179 try {
177 180 Process process;
178   - if (cmd.endsWith("\\.sh")) {
  181 + if (cmd.endsWith(".sh")) {
179 182 ProcessBuilder builder = new ProcessBuilder("/bin/chmod", "755", cmd);
180 183 Process permission = builder.start();
181 184 permission.waitFor();
182 185 process = run.exec("sh " + cmd);
183 186 } else {
184   - process = run.exec(cmd);
  187 + String[] cmdList = {"/bin/sh", "-c", cmd};
  188 + process = run.exec(cmdList);
185 189 }
186   - log.debug("OccupationOfBasicResourcesServiceImpl|executeLinuxCmd|cmd: {}", cmd);
  190 + log.info("OccupationOfBasicResourcesServiceImpl|executeLinuxCmd|cmd: {}", cmd);
187 191 String line;
188 192 BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
189 193 while ((line = stdoutReader.readLine()) != null) {
190   - log.debug("OccupationOfBasicResourcesServiceImpl|executeLinuxCmd|line: {}", line);
  194 + log.info("OccupationOfBasicResourcesServiceImpl|executeLinuxCmd|line: {}", line);
  195 + if (line.contains("command not found") && line.contains("-bash")) {
  196 + log.error(line);
  197 + return;
  198 + }
191 199 outList.add(line);
192 200 }
193 201 process.waitFor();
... ...
src/main/resources/com.objecteye.mapper/SyBasicResourceHistoryMapper.xml
... ... @@ -11,21 +11,39 @@
11 11 id, module_id, occurrence_time, occupancy
12 12 </sql>
13 13 <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
14   - select
15   - <include refid="Base_Column_List" />
  14 + select
  15 + <include refid="Base_Column_List"/>
16 16 from sy_basic_resource_history
17 17 where id = #{id,jdbcType=VARCHAR}
18 18 </select>
  19 + <select id="getModuleInfoQueryByCondition" resultType="com.objecteye.entity.SyBasicResourceHistory">
  20 + select * from sy_basic_resource_history a
  21 + <where>
  22 + <if test="module != null and '' != module">
  23 + and a.module_id like '%' || #{module} || '%'
  24 + </if>
  25 + <if test="startTime != null"><![CDATA[
  26 + and a.occurrence_time >= #{startTime,jdbcType=BIGINT}
  27 + ]]></if>
  28 + <if test="endTime != null"><![CDATA[
  29 + and a.occurrence_time <= #{endTime,jdbcType=BIGINT}
  30 + ]]></if>
  31 + </where>
  32 + order by a.occurrence_time asc
  33 + </select>
19 34 <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
20   - delete from sy_basic_resource_history
  35 + delete
  36 + from sy_basic_resource_history
21 37 where id = #{id,jdbcType=VARCHAR}
22 38 </delete>
23 39 <delete id="deleteLteTime"><![CDATA[
24   - delete from sy_basic_resource_history where occurrence_time <= #{time,jdbcType=BIGINT}
25   - ]]></delete>
  40 + delete
  41 + from sy_basic_resource_history
  42 + where occurrence_time <= #{time,jdbcType=BIGINT}
  43 + ]]></delete>
26 44 <insert id="insert" parameterType="com.objecteye.entity.SyBasicResourceHistory">
27   - insert into sy_basic_resource_history (id, module_id, occurrence_time,
28   - occupancy)
  45 + insert into sy_basic_resource_history (id, module_id, occurrence_time,
  46 + occupancy)
29 47 values (#{id,jdbcType=VARCHAR}, #{moduleId,jdbcType=VARCHAR}, #{occurrenceTime,jdbcType=BIGINT},
30 48 #{occupancy,jdbcType=DOUBLE})
31 49 </insert>
... ...