我正在尝试使用codahale指标将指标添加到普通Java应用程序中。我想使用@Timed批注,但我不清楚它使用哪个MetricRegistry,或者如何告诉它使用哪个MetricRegistry。该应用程序是一个普通的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>

当我通过编程方式调用Timer时,可以得到报告,因为我知道使用了哪个MetricsRegistry:
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和其他Metrics注释在常规Java应用程序中起作用的建议。

附加信息:我发现这个奇怪的原因是我添加了Lombok框架,并且@ Slf4j批注起作用了。我在Maven pom.xml中添加了Lombok作为依赖项:
<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注释工作,如上所述。

(顺便看看Lombok,它将使您的生活更轻松:http://projectlombok.org/)

最佳答案

长话短说,没有某种AOP(Spring AOP或AspectJ),就不能使用@Timed

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

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

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

10-06 09:54