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

Rol*_*olf 35 java metrics codahale-metrics

我正在尝试使用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>
Run Code Online (Sandbox Code Playgroud)

当我使用对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();
  }
}
Run Code Online (Sandbox Code Playgroud)

但是当我使用更优雅的@Timed注释时,我不知道使用了哪个注册表,因此我无法创建一个记者,这意味着我无法报告指标(我甚至不确定这是否确实任何东西):

@Timed(name = "domainobject.update")
private void update() throws SQLException {
    [...]
}
Run Code Online (Sandbox Code Playgroud)

请告知如何使@Timed和其他Metrics注释在常规Java应用程序中工作.

附加信息:我发现这个奇怪的原因是我添加了Lombok框架和@ Slf4j注释确实有效.我在maven pom.xml中添加了Lombok作为依赖项:

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.14.8</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

@Slf4j
public class App {
  public void logsome(){
    log.info("Hello there");
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果只通过添加依赖项就可以实现,我认为我只是缺少一个依赖项或配置来获取codahale @Timed注释工作,如上所述.

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

And*_*nov 17

简而言之,如果@Timed没有某种AOP(无论是Spring AOP还是AspectJ),你就无法使用.

一两个星期前,我还决定为我们的项目添加指标,并选择AspectJ来完成这项任务(主要是因为我过去使用它来达到类似目的,因为它允许编译时编织,而Spring只允许通过代理运行时) .

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

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

另一个争论点是实现支持IDE集成的代码以及javac注释处理器.这两个项目Lombok都利用非公共API来完成他们的巫术.这意味着使用后续IDE或JDK版本可能会破坏Project Lombok的风险.


小智 12

使用@Timed实际上并不需要使用AOP,作为收视率最高的答案先前声称,如果你是一个容器内,并使用Dropwizard的仪表图书馆之一.例如,请参阅Jersey 2.x模块,如果您阅读了源代码,您可以看到它使用反射(就像我看到的其他人一样).

您可以在相应的" Instrumenting ____ "项目符号下的Dropwizard文档中阅读所有这些模块.

我理解OP明确地不在这样的容器中工作,但是我想提供这个信息,因为我们许多寻找这个答案的人可能正在研究一种可以在其运行时环境中注册这些资源的现代Web服务.


wox*_*wox 5

正如另一个答案所述,您必须在应用程序中添加一些内容来侦听实例化的类并检查它们是否有 @Timed 注释。

如果您使用 Guice,则可以使用:https://github.com/palominolabs/metrics-guice


小智 5

使用从应用程序类的initialize方法中的bootstrap参数访问的内置MetricRegistry.

@Override
public void initialize(final Bootstrap<Configuration> bootstrap) {
    final JmxReporter reporter = JmxReporter.forRegistry(bootstrap.getMetricRegistry()).build();
    reporter.start();
}
Run Code Online (Sandbox Code Playgroud)