DropWizard Metrics libraryを使用してアプリケーションでアプリケーションとjvmレベルのメトリックを測定しようとしています。メトリックをX秒ごとにリセットするにはどうすればよいですか?
以下は、コード全体でメトリクスを増減するために使用しているメトリクスクラスです。私は、increment
とdecrement
のメソッドをインクリメントとデクリメントのメトリックに呼びます。
public class TestMetrics {
private final MetricRegistry metricRegistry = new MetricRegistry();
private static class Holder {
private static final TestMetrics INSTANCE = new TestMetrics();
}
public static TestMetrics getInstance() {
return Holder.INSTANCE;
}
private TestMetrics() {}
public void increment(final Names... metricsName) {
for (Names metricName : metricsName)
metricRegistry.counter(name(TestMetrics.class, metricName.value())).inc();
}
public void decrement(final Names... metricsName) {
for (Names metricName : metricsName)
metricRegistry.counter(name(TestMetrics.class, metricName.value())).dec();
}
public MetricRegistry getMetricRegistry() {
return metricRegistry;
}
public enum Names {
// some more fields here
INVALID_ID("invalid-id"), MESSAGE_DROPPED("drop-message");
private final String value;
private Names(String value) {
this.value = value;
}
public String value() {
return value;
}
};
}
そして、ここで私は私がする必要がある場合にメトリクスの基礎をインクリメントするTestMetrics
クラスの上に使用しています方法です。以下のメソッドは、複数のスレッドによって呼び出されます。
public void process(GenericRecord record) {
// ... some other code here
try {
String clientId = String.valueOf(record.get("clientId"));
String procId = String.valueOf(record.get("procId"));
if (Strings.isNullOrEmpty(clientId) && Strings.isNullOrEmpty(procId)
&& !NumberUtils.isNumber(clientId)) {
TestMetrics.getInstance().increment(Names.INVALID_ID,
Names.MESSAGE_DROPPED);
return;
}
// .. other code here
} catch (Exception ex) {
TestMetrics.getInstance().increment(Names.MESSAGE_DROPPED);
}
}
は、今私は、私はすべてのメトリックとそのカウントをプリントアウトしたい場所から(私はそのためのクォーツフレームワークを使用しています)のみ、30秒ごとに実行される別のクラスを持っています。一般的に、これらのメトリックを30秒ごとに他のシステムに送信しますが、現在はここで印刷しています。以下は私がそれをやっている方法です。
public class SendMetrics implements Job {
@Override
public void execute(final JobExecutionContext ctx) throws JobExecutionException {
MetricRegistry metricsRegistry = TestMetrics.getInstance().getMetricRegistry();
Map<String, Counter> counters = metricsRegistry.getCounters();
for (Entry<String, Counter> counter : counters.entrySet()) {
System.out.println(counter.getKey());
System.out.println(counter.getValue().getCount());
}
}
}
私のすべてのメトリックは30秒ごとにリセットされます。つまり、私のexecute
メソッドがメトリックを出力するときには、プログラムが実行されてからその期間全体を印刷するのではなく、30秒間だけ(すべてのメトリックに対して)メトリックを出力する必要があります。
すべてのメトリックが30秒間カウントされる方法はありますか。過去30秒で何が起きたのかを数えます。
'SendMetrics'クラスについてDropwizardにはすでに適切な抽象化があり、独自のレポートを実装するために使用できます。たとえば、[ConsoleReporter](http://www.dropwizard.io/1.0.5/docs/manual/configuration.html#console-reporter)を参照してください。これは 'stdout'または' stderr'にメトリックを出力し、報告期間。また、[dropwizard-metrics](https://github.com/dropwizard/dropwizard/tree/master/dropwizard-metrics/src/main/java/io/dropwizard/metrics)サブモジュールを見てください。そこにコードを例として実装することができます。 – zloster
大きな問題について:こちらをご覧ください - > http://stackoverflow.com/questions/40807073/how-can-i-reset-timer-of-dropwizard-metrics/40809650#40809650 [リンクされている問題](https: //github.com/dropwizard/metrics/issues/143#issuecomment-63345927)を 'metrics project'に追加しました。 [いくつかのコメント](https://github.com/dropwizard/metrics/issues/143#issuecomment-85419740)[この記事へのリンク](http://evertrue.github.io/blog/2013/10/14/resettable-counters-with-codahale-metrics /)を使用してカウンタをリセットする方法について説明します。 – zloster
私はあなたが私に与えた記事のリンクをたどっていません。それが私のクラスにどのように適合するのか混乱していますか?あなたはそれを理解するのを助けることができますか?または、私に例を教えてもらえますか? Bcoz私は 'TestMetrics'クラスのインクリメントメソッドを呼び出してメトリクスをインクリメントします。 – user1950349