当前位置: 首页 > 知识库问答 >
问题:

微文件度量-计算引发的异常数不起作用

宦源
2023-03-14

我有一个使用Quarkus开发的java REST服务。

现在,我尝试使用Quarkus metrics实现支持的微文件指标向服务添加一些指标。

我的目标是使用计数器度量来计算应用程序中抛出的异常数量。

因此,我添加了所需的注释来标记Exception(我已经实现了一个自定义异常)构造函数以注册为Counted指标。目前,我的代码如下所示。

public class MyException extends RuntimeException {

   @Counted(name = "errorCounterMetric", description = "Meter metric for exception description")
   public MyException(final String errorMsg, final Throwable exception) {
      super(errorMsg, exception);
   }

}

因此,每次调用上述异常构造器时,相关的计数器度量也应增加1。

然而,问题是,无论引发异常的次数如何,微文件度量endpoint始终将上述度量的值显示为0。

有人能帮我理解这里的问题吗,或者是否有更好的方法来实现同样的结果?

共有1个答案

倪振海
2023-03-14

在Quarkus中,@Counted注释被实现为CDI(上下文和依赖注入)拦截器。它要求带注释的对象是托管bean(这样它就可以包装在代理对象中以允许拦截方法调用)。

异常通常不是bean(并且您通常不希望使用CDIBean生命周期创建/管理异常)。如果我尝试您的示例,CDI需要更多信息,以便能够构建被拦截的bean(这显然不是您的意图):

Caused by: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type java.lang.String and qualifiers [@Default]
        - java member: ....CountedException#<init>()
        - declared on CLASS bean [types=[java.io.Serializable, java.lang.Exception, java.lang.Throwable, ....CountedException, java.lang.RuntimeException, java.lang.Object], qualifiers=[@Default, @Any], target=....CountedException]

我相信您想要做的只是计算这种异常被创建了多少次。为此,您应该跳过尝试使用注释,直接使用计数器,例如使用测微计延伸:

public class CountedException extends RuntimeException {
    public CountedException(final String errorMsg, final Throwable exception) {
        super(errorMsg, exception);
        Metrics.counter("errorCounterMetric").increment();
    }
}

使用MP指标类似:

public class CountedException extends RuntimeException {
    public CountedException(final String errorMsg, final Throwable exception) {
        super(errorMsg, exception);
        MetricRegistries.get(Type.APPLICATION).counter("errorCounterMetric").inc();
    }
}

同样的结果,但可以避免对bean的生命周期混淆。

有趣的是,这将允许您记录有关创建这些异常的原因的更多信息。

例如(也使用测微计命名约定):

public class CountedException extends RuntimeException {
    public CountedException(final String errorMsg, final Throwable exception) {
        super(errorMsg, exception);
        String cause = exception == null ? "null" : exception.getClass().getSimpleName();
        Metrics.counter("error.counter.metric", "cause", cause).increment();
    }
}

或MP指标:

public class CountedException extends RuntimeException {
    public CountedException(final String errorMsg, final Throwable exception) {
        super(errorMsg, exception);
        String cause = exception == null ? "null" : exception.getClass().getSimpleName();
        MetricRegistries.get(Type.APPLICATION).counter("errorCounterMetric", new Tag("cause", cause)).inc();
    }
}

这仍然应该有一个很好的有界基数,但是(编造一些东西)您将了解创建此异常以包装NullPointerException、IOException、null或...

 类似资料:
  • 问题内容: 我正在尝试收集所有发生的异常计数和a中的异常名称,以便我应该知道该异常发生了多少次。 因此,在我的catch块中,我有一个映射,该映射将继续添加异常名称,并且总计数出现。 下面是我每次用于测试目的的代码,以便我可以看到异常计数是否正确。 所以某些情况下 1)如果我将线程数选择为,将任务数选择为,则在该图中,我可以看到该特定字符串的500个异常 2)但是,如果我选择的线程数和任务数一样,

  • 所以我使用了DataInputStream、FileInputStream、BufferInputStream、FileReader、BufferedReader、Scanner。它们都抛出FileNOtFoundException或CorruptedStreamException。

  • 我正试图使用FileWriter将一些文本写入文件。程序运行时不抛出任何异常,除了它应该抛出的异常(写入文件是抛出异常的一部分),但文件保留为空。该文件与包含异常的.java文件和抛出异常的.java文件位于同一目录中。 我正在正确地刷新和关闭FileWriter对象,它位于try/catch块中,该块应该打印代码遇到的任何异常,我尝试使用带有FileWriter作为参数的PrintWriter,

  • 你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接导出类。 如何引发异常 例13.2 如何引发异常 #!/usr/bin/python # Filename: raising.py classShortInputException(Exception):     '''A u

  • 错误: 无法初始化主类 com.telegram.client.myClasses.Main 由以下原因引起: java.lang.NoClassDefFound错误: 组织/电报/电报机器人/泛型/长PollingBot 我做专家安装,然后运行 jar 文件,安装有一些警告,但不是错误。所以当我运行jar文件时,它会抛出这个警报。我不在我的项目中使用这个类,我不明白为什么它不起作用。P.S 抱歉

  • 问题内容: 我有这个代码片段,我正在尝试使用python从文件末尾向后搜索: 运行时将引发以下异常: 我在这里想念什么吗? 问题答案: 从Python 3.2及更高版本的文档中: 在文本文件中(那些在模式字符串中不带a开头的文件),仅允许相对于文件开头的查找(查找到文件末尾为的例外)。 因此,您可以将程序更改为: 但是,您应该注意,在读取或写入文本时添加标志会产生意想不到的后果(例如,使用多字节编