From 4d27e0ed50934a81bd0738f2cc82b09ad40fd139 Mon Sep 17 00:00:00 2001 From: tomsun28 Date: Mon, 15 Nov 2021 16:36:49 +0800 Subject: [PATCH] =?UTF-8?q?[monitor]=20=E4=BF=AE=E6=94=B9=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=EF=BC=8C=E6=8E=A2=E6=B5=8B=E7=9B=91=E6=8E=A7=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=9B=91=E6=8E=A7=E6=8E=A5=E5=8F=A3=E7=BC=96?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/controller/MonitorController.java | 1 + .../java/com/usthe/manager/dao/ParamDao.java | 6 ++ .../service/impl/MonitorServiceImpl.java | 66 ++++++++++++++++++- .../support/GlobalExceptionHandler.java | 42 ++++++++++++ pom.xml | 4 +- 5 files changed, 114 insertions(+), 5 deletions(-) diff --git a/manager/src/main/java/com/usthe/manager/controller/MonitorController.java b/manager/src/main/java/com/usthe/manager/controller/MonitorController.java index 2e22ae7..2b55366 100644 --- a/manager/src/main/java/com/usthe/manager/controller/MonitorController.java +++ b/manager/src/main/java/com/usthe/manager/controller/MonitorController.java @@ -28,6 +28,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @Api(tags = "监控管理API") @RestController @RequestMapping(path = "/monitor", produces = {APPLICATION_JSON_VALUE}) +@Validated public class MonitorController { @Autowired diff --git a/manager/src/main/java/com/usthe/manager/dao/ParamDao.java b/manager/src/main/java/com/usthe/manager/dao/ParamDao.java index da70bac..87d03c1 100644 --- a/manager/src/main/java/com/usthe/manager/dao/ParamDao.java +++ b/manager/src/main/java/com/usthe/manager/dao/ParamDao.java @@ -18,4 +18,10 @@ public interface ParamDao extends JpaRepository { * @return 参数值列表 */ List findParamsByMonitorId(long monitorId); + + /** + * 根据监控ID删除与之关联的参数列表 + * @param monitorId 监控ID + */ + void deleteParamsByMonitorId(long monitorId); } diff --git a/manager/src/main/java/com/usthe/manager/service/impl/MonitorServiceImpl.java b/manager/src/main/java/com/usthe/manager/service/impl/MonitorServiceImpl.java index d133301..cc2dba2 100644 --- a/manager/src/main/java/com/usthe/manager/service/impl/MonitorServiceImpl.java +++ b/manager/src/main/java/com/usthe/manager/service/impl/MonitorServiceImpl.java @@ -2,6 +2,7 @@ package com.usthe.manager.service.impl; import com.usthe.common.entity.job.Configmap; import com.usthe.common.entity.job.Job; +import com.usthe.common.entity.message.CollectRep; import com.usthe.common.util.CommonConstants; import com.usthe.common.util.SnowFlakeIdGenerator; import com.usthe.manager.dao.MonitorDao; @@ -32,6 +33,8 @@ import java.util.stream.Collectors; @Slf4j public class MonitorServiceImpl implements MonitorService { + private static final Long MONITOR_ID_TMP = 1000000000L; + @Autowired private AppService appService; @@ -47,7 +50,19 @@ public class MonitorServiceImpl implements MonitorService { @Override @Transactional(readOnly = true) public void detectMonitor(Monitor monitor, List params) throws MonitorDetectException { - + Long monitorId = monitor.getId(); + if (monitorId == null || monitorId == 0) { + monitorId = MONITOR_ID_TMP; + } + Job appDefine = appService.getAppDefine(monitor.getApp()); + appDefine.setMonitorId(monitorId); + appDefine.setCyclic(false); + appDefine.setTimestamp(System.currentTimeMillis()); + List configmaps = params.stream().map(param -> + new Configmap(param.getField(), param.getValue(), param.getType())).collect(Collectors.toList()); + appDefine.setConfigmap(configmaps); + CollectRep collectRep = jobScheduling.addSyncCollectJob(appDefine); + // 判断探测结果 失败则抛出探测异常 } @Override @@ -95,12 +110,57 @@ public class MonitorServiceImpl implements MonitorService { @Override public void modifyMonitor(Monitor monitor, List params) throws RuntimeException { - + long monitorId = monitor.getId(); + // 查判断monitorId对应的此监控是否存在 + Optional queryOption = monitorDao.findById(monitorId); + if (!queryOption.isPresent()) { + throw new IllegalArgumentException("The Monitor " + monitorId + " not exists"); + } + Monitor preMonitor = queryOption.get(); + if (!preMonitor.getApp().equals(monitor.getApp()) || !preMonitor.getHost().equals(monitor.getHost())) { + // 监控的 类型和host不能修改 + throw new IllegalArgumentException("Can not modify monitor's app or host"); + } + // 构造采集任务Job实体 + Job appDefine = appService.getAppDefine(monitor.getApp()); + appDefine.setId(preMonitor.getJobId()); + appDefine.setMonitorId(monitorId); + appDefine.setInterval(monitor.getIntervals()); + appDefine.setCyclic(true); + appDefine.setTimestamp(System.currentTimeMillis()); + List configmaps = params.stream().map(param -> { + param.setMonitorId(monitorId); + param.setGmtCreate(null); + param.setGmtUpdate(null); + return new Configmap(param.getField(), param.getValue(), param.getType()); + }).collect(Collectors.toList()); + appDefine.setConfigmap(configmaps); + // 更新采集任务 + jobScheduling.updateAsyncCollectJob(appDefine); + // 下发更新成功后刷库 + try { + monitor.setJobId(preMonitor.getJobId()); + monitor.setStatus(preMonitor.getStatus()); + monitor.setGmtCreate(null); + monitor.setGmtUpdate(null); + monitorDao.save(monitor); + paramDao.saveAll(params); + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new MonitorDatabaseException(e.getMessage()); + } } @Override + @Transactional(rollbackFor = Exception.class) public void deleteMonitor(long id) throws RuntimeException { - + Optional monitorOptional = monitorDao.findById(id); + if (monitorOptional.isPresent()) { + Monitor monitor = monitorOptional.get(); + monitorDao.deleteById(id); + paramDao.deleteParamsByMonitorId(id); + jobScheduling.cancelAsyncCollectJob(monitor.getJobId()); + } } @Override diff --git a/manager/src/main/java/com/usthe/manager/support/GlobalExceptionHandler.java b/manager/src/main/java/com/usthe/manager/support/GlobalExceptionHandler.java index f0a45ff..3729142 100644 --- a/manager/src/main/java/com/usthe/manager/support/GlobalExceptionHandler.java +++ b/manager/src/main/java/com/usthe/manager/support/GlobalExceptionHandler.java @@ -8,14 +8,18 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DataAccessException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestControllerAdvice; +import java.lang.reflect.Field; + import static com.usthe.common.util.CommonConstants.DETECT_FAILED; import static com.usthe.common.util.CommonConstants.MONITOR_CONFLICT; +import static com.usthe.common.util.CommonConstants.PARAM_INVALID; /** * controller exception handler @@ -26,6 +30,15 @@ import static com.usthe.common.util.CommonConstants.MONITOR_CONFLICT; @Slf4j public class GlobalExceptionHandler { + private static Field detailMessage; + + static { + try { + detailMessage = Throwable.class.getDeclaredField("detailMessage"); + detailMessage.setAccessible(true); + } catch (Exception e) {} + } + /** * 处理探测失败 * @param exception 探测异常 @@ -50,6 +63,35 @@ public class GlobalExceptionHandler { return ResponseEntity.status(HttpStatus.CONFLICT).body(message); } + /** + * 处理参数错误的失败 + * @param exception 参数异常 + * @return response + */ + @ExceptionHandler(IllegalArgumentException.class) + @ResponseBody + ResponseEntity> handleIllegalArgumentException(IllegalArgumentException exception) { + Message message = Message.builder().msg(exception.getMessage()).code(PARAM_INVALID).build(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message); + } + + /** + * 处理请求参数错误的失败, 请求参数json映射body时出错 + * @param exception 参数映射body异常 + * @return response + */ + @ExceptionHandler(HttpMessageNotReadableException.class) + @ResponseBody + ResponseEntity> handleHttpMessageNotReadableException(HttpMessageNotReadableException exception) { + try { + Message message = Message.builder().msg((String) detailMessage.get(exception)).code(PARAM_INVALID).build(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message); + } catch (Exception e) { + Message message = Message.builder().msg(exception.getMessage()).code(PARAM_INVALID).build(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message); + } + } + /** * handler the exception thrown for data input verify diff --git a/pom.xml b/pom.xml index 41fec05..3480b4d 100644 --- a/pom.xml +++ b/pom.xml @@ -103,8 +103,8 @@ rulesets/java/ali-comment.xml rulesets/java/ali-concurrent.xml rulesets/java/ali-constant.xml - rulesets/java/ali-exception.xml - + + rulesets/java/ali-naming.xml rulesets/java/ali-oop.xml rulesets/java/ali-orm.xml