2016-12-01 16 views
0

DropWizard Metrics libraryを使用してアプリケーションでアプリケーションとjvmレベルのメトリックを測定しようとしています。メトリックをX秒ごとにリセットするにはどうすればよいですか?

以下は、コード全体でメトリクスを増減するために使用しているメトリクスクラスです。私は、incrementdecrementのメソッドをインクリメントとデクリメントのメトリックに呼びます。

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秒で何が起きたのかを数えます。

+0

'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

+0

大きな問題について:こちらをご覧ください - > 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

+0

私はあなたが私に与えた記事のリンクをたどっていません。それが私のクラスにどのように適合するのか混乱していますか?あなたはそれを理解するのを助けることができますか?または、私に例を教えてもらえますか? Bcoz私は 'TestMetrics'クラスのインクリメントメソッドを呼び出してメトリクスをインクリメントします。 – user1950349

答えて

0

回答が長すぎます:

カウンターをリセットします。このためのAPIはありません。理由はリンクされたgithubの問題で議論されます。この資料では、考えられる回避策について説明します。あなたはカウンタを持っており、増分と減分を通常通り使用します。しかし、それらをリセットすることはできません。新しい値Gaugeを追加します。この値は、報告した後にリセットしたいカウンタの次の値です。 カウンタの値を報告する場合は、GaugegetValue()メソッドが呼び出されます。現在の値を記憶した後、この方法は、カウンタの値をそれと共に減少させる。これにより、カウンターは実質的に0にリセットされました。だからあなたはあなたのレポートを持っていて、カウンタもリセットしています。これはStep 1に記載されています。

Step 2には、ゲージを介して報告しているため、実際のカウンタが報告されないようにするフィルタが追加されています。

+0

これは私のメトリクスカウンタのそれぞれに「ゲージ」が必要なことを意味していますか?私はすべてのメトリックに対して定義されたカウンタ変数を持たないため、メトリックをインクリメントする非常に一般的な方法があります。私はすべてのメトリック変数を定義するためにenumを使用しています。そして、それを 'increment'メソッドで使用してメトリックを増やします。つまり、すべてのメトリックに対して手動でゲージを定義する必要があります。 – user1950349

+0

私のコードに従ってこの機会をいつでも作ることができますか? – user1950349

+0

1)はい、リセットするカウンタごとに1つのゲージが必要です。 2)質問が多すぎて範囲外の場合 - 回避策が役立つ場合、それを実行する方法はあなたが決定する必要があります。 – zloster

関連する問題