【发布时间】:2016-12-01 05:44:07
【问题描述】:
我正在尝试使用 DropWizard Metrics library 在我的应用程序上测量应用程序和 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 秒内发生的任何事情。
【问题讨论】:
-
关于
SendMetrics类。 Dropwizard 已经有适当的抽象,您可以使用它们来实现您自己的报告。例如查看ConsoleReporter 它在stdout或stderr上打印指标,并且可以为报告期间进行配置。另请查看dropwizard-metrics 子模块。您可以将那里的代码用作示例实现。 -
关于你更大的问题:看这里 -> stackoverflow.com/questions/40807073/… 在
metrics project上检查the linked issue。 Some comment 有指向 this article 的链接以解决有关重置计数器的问题。 -
我不太了解您给我的文章链接。我很困惑这将如何适合我的班级?你能帮我理解吗?或者你能给我举个例子吗?因为我正在调用
TestMetrics类的增量方法来增加指标。
标签: java quartz-scheduler dropwizard metrics codahale-metrics