gpt4 book ai didi

java 测量方法调用率

转载 作者:行者123 更新时间:2023-12-02 02:03:39 25 4
gpt4 key购买 nike

我想计算并打印方法调用率,假设我有以下方法,该方法在每个消费消息(来自 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 事件的速度。

我尝试使用 RateLimiter来自 Guava 但它不返回当前的调用率。

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

}

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

最佳答案

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

这里有两个:

Dropwizard metrics

Micrometer

两者的工作方式与某些血统类似 - 在内存中保留一个具有所有必需信息的对象。

通常,这些框架与 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
}

关于java 测量方法调用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51180047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com