Java 测量方法调用速率



我想计算和打印方法调用率,假设我有以下方法在每条使用的消息(来自 Kafka(时调用:

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 次方法调用,以了解我的应用程序可以使用来自 Kafka 的事件的速度。

我尝试使用番石榴的速率限制器,但它没有返回当前的调用速率。

现在我最终得到了以下解决方案,我只需在 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);
}
}

所以我仍在寻找任何其他更准确的解决方案。

有一些计量库可以提供速率测量功能。

以下是其中的两个:

删除向导指标

千分尺

两者都以类似于某些下降的方式工作 - 将具有所有必需信息的对象保存在内存中。

通常,这些框架与指标持久性服务器(如Prometheus,Influx DB,Graphite等(结合使用+一些UI工具,可以轻松查看和分析值(如Grafana(。

但即使在"stadalone"模式下,他们也可以将收集到的信息报告给日志文件或JMX,例如

例如,在 Dropwizard 中,有一个"Meter"原语可以像这样使用:

// 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
}

最新更新