我正在尝试使用DropWizard Metrics library来测量我的应用程序上的应用程序和jvm级别度量。如何每X秒重置度量标准?
以下是我在我的代码中用于增加/减少度量标准的度量类。我打电话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](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
关于你更大的问题:看这里 - > http://stackoverflow.com/questions/40807073/how-can-i-reset-timer-of-dropwizard-metrics/40809650#40809650检查[链接的问题](https: 'metrics project'上的//github.com/dropwizard/metrics/issues/143#issuecomment-63345927)。 [一些评论](https://github.com/dropwizard/metrics/issues/143#issuecomment-85419740)有链接到[这篇文章](http://evertrue.github.io/blog/2013/10/14/resettable-counters-with-codahale-metrics /)来解决重置计数器的问题。 – zloster
我不太喜欢你给我的文章链接。我很困惑这将如何适合我的班级?你能帮我理解吗?或者如果你能给我一个例子? Bcoz我正在调用'TestMetrics'类的增量方法来增加指标。 – user1950349