簡體   English   中英

Codahale指標:在普通Java中使用@Timed指標注釋

[英]Codahale Metrics: using @Timed metrics annotation in plain Java

我正在嘗試使用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/

長話短說,如果沒有某種AOP(無論是Spring AOP還是AspectJ),都不能使用@Timed

一兩個星期前,我還決定為我們的項目添加指標,並選擇AspectJ來完成這項任務(主要是因為我過去使用它來達到類似的目的,因為它允許編譯時編織,而Spring只允許通過代理運行時) 。

您應該能夠在此處找到所有必要的信息和說明: https//github.com/astefanutti/metrics-aspectj

至於Lombok,我猜他們使用內置的javac注釋處理器:

另一個爭論點是實現支持IDE集成的代碼以及javac注釋處理器。 這兩個項目Lombok都利用非公共API來完成他們的巫術。 這意味着使用后續IDE或JDK版本可能會破壞Project Lombok的風險。

如果您在容器內並使用Dropwizard的一個檢測庫,那么使用@Timed實際上並不需要使用AOP,就像之前在評價最高的答案中所聲稱的那樣。 例如,請參閱Jersey 2.x模塊,如果您閱讀了源代碼 ,您可以看到它使用反射(就像我看到的其他人一樣)。

您可以在相應的“ Instrumenting ____ ”項目符號下的Dropwizard文檔中閱讀所有這些模塊。

我理解OP明確地不在這樣的容器中工作,但是我想提供這個信息,因為我們許多尋找這個答案的人可能正在研究一種可以在其運行時環境中注冊這些資源的現代Web服務。

使用從應用程序類的initialize方法中的bootstrap參數訪問的內置MetricRegistry。

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

正如另一個答案所述,你必須在應用程序中有一些東西來監聽你的實例化類並檢查它們的@Timed注釋。

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

一般而言,AOP過度使用並不適合使用@timed。

默認度量標准注冊表將@timed指標寫入ConcurrentHashMap,並且不附加任何有意義的偵聽器。

DropWizard Bootstrap構造函數:

/**
 * Creates a new {@link Bootstrap} for the given application.
 * @param application a Dropwizard {@link Application}
 */
public Bootstrap(Application<T> application) {
    this.application = application;
    this.objectMapper = Jackson.newObjectMapper();
    this.bundles = Lists.newArrayList();
    this.configuredBundles = Lists.newArrayList();
    this.commands = Lists.newArrayList();
    this.validatorFactory = Validators.newValidatorFactory();


    // returns new ConcurrentHashMap<String, Metric>(); 
    this.metricRegistry = new MetricRegistry(); 


    this.configurationSourceProvider = new FileConfigurationSourceProvider();
    this.classLoader = Thread.currentThread().getContextClassLoader();
    this.configurationFactoryFactory = new DefaultConfigurationFactoryFactory<T>();
}

因此,您需要構建/啟動/注冊相應的度量標准注冊表才能查看結果。

在這里我使用JMX:

@Override
public void initialize(Bootstrap<PayloadStorageConfiguration> bootstrap) {
    JmxReporter.forRegistry(bootstrap.getMetricRegistry()).build().start();
}

這就是你需要做的。

以下是輸出示例(針對Java應用程序/服務器運行jconsole以查看JMX結果):

在此輸入圖像描述

在較新的版本Dropwizard(我使用0.9.2),你可以訪問默認MetricRegistry通過設置環境io.dropwizard.setup.Environment 此默認MetricRegistry已經有一個與之關聯的InstrumentedResourceMethodApplicationListener ,它會偵聽您資源的所有指標。

如果您已將JerseyEnvironment注冊為資源,

environment.jersey().register(resource);

您只需要使用@Timed@Metered@ExceptionMetered注釋您的資源方法(或類)以注冊相應的指標。

@POST
@Timed
public String show() {
    return "yay";
}

您可以將Reporter (如Slf4jReporterJmxReporter )分配給默認的MetricRegistry如下所示

Slf4jReporter.forRegistry(environment.metrics()).build();

作為快速測試以查看您的指標是否實際已注冊,您可以在測試環境中對URL http://localhost:8081/metrics或相應的管理指標URL進行GET調用。

其他一些版本要求您顯式注冊InstrumentedResourceMethodApplicationListener ,如本Doc所示

你也可以使用stagemonitor-core。 請參閱此處此處的文檔。 優點是stagemonitor(免費和開源btw)不依賴於任何基於容器的AOP,如Spring AOP或EJB攔截器。 它通過運行時附件使用字節碼操作,這意味着您甚至不必向應用程序啟動添加-javaagent標志 - 普通依賴就足夠了。

如果要在Web應用程序或遠程EJB應用程序中測量執行時間,則甚至不必手動注釋代碼。 此外,stagemonitor還提供預配置的Grafana和Kibana儀表板。

免責聲明:我是stagemonitor的開發者之一

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM