【发布时间】:2015-04-14 11:54:35
【问题描述】:
我正在尝试使用 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 注释正常工作,如上所述。
(顺便看看龙目岛,它会让你的生活更轻松:http://projectlombok.org/)
【问题讨论】:
-
我认为如果没有 Spring AOP 或手动设置 AspectJ 来编织你的类,你会很不走运。这种事情只适用于 AOP,所以你需要一些东西来在你的类中提供它。例如,Spring AOP 使用 JDK Proxies、CGLIB 或 AspectJ 来实现这一点
-
那么 AspectJ 会是正确的选择吗?我该怎么做呢?
-
更有趣的是:为什么@Slf4j 可以工作,而@Timed 不行?我没有明确使用 AspectJ 来让 Slf4j 工作。
-
你是什么意思@ Slf4j?我不熟悉使用 slf4j 的任何基于注释的 AOP
-
查看附加信息。
标签: java metrics codahale-metrics