【问题标题】:Java Micrometer @Counted - exception="none" and result="success" for @ExceptionHandler?Java Micrometer @Counted - @ExceptionHandler 的 exception="none" 和 result="success"?
【发布时间】:2021-07-15 12:44:10
【问题描述】:

请快速提问关于带有@Counted 和@ExceptionHandler 的Java Micrometer。

我有一个非常简单的@ExceptionHandler:

    @ExceptionHandler
    @Counted(value = "MY_EXCEPTION", description = "SOME_DESCRIPTION")
    public Mono<ResponseEntity<String>> myCoolExceptionHandler(final RuntimeException runtimeException) {
        System.err.println("an exception!" + runtimeException);
        return Mono.just("bad");
    }

我认为这种组合非常有趣,因为它可以让您了解发生的异常情况。我们可以构建仪表板、警报等,非常酷。

不幸的是,当我查看生成的指标时,它是这样的:

# HELP MY_EXCEPTION_total SOME_DESCRIPTION
# TYPE MY_EXCEPTION_total counter
MY_EXCEPTION_total{class="package.MyController",exception="none",method="myCoolExceptionHandler",result="success",} 3.0

我对 exception="none"result="success"

感到很困惑

请问这些值最初是如何进入指标的?

还有,如何把它们改成更有意义的东西,比如异常类?

谢谢!

【问题讨论】:

  • 猜测:您的处理程序不会抛出异常,因此 @Counted 永远不会记录异常。如果将throw new RuntimeException("see?") 添加到处理程序的主体中,您将获得带有标签exception="RuntimeException" 的指标
  • 谢谢@knittl。这正是我想要问的。我的处理程序确实抛出了异常。我看到这个数字是正确的。在我的示例中,我抛出了 3 个异常,并获得了正确的值 3.0。你也是对的,我的处理程序确实抛出了 RuntimeException,这就是为什么,我排除了exception="RuntimeException"!但是得到了 exception="none" 和 result="success"
  • 您问题中显示的处理程序不会引发任何异常。如果它没有抛出异常,那么显然异常标签/标记的值将是“无”。问题到底是什么?处理程序本身成功,异常已经在别处抛出
  • 没错。请问如何将异常=“none”的值改成其他地方抛出的异常?
  • 但它不必是不同的指标。只需使用与注释中相同的参数,您不会注意到生成的指标名称/标签和值有任何差异

标签: java spring-boot spring-micrometer


【解决方案1】:

注解的方法本身不会抛出异常,总是正常完成。因此,注解安装的拦截代码永远不会记录异常(exception=none),结果总是好的(result=success)。只有从带注释的方法中抛出的异常才会被记录为错误结果。

您始终可以通过注入 MetricRegistry 然后使用适当的名称和标签注册指标来手动记录指标。

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 2019-09-08
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2015-11-14
    相关资源
    最近更新 更多