当前位置: 首页 > 知识库问答 >
问题:

如何每隔X秒重置指标?

关翰
2023-03-14

我正在尝试使用 DropWizard 指标库在我的应用程序上测量应用程序和 jvm 级别的指标。

下面是我的度量类,我在代码中使用它来增加/减少度量。我正在调用下面类的< code>increment和< code>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;
    }
  };
}

下面是我如何使用上面的<code>TestMetrics</code>类来根据需要增加度量的基础。下面的方法由多个线程调用

  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秒重置一次所有指标计数。这意味着当我的<code>execute<code>方法打印出度量时,它应该只打印30秒的度量(对于所有度量),而不是打印程序运行时的整个持续时间。

是否有任何方法可以让我的所有指标只计算30秒。计算过去30秒内发生的事情。

共有1个答案

松昱
2023-03-14

作为答案,因为它太长了:

您想要重置计数器。对此没有API。原因在链接的<code>github<code>问题中讨论。本文描述了一种可能的解决方法。您有自己的计数器,并像往常一样使用它们-递增和递减。但你不能重置它们。因此,添加新的仪表,其值在向您报告后要重置的计数器后面。当您想要报告计数器值时,GaugegetValue()方法被调用。在存储当前值之后,该方法使用该值减小计数器的值。这有效地将计数器重置为0。所以你有你的报告,也有计数器重置。这在步骤1中进行了描述。

步骤 2 添加一个筛选器,该筛选器禁止报告实际计数器,因为您现在通过仪表进行报告。

 类似资料:
  • 问题内容: 我有一个简单的Java程序,该程序读取一个文本文件,将其分隔为“”(空格),显示第一个单词,等待2秒,显示下一个…等等…我想在Spring或其他一些GUI。 关于如何使用spring轻松更新单词的任何建议?遍历我的列表并以某种方式使用setText(); 我没有运气。我正在使用此方法在consol中打印我的单词,并向其中添加JFrame …在consol中效果很好,但是却发出了无尽的j

  • 我正在开发一个Android 2.3.3应用程序,我需要每X秒运行一个方法。 在iOS,我有NSTmer,但在Android我不知道用什么。 有人向我推荐了Handler;另一个人向我推荐了AramManager,但我不知道哪种方法更适合NSTmer。 这是我想在Android中实现的代码: 我需要像NSTmer这样的东西。 你给我推荐什么?

  • 问题内容: 我想知道如何每x秒重绘和更新JPanel的背景…这是我的代码: 我的代码有2个问题:1-JPanel根本没有被绘制。2-第一张可以打印,然后每次打印数量增加一倍。有什么建议吗?先感谢您 更新:我以这种方式解决了这个问题: 更新2: 问题答案: 使用Swing计时器,

  • 问题内容: 我有一个简单的Java程序,该程序读取一个文本文件,将其分隔为“”(空格),显示第一个单词,等待2秒,显示下一个…等等…我想在Spring或其他一些GUI。 关于如何使用spring轻松更新单词的任何建议?遍历我的列表并以某种方式使用setText(); 我没有运气。我正在使用此方法在consol中打印我的单词,并向其中添加JFrame …在consol中效果很好,但是却发出了无尽的j

  • 目前,我在我的视频右下方添加水印,以防止其他人重新发布它。然而,它们模糊了水印,所以我想添加一个移动水印,每隔x秒改变它的位置。 下面是我当前的ffmpeg命令: 如何每隔30秒让水印位置从右下到右上,到左上,再到左下?谢谢你。

  • 问题内容: 以给定的速率安排一段Java代码的最简单方法是什么? 问题答案: 在Java 5+中,带有: 上面的方法是有利的。在Java 5之前,您使用和: