Я хочу вычислить и напечатать частоту вызовов метода, скажем, у меня есть следующий метод, который вызывается для каждого потребляемого сообщения (из Кафки):
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);
}
}
Так что я все еще ищу другие более точные решения.