2016-08-29 3 views
0

Использование показателей Codahale - это способ подсчета за последние 24 часа (сегодня).Codahale metrics counter Сброс и подсчет каждый день

, чтобы сгенерировать отчет, как показано ниже:

Запрос Count:

lastSec lastMin lastHour today 
======================================= 
1   5   22  45 

Ответ Count:

lastSec lastMin lastHour today 
======================================= 
1   5   22  45 

Существует Meter methods получить последнюю секунду, минуту, пятнадцать ставок. но как добраться до последнего часа и сегодня считать?

Ниже попробовал:

public class ReportMetrics { 

    static final MetricRegistry metrics = new MetricRegistry(); 
    static final Counter aReqCount = ReportMetrics.metrics.counter(name(AProcessor.class, "a-req-count")); 
    static final Counter aResCount = ReportMetrics.metrics.counter(name(AProcessor.class, "a-res-count")); 

    private static final AProcessor aProcessor = new AProcessor(); 

    public static void main(String[] args) { 
     startReport(); 

     for(int i=0; i<=5; i++){ 
      //add 
      aProcessor.addJob(); 
      wait5Seconds();   

      //take 
      arProcessor.takeJob(); 
      wait5Seconds();   
     } 

    } 

    static void startReport() { 
      ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics) 
       .convertRatesTo(TimeUnit.SECONDS) 
       .convertDurationsTo(TimeUnit.MILLISECONDS) 
       .build(); 
      reporter.start(1, TimeUnit.SECONDS); 
     } 

    static void wait5Seconds() { 
      try { 
       Thread.sleep(5*1000); 
      } 
      catch(InterruptedException e) {} 
     } 

    public long requestCount(){ 
     ReportMetrics.metrics.aReqCount.getCount(); 
    } 

    public long responseCount(){ 
     ReportMetrics.metrics.aResCount.getCount(); 
    } 

    public long pendingRequestCount(){ 
     return requestCount() - responseCount(); 
    } 

} 

class AProcessor { 

    public void addJob(){ 
     ReportMetrics.metrics.aReqCount.inc(); 
    } 

    public Object takeJob(){ 
     ReportMetrics.metrics.aResCount.inc(); 
    } 
} 

ответ

1

Резюмируя или рассчитать количество (всего) за произвольный интервал для счетчиков сообщенных с counter.inc:

hitcount(perSecond(AProcessor.a-req-count.count), '1hour') 

hitcount(perSecond(AProcessor.a-res-count.count), '1day') 

AFAIK это делает всю черную магию внутри , Включая, но не ограничиваясь этим, summarize(scaleToSeconds(nonNegativeDerivative(your.count),1), '1day') , а также следует масштабировать в соответствии с периодами хранения углерода (один или несколько), которые попадают в выбранный период агрегирования.

+0

Благодарим вас за ответ. – Rembo

Смежные вопросы