2016-12-01 55 views
0

我正在尝试使用DropWizard Metrics library来测量我的应用程序上的应用程序和jvm级别度量。如何每X秒重置度量标准?

以下是我在我的代码中用于增加/减少度量标准的度量类。我打电话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秒内发生的任何事情。

+0

关于'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

+0

关于你更大的问题:看这里 - > 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

+0

我不太喜欢你给我的文章链接。我很困惑这将如何适合我的班级?你能帮我理解吗?或者如果你能给我一个例子? Bcoz我正在调用'TestMetrics'类的增量方法来增加指标。 – user1950349

回答

0

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

你想重置计数器。没有这个API。原因在链接github问题中讨论。本文介绍了一种可能的解决方法。你有你的计数器并像往常一样使用它们 - 递增和递减。但是你不能重置它们。因此,添加新的Gauge,在您向您报告之后,您想要重置的计数器的值跟随在其后面。当您想要报告计数器的值时,会调用的方法Gauge。在存储当前值之后,该方法正在减少计数器的值。这有效地将计数器重置为0。所以你有你的报告,也有计数器复位。这在Step 1中描述。

Step 2添加了一个过滤器,禁止报告实际计数器,因为您现在通过计量器进行报告。

+0

那么这意味着我需要为我的每个指标计数器设置“计量器”?我有一个非常通用的方法来增加度量标准,因为我没有为所有度量标准定义计数器变量。我使用枚举来定义所有的度量变量,然后在我的'increment'方法中使用它来增加度量。所以这意味着我需要为所有指标手动定义仪表? – user1950349

+0

根据我的代码,有没有什么办法让这个泛型有机会呢? – user1950349

+0

1)是的,您需要为每个要重置的计数器指定一个计量器; 2)问题太多,超出范围 - 如果解决方法能够帮助您并且如何实施,则由您来决定。 – zloster