1

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 秒間に起こったことのカウント。

4

1 に答える 1