Codahale Metrics:在普通Java中使用@Timed指标注释

2022-09-01 01:08:54

我正在尝试使用codahale指标将指标添加到普通的Java应用程序中。我想使用@Timed注释,但我不清楚它使用哪个指标注册表,或者如何告诉它使用哪个指标注册表。该应用程序是一个普通的Java 8应用程序,使用Maven 3构建,没有Spring,没有Hibernate。

我无法在dropwizard文档中找到有关如何实现@Timed的任何文档:https://dropwizard.github.io/metrics/3.1.0/manual/

我添加了这些依赖项:

<dependency>
  <groupId>io.dropwizard.metrics</groupId>
  <artifactId>metrics-core</artifactId>
  <version>3.1.0</version>
</dependency>
<dependency>
  <groupId>com.codahale.metrics</groupId>
  <artifactId>metrics-annotation</artifactId>
  <version>3.0.2</version>
</dependency>

当我使用对计时器的程序调用时,我可以获得报告,因为我知道使用了哪个指标注册表:

static final MetricRegistry metrics = new MetricRegistry();
private void update() throws SQLException {
  Timer.Context time = metrics.timer("domainobject.update").time();
  try {
    [...]
  } finally {
    time.stop();
  }
}

但是当我使用更优雅的@Timed注释时,我不知道使用了哪个注册表,因此我无法创建报告器,这意味着我无法报告指标(我甚至不确定这是否真的做了什么):

@Timed(name = "domainobject.update")
private void update() throws SQLException {
    [...]
}

请就如何使@Timed和其他指标注释在常规 Java 应用程序中正常工作提供建议。

附加信息:我发现这很奇怪的原因是我已经添加了龙目岛框架,并且@Slf4j注释确实有效。我在 maven pom 中添加了 Lombok 作为依赖项.xml:

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.14.8</version>
</dependency>

我可以使用@Sl4fj类注释将记录器添加到类中,而不会使成员变量混乱:

@Slf4j
public class App {
  public void logsome(){
    log.info("Hello there");
  }
}

因此,如果只需添加依赖项即可实现这一点,我认为我只是缺少依赖项或配置来获得codahale@Timed注释工作,如上所述。

(顺便说一句,看看龙目岛,它会让你的生活更轻松:http://projectlombok.org/ )


答案 1

长话短说,如果没有某种AOP(无论是Spring AOP还是AspectJ),您就无法使用。@Timed

一两周前,我还决定为我们的项目添加指标,并选择AspectJ来完成这项任务(主要是因为我过去曾将其用于类似目的,并且因为它允许编译时编织,而Spring仅允许通过代理运行时)。

您应该能够在这里找到所有必要的信息和说明:https://github.com/astefanutti/metrics-aspectj

至于龙目岛,我猜他们使用内置的javac注释处理器:

另一个争论点是支持IDE集成的代码以及javac注释处理器的实现。龙目岛计划的这两个部分都利用非公共API来完成他们的巫术。这意味着龙目岛项目存在被后续 IDE 或 JDK 版本破坏的风险。


答案 2

使用实际上不需要使用AOP,正如之前在顶级答案中声称的那样,如果你在容器内并使用Dropwizard的检测库之一。例如,请参阅泽西岛2.x模块,如果您阅读源代码,您可以看到它使用反射(就像我看过的其他模块一样)。@Timed

您可以在 Dropwizard 文档中相应的“检测 ____”项目符号下阅读所有这些模块。

我知道OP显然不在这样的容器中工作,但我想提供此信息,因为我们中许多寻找这个答案的人可能正在开发一个可以在其运行时环境中注册此类资源的现代Web服务。


推荐