DropWizard Metrics ライブラリを使用して、アプリケーションのアプリケーションおよび jvm レベルのメトリックを測定しようとしています。
以下は、メトリックをインクリメント/デクリメントするためにコード全体で使用しているメトリック クラスです。メトリクスをインクリメントおよびデクリメントするために、以下のクラスのメソッドを呼び出し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 秒ごとにのみ実行される別のクラス (そのために Quartz フレームワークを使用しています) ができました。通常、これらのメトリクスを 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 秒間に起こったことのカウント。