gpt4 book ai didi

java - 如何每 X 秒重置一次指标?

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:05 26 4
gpt4 key购买 nike

我正在尝试使用 DropWizard Metrics library 测量应用程序上的应用程序和 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。这样您就可以得到报告并重置计数器。 第 1 步对此进行了描述。

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

关于java - 如何每 X 秒重置一次指标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40903403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com