java Sping Boot 控制器验证指标

ldxq2e6h  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(138)

我正在使用Sping Boot 3,通过Controller方法进行starter验证/ Jakarta验证,以及@Valid@Validated注解,并使用执行器进行指标。
有很多免费指标的“Spring Magic”,有很多这样的Sping Boot 库。
我想知道,在spring Boot 3 / spring boot starter validation中是否有一个默认可用的指标,在那里我可以看到由于json序列化或验证错误而被拒绝的请求数量(400错误)的指标?
基本上,我需要一个发生的400个错误的指标,其中请求由于验证错误或序列化错误而从未进入控制器。这与进入控制器的请求不同,然后由于域级验证错误而手动返回400。
我尝试过的:

  • 启动应用程序并通过localhost:8080/metrics查找验证指标。(看不到任何)
  • 检查执行器文件

如果默认情况下这是不可用的,我可以添加一个钩子到API级别验证失败的代码中,以便我可以增加我自己的指标吗?
感谢您帮助我们找到现有的/免费的spring Boot 指标,或者如何为此用例添加一个。

vngu2lb8

vngu2lb81#

据我所知,默认情况下没有这样的指标,但您可以创建自己的指标,如下所示:

@Component
public class FailedRequestsCounter {
  private final Counter counter;

  public FailedRequestsCounter(MeterRegistry registry) {
    counter = Counter.builder("failed_requests.count")
        .description("Number of requests failed due to json serialization or validation error.")
        .register(registry);
  }

  public void increment(){
    counter.increment();
  }
}

FailedRequestsCounter组件应用于在处理由验证和序列化错误引起的异常时递增计数器。理想情况下,您应该有一个全局处理异常的@ControllerAdvice,例如:

@ControllerAdvice
public class GlobalExceptionHandler {
  @Autowired
  private FailedRequestsCounter failedRequestsCounter;

  // Validation errors - RequestParam
  @ExceptionHandler(ConstraintViolationException.class)
  ResponseEntity<String> handleConstraintViolationException(ConstraintViolationException e) {
    failedRequestsCounter.increment();
    return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
  }

  // Validation errors - RequestBody and PathVariable
  @ExceptionHandler(MethodArgumentNotValidException.class)
  ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
    failedRequestsCounter.increment();
    return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
  }

  // Serialization errors
  @ExceptionHandler(HttpMessageNotReadableException.class)
  ResponseEntity<String> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
    failedRequestsCounter.increment();
    return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
  }
}

相关问题