From ed523344e4f4949a185dea61e545313f403044a0 Mon Sep 17 00:00:00 2001 From: tomsun28 Date: Sun, 14 Nov 2021 14:02:00 +0800 Subject: [PATCH] =?UTF-8?q?[monitor]=20=E7=9B=91=E6=8E=A7=E5=A2=9E?= =?UTF-8?q?=E5=88=A0=E6=94=B9=E6=9F=A5=E6=8E=A5=E5=8F=A3=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CodeStandard.md | 6 + common/pom.xml | 6 + .../com/usthe/common/entity/dto/Message.java | 13 ++- .../usthe/common/util/CommonConstants.java | 30 +++++ .../manager/controller/MonitorController.java | 85 ++++++++++++++ .../com/usthe/manager/dao/MonitorDao.java | 14 +++ .../java/com/usthe/manager/dao/ParamDao.java | 11 ++ .../com/usthe/manager/dao/ParamDefineDao.java | 13 +++ .../usthe/manager/pojo/dto/MonitorDto.java | 39 +++++++ .../usthe/manager/pojo/entity/Monitor.java | 105 ++++++++++++++++++ .../usthe/manager/service/MonitorService.java | 64 +++++++++++ .../service/impl/MonitorServiceImpl.java | 50 +++++++++ .../support/GlobalExceptionHandler.java | 23 +++- .../exception/MonitorDetectException.java | 13 +++ manager/src/main/resources/db/schema.sql | 2 +- 15 files changed, 468 insertions(+), 6 deletions(-) create mode 100644 CodeStandard.md create mode 100644 common/src/main/java/com/usthe/common/util/CommonConstants.java create mode 100644 manager/src/main/java/com/usthe/manager/controller/MonitorController.java create mode 100644 manager/src/main/java/com/usthe/manager/dao/MonitorDao.java create mode 100644 manager/src/main/java/com/usthe/manager/dao/ParamDao.java create mode 100644 manager/src/main/java/com/usthe/manager/dao/ParamDefineDao.java create mode 100644 manager/src/main/java/com/usthe/manager/pojo/dto/MonitorDto.java create mode 100644 manager/src/main/java/com/usthe/manager/pojo/entity/Monitor.java create mode 100644 manager/src/main/java/com/usthe/manager/service/MonitorService.java create mode 100644 manager/src/main/java/com/usthe/manager/service/impl/MonitorServiceImpl.java create mode 100644 manager/src/main/java/com/usthe/manager/support/exception/MonitorDetectException.java diff --git a/CodeStandard.md b/CodeStandard.md new file mode 100644 index 0000000..304057d --- /dev/null +++ b/CodeStandard.md @@ -0,0 +1,6 @@ +# Code Standard + +- 0x00 : 成功 +- 0x01 : 参数校验失败 +- 0x02 : 探测失败 +- 0x03 : 监控不存在 \ No newline at end of file diff --git a/common/pom.xml b/common/pom.xml index f6d4bda..3a09fee 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -19,6 +19,12 @@ spring-boot-starter-web provided + + + io.springfox + springfox-boot-starter + provided + io.etcd diff --git a/common/src/main/java/com/usthe/common/entity/dto/Message.java b/common/src/main/java/com/usthe/common/entity/dto/Message.java index e3df0cc..fcad2e8 100644 --- a/common/src/main/java/com/usthe/common/entity/dto/Message.java +++ b/common/src/main/java/com/usthe/common/entity/dto/Message.java @@ -1,10 +1,14 @@ package com.usthe.common.entity.dto; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import static com.usthe.common.util.CommonConstants.SUCCESS; + /** * Unified message structure definition for front and back ends * @@ -20,21 +24,28 @@ import lombok.NoArgsConstructor; @Builder @AllArgsConstructor @NoArgsConstructor +@ApiModel(description = "公共消息包装") public class Message { /** * message body data */ + @ApiModelProperty(value = "响应数据", position = 0) private T data; /** * exception message when error happen or success message */ + @ApiModelProperty(value = "携带消息", position = 1) private String msg; /** * response code, not http code */ - private Integer code; + @ApiModelProperty(value = "携带编码", position = 2) + private byte code = SUCCESS; + public Message(String msg) { + this.msg = msg; + } } diff --git a/common/src/main/java/com/usthe/common/util/CommonConstants.java b/common/src/main/java/com/usthe/common/util/CommonConstants.java new file mode 100644 index 0000000..0135d5e --- /dev/null +++ b/common/src/main/java/com/usthe/common/util/CommonConstants.java @@ -0,0 +1,30 @@ +package com.usthe.common.util; + +/** + * 公共常量 + * @author tomsun28 + * @date 2021/11/14 12:06 + */ +public interface CommonConstants { + + /** + * 成功 + */ + byte SUCCESS = 0x00; + + /** + * 参数校验失败 + */ + byte PARAM_INVALID = 0x01; + + /** + * 探测失败 + */ + byte DETECT_FAILED = 0x02; + + /** + * 监控不存在 + */ + byte MONITOR_NOT_EXIST = 0x03; + +} diff --git a/manager/src/main/java/com/usthe/manager/controller/MonitorController.java b/manager/src/main/java/com/usthe/manager/controller/MonitorController.java new file mode 100644 index 0000000..8436e3a --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/controller/MonitorController.java @@ -0,0 +1,85 @@ +package com.usthe.manager.controller; + +import com.usthe.common.entity.dto.Message; +import com.usthe.manager.pojo.dto.MonitorDto; +import com.usthe.manager.service.MonitorService; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static com.usthe.common.util.CommonConstants.MONITOR_NOT_EXIST; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +/** + * 监控管理API + * @author tomsun28 + * @date 2021/11/14 10:57 + */ +@Api(tags = "监控管理接口") +@RestController +@RequestMapping(path = "/monitor", consumes = {APPLICATION_JSON_VALUE}, produces = {APPLICATION_JSON_VALUE}) +public class MonitorController { + + @Autowired + private MonitorService monitorService; + + @PostMapping + public ResponseEntity> addNewMonitor(@RequestBody MonitorDto monitorDto) { + // 校验请求数据 + monitorService.validate(monitorDto, false); + if (monitorDto.isDetected()) { + // 进行探测 + monitorService.detectMonitor(monitorDto.getMonitor(), monitorDto.getParams()); + } + monitorService.addMonitor(monitorDto.getMonitor(), monitorDto.getParams()); + return ResponseEntity.ok().build(); + } + + @PutMapping + public ResponseEntity> modifyMonitor(@RequestBody MonitorDto monitorDto) { + // 校验请求数据 + monitorService.validate(monitorDto, true); + if (monitorDto.isDetected()) { + // 进行探测 + monitorService.detectMonitor(monitorDto.getMonitor(), monitorDto.getParams()); + } + monitorService.modifyMonitor(monitorDto.getMonitor(), monitorDto.getParams()); + return ResponseEntity.ok(new Message<>("Modify success")); + } + + @GetMapping(path = "/{id}") + public ResponseEntity> getMonitor(@PathVariable("id") long id) { + // 获取监控信息 + MonitorDto monitorDto = monitorService.getMonitor(id); + Message.MessageBuilder messageBuilder = Message.builder(); + if (monitorDto == null) { + messageBuilder.code(MONITOR_NOT_EXIST).msg("Monitor not exist."); + } else { + messageBuilder.data(monitorDto); + } + return ResponseEntity.ok(messageBuilder.build()); + } + + @DeleteMapping(path = "/{id}") + public ResponseEntity> deleteMonitor(@PathVariable("id") long id) { + // 删除监控,监控不存在或删除成功都返回成功 + monitorService.deleteMonitor(id); + return ResponseEntity.ok(new Message<>("Delete success")); + } + + @PostMapping(path = "/detect") + public ResponseEntity> detectMonitor(@RequestBody MonitorDto monitorDto) { + monitorService.validate(monitorDto, false); + monitorService.detectMonitor(monitorDto.getMonitor(), monitorDto.getParams()); + return ResponseEntity.ok(new Message<>("Detect success.")); + } + +} diff --git a/manager/src/main/java/com/usthe/manager/dao/MonitorDao.java b/manager/src/main/java/com/usthe/manager/dao/MonitorDao.java new file mode 100644 index 0000000..d5ec6a6 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/dao/MonitorDao.java @@ -0,0 +1,14 @@ +package com.usthe.manager.dao; + +import org.springframework.data.jpa.repository.JpaRepository; +import sun.security.util.AuthResources; + +/** + * AuthResources 数据库操作 + * @author tomsun28 + * @date 2021/11/14 11:24 + */ +public interface MonitorDao extends JpaRepository { + + +} diff --git a/manager/src/main/java/com/usthe/manager/dao/ParamDao.java b/manager/src/main/java/com/usthe/manager/dao/ParamDao.java new file mode 100644 index 0000000..5c10033 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/dao/ParamDao.java @@ -0,0 +1,11 @@ +package com.usthe.manager.dao; + +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * ParamDao 数据库操作 + * @author tomsun28 + * @date 2021/11/14 11:26 + */ +public interface ParamDao extends JpaRepository { +} diff --git a/manager/src/main/java/com/usthe/manager/dao/ParamDefineDao.java b/manager/src/main/java/com/usthe/manager/dao/ParamDefineDao.java new file mode 100644 index 0000000..6ed0d7d --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/dao/ParamDefineDao.java @@ -0,0 +1,13 @@ +package com.usthe.manager.dao; + +import com.usthe.manager.pojo.entity.ParamDefine; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * ParamDefine数据库操作 + * @author tomsun28 + * @date 2021/11/14 11:27 + */ +public interface ParamDefineDao extends JpaRepository { + +} diff --git a/manager/src/main/java/com/usthe/manager/pojo/dto/MonitorDto.java b/manager/src/main/java/com/usthe/manager/pojo/dto/MonitorDto.java new file mode 100644 index 0000000..e8da94c --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/pojo/dto/MonitorDto.java @@ -0,0 +1,39 @@ +package com.usthe.manager.pojo.dto; + +import com.usthe.manager.pojo.entity.Monitor; +import com.usthe.manager.pojo.entity.Param; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE; + +/** + * 监控信息对外交互实体 + * @author tomsun28 + * @date 2021/11/14 10:13 + */ +@Data +@ApiModel(description = "监控信息实体") +public class MonitorDto { + + /** + * 监控实体 + */ + @ApiModelProperty(value = "监控实体", accessMode = READ_WRITE, position = 0) + private Monitor monitor; + + /** + * 参数 + */ + @ApiModelProperty(value = "监控参数", accessMode = READ_WRITE, position = 1) + private List params; + + /** + * 是否探测 + */ + @ApiModelProperty(value = "是否进行探测", accessMode = READ_WRITE, position = 2) + private boolean detected; +} diff --git a/manager/src/main/java/com/usthe/manager/pojo/entity/Monitor.java b/manager/src/main/java/com/usthe/manager/pojo/entity/Monitor.java new file mode 100644 index 0000000..4f30281 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/pojo/entity/Monitor.java @@ -0,0 +1,105 @@ +package com.usthe.manager.pojo.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.time.LocalDateTime; + +import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY; +import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE; + +/** + * 监控实体 + * @author tomsun28 + * @date 2021/11/14 9:53 + */ +@Entity +@Table(name = "monitor") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(description = "监控实体") +public class Monitor { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @ApiModelProperty(value = "监控ID", example = "87584674384", accessMode = READ_ONLY, position = 0) + private Long id; + + /** + * 监控对应下发的任务ID + */ + @ApiModelProperty(value = "任务ID", example = "43243543543", accessMode = READ_ONLY, position = 1) + private Long jobId; + + /** + * 监控的名称 + */ + @ApiModelProperty(value = "监控名称", example = "Api-bing.com", accessMode = READ_WRITE, position = 2) + private String name; + + /** + * 监控的类型:linux,mysql,jvm... + */ + @ApiModelProperty(value = "监控类型", example = "api", accessMode = READ_WRITE, position = 3) + private String app; + + /** + * 监控的对端host:ipv4,ipv6,域名 + */ + @ApiModelProperty(value = "监控的对端host", example = "192.167.25.11", accessMode = READ_WRITE, position = 4) + private String host; + + /** + * 监控的采集间隔时间,单位秒 + */ + @ApiModelProperty(value = "监控的采集间隔时间,单位秒", example = "600", accessMode = READ_WRITE, position = 5) + private Integer intervals; + + /** + * 监控状态 0:未监控,1:可用,2:不可用,3:不可达,4:挂起 + */ + @ApiModelProperty(value = "监控状态 0:未监控,1:可用,2:不可用,3:不可达,4:挂起", example = "1", accessMode = READ_WRITE, position = 6) + private byte status; + + /** + * 监控备注描述 + */ + @ApiModelProperty(value = "监控备注描述", example = "对搜索网站bing的可用性监控", accessMode = READ_WRITE, position = 7) + private String description; + + /** + * 此条记录创建者 + */ + @ApiModelProperty(value = "此条记录创建者", example = "tom", accessMode = READ_ONLY, position = 8) + private String creator; + + /** + * 此条记录最新修改者 + */ + @ApiModelProperty(value = "此条记录最新修改者", example = "tom", accessMode = READ_ONLY, position = 9) + private String modifier; + + /** + * 记录创建时间 + */ + @ApiModelProperty(value = "记录创建时间(毫秒时间戳)", example = "1612198922000", accessMode = READ_ONLY, position = 10) + private LocalDateTime gmtCreate; + + /** + * 记录最新修改时间 + */ + @ApiModelProperty(value = "记录最新修改时间(毫秒时间戳)", example = "1612198444000", accessMode = READ_ONLY, position = 11) + private LocalDateTime gmtUpdate; + +} diff --git a/manager/src/main/java/com/usthe/manager/service/MonitorService.java b/manager/src/main/java/com/usthe/manager/service/MonitorService.java new file mode 100644 index 0000000..1031f54 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/service/MonitorService.java @@ -0,0 +1,64 @@ +package com.usthe.manager.service; + +import com.usthe.manager.pojo.dto.MonitorDto; +import com.usthe.manager.pojo.entity.Monitor; +import com.usthe.manager.pojo.entity.Param; +import com.usthe.manager.support.exception.MonitorDetectException; + +import java.util.List; + +/** + * 监控管理服务 + * @author tomsun28 + * @date 2021/11/14 11:28 + */ +public interface MonitorService { + + + /** + * 监控可用性探测 + * @param monitor 监控实体信息 + * @param params 参数信息 + * @throws MonitorDetectException 探测失败抛出 + */ + void detectMonitor(Monitor monitor, List params) throws MonitorDetectException; + + /** + * 新增监控 + * @param monitor 监控实体 + * @param params 参数信息 + * @throws RuntimeException 新增过程异常抛出 + */ + void addMonitor(Monitor monitor, List params) throws RuntimeException; + + /** + * 校验请求数据参数正确性 + * @param monitorDto monitorDto + * @param isModify 是否是修改监控 + * @throws IllegalArgumentException 校验参数错误抛出 + */ + void validate(MonitorDto monitorDto, boolean isModify) throws IllegalArgumentException; + + /** + * 修改更新监控 + * @param monitor 监控实体 + * @param params 参数信息 + * @throws RuntimeException 修改过程中异常抛出 + */ + void modifyMonitor(Monitor monitor, List params) throws RuntimeException; + + /** + * 删除监控 + * @param id 监控ID + * @throws RuntimeException 删除过程中异常抛出 + */ + void deleteMonitor(long id) throws RuntimeException; + + /** + * 获取监控信息 + * @param id 监控ID + * @return MonitorDto + * @throws RuntimeException 查询过程中异常抛出 + */ + MonitorDto getMonitor(long id) throws RuntimeException; +} 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 new file mode 100644 index 0000000..d564a86 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/service/impl/MonitorServiceImpl.java @@ -0,0 +1,50 @@ +package com.usthe.manager.service.impl; + +import com.usthe.manager.pojo.dto.MonitorDto; +import com.usthe.manager.pojo.entity.Monitor; +import com.usthe.manager.pojo.entity.Param; +import com.usthe.manager.service.MonitorService; +import com.usthe.manager.support.exception.MonitorDetectException; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 监控管理服务实现 + * @author tomsun28 + * @date 2021/11/14 13:06 + */ +@Service +public class MonitorServiceImpl implements MonitorService { + + + @Override + public void detectMonitor(Monitor monitor, List params) throws MonitorDetectException { + + } + + @Override + public void addMonitor(Monitor monitor, List params) throws RuntimeException { + + } + + @Override + public void validate(MonitorDto monitorDto, boolean isModify) throws IllegalArgumentException { + + } + + @Override + public void modifyMonitor(Monitor monitor, List params) throws RuntimeException { + + } + + @Override + public void deleteMonitor(long id) throws RuntimeException { + + } + + @Override + public MonitorDto getMonitor(long id) throws RuntimeException { + return null; + } +} 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 8ee41f3..5d363fa 100644 --- a/manager/src/main/java/com/usthe/manager/support/GlobalExceptionHandler.java +++ b/manager/src/main/java/com/usthe/manager/support/GlobalExceptionHandler.java @@ -2,6 +2,7 @@ package com.usthe.manager.support; import com.usthe.common.entity.dto.Message; +import com.usthe.manager.support.exception.MonitorDetectException; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DataAccessException; import org.springframework.http.HttpStatus; @@ -12,6 +13,8 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestControllerAdvice; +import static com.usthe.common.util.CommonConstants.DETECT_FAILED; + /** * controller exception handler * @author tomsun28 @@ -21,6 +24,18 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; @Slf4j public class GlobalExceptionHandler { + /** + * 处理探测失败 + * @param exception 探测异常 + * @return response + */ + @ExceptionHandler(MonitorDetectException.class) + @ResponseBody + ResponseEntity> handleMonitorDetectException(MonitorDetectException exception) { + Message message = Message.builder().msg(exception.getMessage()).code(DETECT_FAILED).build(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message); + } + /** * handler the exception thrown for data input verify * @param exception data input verify exception @@ -28,7 +43,7 @@ public class GlobalExceptionHandler { */ @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody - ResponseEntity handleInputValidException(MethodArgumentNotValidException exception) { + ResponseEntity> handleInputValidException(MethodArgumentNotValidException exception) { StringBuffer errorMessage = new StringBuffer(); if (exception != null) { exception.getBindingResult().getAllErrors().forEach(error -> @@ -37,7 +52,7 @@ public class GlobalExceptionHandler { if (log.isDebugEnabled()) { log.debug("[sample-tom]-[input argument not valid happen]-{}", errorMessage, exception); } - Message message = Message.builder().msg(errorMessage.toString()).build(); + Message message = Message.builder().msg(errorMessage.toString()).build(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message); } @@ -48,13 +63,13 @@ public class GlobalExceptionHandler { */ @ExceptionHandler(DataAccessException.class) @ResponseBody - ResponseEntity handleDataAccessException(DataAccessException exception) { + ResponseEntity> handleDataAccessException(DataAccessException exception) { String errorMessage = "database error happen"; if (exception != null) { errorMessage = exception.getMessage(); } log.warn("[sample-tom]-[database error happen]-{}", errorMessage, exception); - Message message = Message.builder().msg(errorMessage).build(); + Message message = Message.builder().msg(errorMessage).build(); return ResponseEntity.status(HttpStatus.CONFLICT).body(message); } diff --git a/manager/src/main/java/com/usthe/manager/support/exception/MonitorDetectException.java b/manager/src/main/java/com/usthe/manager/support/exception/MonitorDetectException.java new file mode 100644 index 0000000..b489a29 --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/support/exception/MonitorDetectException.java @@ -0,0 +1,13 @@ +package com.usthe.manager.support.exception; + +/** + * 探测失败异常 + * @author tomsun28 + * @date 2021/11/14 12:19 + */ +public class MonitorDetectException extends RuntimeException { + + public MonitorDetectException(String message) { + super(message); + } +} diff --git a/manager/src/main/resources/db/schema.sql b/manager/src/main/resources/db/schema.sql index b90f07f..3143151 100644 --- a/manager/src/main/resources/db/schema.sql +++ b/manager/src/main/resources/db/schema.sql @@ -7,7 +7,7 @@ DROP TABLE IF EXISTS monitor ; CREATE TABLE monitor ( id bigint not null auto_increment comment '监控ID', - jobId bigint not null comment '监控对应下发的任务ID', + job_id bigint not null comment '监控对应下发的任务ID', name varchar(100) not null comment '监控的名称', app varchar(100) not null comment '监控的类型:linux,mysql,jvm...', host varchar(100) not null comment '监控的对端host:ipv4,ipv6,域名',