簡體   English   中英

如何每隔X秒重置指標?

[英]How to reset metrics every X seconds?

我正在嘗試使用DropWizard Metrics庫在我的應用程序上測量應用程序和jvm級別指標。

下面是我在我的代碼中使用的度量類,用於遞增/遞減指標。 我正在調用下面的類的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秒運行一次(我使用的是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秒內發生的事情。

作為答案,因為它太長了:

您想重置計數器。 這沒有API。 原因在鏈接的github問題中討論。 本文介紹了一種可能的解決方法。 你有你的計數器並像往常一樣使用它們 - 遞增和遞減。 但是你無法重置它們。 因此,添加新的Gauge ,該值在您向其報告后要重置的計數器之后。 當您想要報告計數器值時,將調用GaugegetValue()方法。 在存儲當前值之后,該方法正在減少計數器的值。 這有效地將計數器重置為0 因此,您有報告並重置計數器。 這在Step 1描述。

Step 2添加了一個過濾器,禁止報告實際計數器,因為您現在通過儀表報告。

暫無
暫無

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

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