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

Codahale度量:在普通Java中使用@Timed metrics注释

班经亘
2023-03-14

我正在尝试使用codahale metrics向一个普通的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 {
    [...]
}

请说明如何在常规Java应用程序中使用@Timed和其他指标注释。

附加信息:我觉得这很奇怪的原因是我已经添加了Lombok框架,并且@Slf4j注释确实有效。我在mavenpom.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/)

共有3个答案

明正德
2023-03-14

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

@Override
public void initialize(final Bootstrap<Configuration> bootstrap) {
    final JmxReporter reporter = JmxReporter.forRegistry(bootstrap.getMetricRegistry()).build();
    reporter.start();
}
于正志
2023-03-14

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

您可以在Dropwizard文档中相应的“Instrumenting___。

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

咸昊昊
2023-03-14

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

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

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

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

另一个争论点是支持IDE集成的代码和javac注释处理器的实现。Lombok项目的这两个部分都利用非公共API来完成它们的魔法。这意味着Lombok项目有被后续IDE或JDK版本破坏的风险。

 类似资料:
  • 我目前正在开发一个SpringBootJAR库,用于可重用的组件,比如 ldap 电子邮件 与apache kafka消息 其余api用法 我们公司的每个Java用户/程序员都应该能够把这个罐子放在一个项目中(通过maven或其他方式),并使用可重用的组件,而不是一遍又一遍地编码所有的东西。 在REST之上为该问题构建微服务不是我们的选择。 我的问题是: 我可以在任何普通Java项目中重用这个Sp

  • 我有一个ECS服务向CloudWatch报告通过Codahale指标收集的指标。一些指标是计数,例如向外部服务发出的请求计数。每个服务实例都维护并向CloudWatch报告自己的计数。据我所知,这意味着CloudWatch中计数的值是每个服务的个人计数,无法查看(例如总数)。如果每个实例发出300个请求,那么报告的值将是300个,但无法将其相加为900个。 修复它的最佳方法是什么?将带有 ecs

  • 问题内容: 为了计算多元法线的CDF,我遵循了此示例(对于单变量情况),但无法解释scipy产生的输出: 产生的输出是: 如果联合CDF定义为: 则预期输出应为0到1之间的实数。 问题答案: 经过大量搜索后,我认为Noah H. Silbert的这篇博客文章描述了标准库中唯一可用于在Python中为多元正态计算cdf的现成代码。Scipy可以做到这一点,但是正如博客中提到的那样,很难找到。该方法基

  • 问题内容: 关于如何在不使用jQuery的情况下获得div高度的任何想法? 我正在搜索Stack Overflow这个问题,似乎每个答案都指向jQuery的。 我尝试了类似的方法,但是即使我的div具有CSS 并在CSS中进行了设置,它也没有返回任何内容。 问题答案: 要么 包括填充。 包括填充,scrollBar和边框。

  • 普通变量 对于程序开发人员来说,变量应该是最熟悉不过的概念了。如果多次重复使用一个信息,将它设置为一个变量,就可以在代码中重复引用。这不仅避免重复定义,还能使代码更容易维护。 Less中,变量由变量名称和值组成。变量名以 @ 为前缀,由字母、数字、_和-组成,变量名称和值之间用冒号隔开。如: /* 定义变量 */ @color: #4d926f; /* 应用到元素中 */ header {