我想计算并打印方法调用率,假设我有以下方法,该方法在每条消耗的消息(来自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事件的速度。
我尝试使用Guava中的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);
}
}
因此,我仍在寻找其他更准确的解决方案。
答案 0 :(得分:2)
有些计量库可以提供速率测量功能。
这里有两个:
两者的工作方式均类似于某种下降方式-将具有所有必需信息的对象保留在内存中。
通常,这些框架与度量持久性服务器(例如Prometheus,Influx DB,Graphite等)以及一些可轻松查看和分析值(例如Grafana)的UI工具一起使用。
但是即使在“ 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
}