Commit 20fe6d5213f95f72bfa4bee5a0544e492ed99b34
1 parent
4ba5b210
jar包运维功能测试;
添加GPU监控功能(暂时只支持NVIDIA显卡);
Showing
8 changed files
with
149 additions
and
26 deletions
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> | ... | ... |