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,域名',