скорость вызова метода измерения Java - PullRequest
0 голосов
/ 04 июля 2018

Я хочу вычислить и напечатать частоту вызовов метода, скажем, у меня есть следующий метод, который вызывается для каждого потребляемого сообщения (из Кафки):

public class Consumer {
  public void run() {
   while (true) {
     ConsumerRecords<String> recs = consumer.poll();
     for(ConsumerRecord record: recs) {
       parseMessageToDB(record.getValue());
     }
   }
 }

  public void parseMessageToDB(String message) {
    // message parsing logic..
  }
}

Моя цель здесь - рассчитать количество вызовов метода #parseMessageToDB в секунду, чтобы узнать скорость, с которой мое приложение может получать события от Кафки.

Я пытался использовать RateLimiter из Гуавы, но он не возвращает текущий уровень вызовов.

Прямо сейчас я получил следующее решение, в котором я просто вычисляю количество потребляемых сообщений за 15 секунд и просто сбрасываю его на ноль после регистрации.

Этот расчет не очень точен, так как я полагаюсь на интервалы таймера, а также есть возможность взять (или сбросить) значения из другого 15-секундного окна, но это дает мне хотя бы некоторую картину:

public class Consumer {

    private final Timer timer = new Timer();
    private final AtomicLong parsedEvents = new AtomicLong();
    private static final int CONSUMER_TIMER_RATE_SEC = 15;

    public Consumer () {
      timer.schedule(new TimerTask() {
        @Override
        public void run() {
        logEventsParsingRate();
        }
      }, 0, CONSUMER_TIMER_RATE_SEC*1000);

    }

    public void run() {
       while (true) {
         ConsumerRecords<String> recs = consumer.poll();
         for(ConsumerRecord record: recs) {
            parseMessageToDB(record.getValue());
         }
        parsedEvents.addAndGet(recs.count());
       }
     }

   private void logEventsParsingRate() {
     logger.info("Consumer events consuming rate per sec: " + 
       handledEvents.getAndSet(0)/CONSUMER_TIMER_RATE_SEC);
   }

}

Так что я все еще ищу другие более точные решения.

1 Ответ

0 голосов
/ 04 июля 2018

Существуют библиотеки измерений, которые могут предоставить возможности измерения скорости.

Вот два из них:

Метрики Dropwizard

микрометра

Оба работают аналогично некоторому спуску - сохраняют в памяти объект, который имеет всю необходимую информацию.

Обычно эти инфраструктуры используются в сочетании с серверами сохранения метрик, такими как Prometheus, Influx DB, Graphite и т. Д. + Некоторым инструментом пользовательского интерфейса, который позволяет легко просматривать и анализировать значения (например, Grafana).

Но даже в "стандартном" режиме они могут сообщать собранную информацию в файлы журнала или JMX, например

Например, в Dropwizard есть примитив «Метр», который можно использовать так:

// somewhere globally defined
private final MetricRegistry metrics = new MetricRegistry();
private final Meter requests = metrics.meter("requests");

// the method to be metered
public void run() {
    requests.mark();
    // do stuff
}
...