diff --git a/common/pom.xml b/common/pom.xml
index 3a09fee..9a1b193 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -43,5 +43,10 @@
gson
2.8.8
+
+ com.google.protobuf
+ protobuf-java-util
+ 3.19.1
+
\ No newline at end of file
diff --git a/common/src/main/java/com/usthe/common/entity/job/Job.java b/common/src/main/java/com/usthe/common/entity/job/Job.java
index 719a6dd..a9338a6 100644
--- a/common/src/main/java/com/usthe/common/entity/job/Job.java
+++ b/common/src/main/java/com/usthe/common/entity/job/Job.java
@@ -1,6 +1,8 @@
package com.usthe.common.entity.job;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.usthe.common.entity.message.CollectRep;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -67,6 +69,7 @@ public class Job {
/**
* collector使用 - 任务版本,此字段不存储于etcd
*/
+ @JsonIgnore
private transient long version;
/**
* collector使用 - 指标组任务执行优先级视图
@@ -78,10 +81,17 @@ public class Job {
* 126 - otherMetrics
* 127 - lastPriorMetrics
*/
+ @JsonIgnore
private transient List> priorMetrics;
/**
- * collector使用 - 构造初始化指标组
+ * collector使用 - 临时存储一次性任务指标组响应数据
+ */
+ @JsonIgnore
+ private transient List metricsDataTemps;
+
+ /**
+ * collector使用 - 构造初始化指标组执行视图
*/
public synchronized void constructPriorMetrics() {
Map> map = metrics.stream()
@@ -155,4 +165,11 @@ public class Job {
return Collections.emptySet();
}
}
+
+ public void addCollectMetricsData(CollectRep.MetricsData metricsData) {
+ if (metricsDataTemps == null) {
+ metricsDataTemps = new LinkedList<>();
+ }
+ metricsDataTemps.add(metricsData);
+ }
}
diff --git a/common/src/main/java/com/usthe/common/util/ProtoJsonUtil.java b/common/src/main/java/com/usthe/common/util/ProtoJsonUtil.java
new file mode 100644
index 0000000..ded1dca
--- /dev/null
+++ b/common/src/main/java/com/usthe/common/util/ProtoJsonUtil.java
@@ -0,0 +1,45 @@
+package com.usthe.common.util;
+
+import com.google.protobuf.Message;
+import com.google.protobuf.MessageOrBuilder;
+import com.google.protobuf.util.JsonFormat;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * protobuf json相互转换工具类
+ * @author tomsun28
+ * @date 2021/11/16 12:16
+ */
+@Slf4j
+public class ProtoJsonUtil {
+
+ /**
+ * protobuf 转 json
+ * @param proto protobuf
+ * @return json
+ */
+ public static String toJsonStr(Message proto) {
+ try {
+ return JsonFormat.printer().print(proto);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ return null;
+ }
+ }
+
+ /**
+ * json转protobuf
+ * @param json json str
+ * @param builder proto instance builder
+ * @return protobuf
+ */
+ public static Message toProtobuf(String json, Message.Builder builder) {
+ try {
+ JsonFormat.parser().merge(json, builder);
+ return builder.build();
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ return null;
+ }
+ }
+}
diff --git a/manager/pom.xml b/manager/pom.xml
index 1fb27c5..211832f 100644
--- a/manager/pom.xml
+++ b/manager/pom.xml
@@ -39,6 +39,12 @@
spring-boot-configuration-processor
true
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ 3.0.5
+
org.springframework.boot
diff --git a/manager/src/main/java/com/usthe/manager/Manager.java b/manager/src/main/java/com/usthe/manager/Manager.java
index 2b95f0e..79e9b91 100644
--- a/manager/src/main/java/com/usthe/manager/Manager.java
+++ b/manager/src/main/java/com/usthe/manager/Manager.java
@@ -2,6 +2,7 @@ package com.usthe.manager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @author tomsun28
@@ -9,6 +10,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
*/
@SpringBootApplication
+@EnableFeignClients(basePackages = {"com.usthe"})
public class Manager {
public static void main(String[] args) {
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 2b55366..c193163 100644
--- a/manager/src/main/java/com/usthe/manager/controller/MonitorController.java
+++ b/manager/src/main/java/com/usthe/manager/controller/MonitorController.java
@@ -7,7 +7,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
-import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -17,6 +16,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import javax.validation.Valid;
+
import static com.usthe.common.util.CommonConstants.MONITOR_NOT_EXIST;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
@@ -28,7 +29,6 @@ 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
@@ -36,7 +36,7 @@ public class MonitorController {
@PostMapping
@ApiOperation(value = "新增监控", notes = "新增一个监控应用")
- public ResponseEntity> addNewMonitor(@Validated @RequestBody MonitorDto monitorDto) {
+ public ResponseEntity> addNewMonitor(@Valid @RequestBody MonitorDto monitorDto) {
// 校验请求数据
monitorService.validate(monitorDto, false);
if (monitorDto.getDetected()) {
@@ -49,7 +49,7 @@ public class MonitorController {
@PutMapping
@ApiOperation(value = "修改监控", notes = "修改一个已存在监控应用")
- public ResponseEntity> modifyMonitor(@Validated @RequestBody MonitorDto monitorDto) {
+ public ResponseEntity> modifyMonitor(@Valid @RequestBody MonitorDto monitorDto) {
// 校验请求数据
monitorService.validate(monitorDto, true);
if (monitorDto.getDetected()) {
@@ -84,7 +84,7 @@ public class MonitorController {
@PostMapping(path = "/detect")
@ApiOperation(value = "探测监控", notes = "根据监控信息去对此监控进行可用性探测")
- public ResponseEntity> detectMonitor(@Validated @RequestBody MonitorDto monitorDto) {
+ public ResponseEntity> detectMonitor(@Valid @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/pojo/dto/MonitorDto.java b/manager/src/main/java/com/usthe/manager/pojo/dto/MonitorDto.java
index cc128b7..8ddb749 100644
--- a/manager/src/main/java/com/usthe/manager/pojo/dto/MonitorDto.java
+++ b/manager/src/main/java/com/usthe/manager/pojo/dto/MonitorDto.java
@@ -5,7 +5,9 @@ import com.usthe.manager.pojo.entity.Param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import org.springframework.validation.annotation.Validated;
+import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
@@ -25,6 +27,7 @@ public class MonitorDto {
*/
@ApiModelProperty(value = "监控实体", accessMode = READ_WRITE, position = 0)
@NotNull
+ @Valid
private Monitor monitor;
/**
@@ -32,6 +35,7 @@ public class MonitorDto {
*/
@ApiModelProperty(value = "监控参数", accessMode = READ_WRITE, position = 1)
@NotNull
+ @Valid
private List params;
/**
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 cc2dba2..799525c 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
@@ -61,8 +61,11 @@ public class MonitorServiceImpl implements MonitorService {
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);
+ List collectRep = jobScheduling.addSyncCollectJob(appDefine);
// 判断探测结果 失败则抛出探测异常
+ if (collectRep == null || collectRep.isEmpty() || collectRep.get(0).getCode() != CollectRep.Code.SUCCESS) {
+ throw new MonitorDetectException(collectRep.get(0).getMsg());
+ }
}
@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 3729142..a0ee3ff 100644
--- a/manager/src/main/java/com/usthe/manager/support/GlobalExceptionHandler.java
+++ b/manager/src/main/java/com/usthe/manager/support/GlobalExceptionHandler.java
@@ -9,12 +9,16 @@ import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
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 javax.validation.ConstraintViolationException;
+import javax.validation.ValidationException;
import java.lang.reflect.Field;
import static com.usthe.common.util.CommonConstants.DETECT_FAILED;
@@ -32,10 +36,14 @@ public class GlobalExceptionHandler {
private static Field detailMessage;
+ private static Field fieldErrorField;
+
static {
try {
detailMessage = Throwable.class.getDeclaredField("detailMessage");
detailMessage.setAccessible(true);
+ fieldErrorField = FieldError.class.getDeclaredField("field");
+ fieldErrorField.setAccessible(true);
} catch (Exception e) {}
}
@@ -95,19 +103,32 @@ public class GlobalExceptionHandler {
/**
* handler the exception thrown for data input verify
- * @param exception data input verify exception
+ * valid注解校验框架校验异常统一处理
+ * @param e data input verify exception
* @return response
*/
- @ExceptionHandler(MethodArgumentNotValidException.class)
+ @ExceptionHandler({MethodArgumentNotValidException.class, BindException.class})
@ResponseBody
- ResponseEntity> handleInputValidException(MethodArgumentNotValidException exception) {
+ ResponseEntity> handleInputValidException(Exception e) {
StringBuffer errorMessage = new StringBuffer();
- if (exception != null) {
- exception.getBindingResult().getAllErrors().forEach(error ->
- errorMessage.append(error.getDefaultMessage()).append("."));
+ if (e instanceof MethodArgumentNotValidException) {
+ MethodArgumentNotValidException exception = (MethodArgumentNotValidException)e;
+ exception.getBindingResult().getAllErrors().forEach(error -> {
+ try {
+ String field = (String) fieldErrorField.get(error);
+ errorMessage.append(field).append(":").append(error.getDefaultMessage()).append("||");
+ } catch (Exception e1) {
+ errorMessage.append(error.getDefaultMessage()).append("||");
+ }
+ });
+ } else if (e instanceof BindException) {
+ BindException exception = (BindException)e;
+ exception.getAllErrors().forEach(error -> {
+ errorMessage.append(error.getDefaultMessage()).append("||");
+ });
}
if (log.isDebugEnabled()) {
- log.debug("[sample-tom]-[input argument not valid happen]-{}", errorMessage, exception);
+ log.debug("[input argument not valid happen]-{}", errorMessage, e);
}
Message message = Message.builder().msg(errorMessage.toString()).build();
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(message);
@@ -125,7 +146,7 @@ public class GlobalExceptionHandler {
if (exception != null) {
errorMessage = exception.getMessage();
}
- log.warn("[sample-tom]-[database error happen]-{}", errorMessage, exception);
+ log.warn("[database error happen]-{}", errorMessage, exception);
Message message = Message.builder().msg(errorMessage).build();
return ResponseEntity.status(HttpStatus.CONFLICT).body(message);
}
@@ -137,13 +158,13 @@ public class GlobalExceptionHandler {
*/
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseBody
- ResponseEntity handleMethodNotSupportException(HttpRequestMethodNotSupportedException exception) {
+ ResponseEntity> handleMethodNotSupportException(HttpRequestMethodNotSupportedException exception) {
String errorMessage = "Request method not supported";
if (exception != null && exception.getMessage() != null) {
errorMessage = exception.getMessage();
}
log.info("[monitor]-[Request method not supported]-{}", errorMessage);
- Message message = Message.builder().msg(errorMessage).build();
+ Message message = Message.builder().msg(errorMessage).build();
return ResponseEntity.status(HttpStatus.METHOD_NOT_ALLOWED).body(message);
}
@@ -154,13 +175,13 @@ public class GlobalExceptionHandler {
*/
@ExceptionHandler(Exception.class)
@ResponseBody
- ResponseEntity handleUnknownException(Exception exception) {
+ ResponseEntity> handleUnknownException(Exception exception) {
String errorMessage = "unknown error happen";
if (exception != null) {
errorMessage = exception.getMessage();
}
log.error("[monitor]-[unknown 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);
}