gpt4 book ai didi

java - Micrometer 中的计数器线程安全吗

转载 作者:行者123 更新时间:2023-12-02 08:53:12 29 4
gpt4 key购买 nike

我正在尝试发布我的应用程序正在处理的事件数量。这是我在接收端的代码:

public void process(List<String> batch) {
logger.info ("Processing batch of size " + batch.size())
metrics.incrementCounter(MetricsType.CONSUMER_TOTAL_PROCESSED, batch.size)
}

类指标是:

public class Metrics {
private static final Map<MetricsType, Counter> COUNTER_MAP = new ConcurrentHashMap<>();

public Metrics(
@Autowired MeterRegistry meterRegistry
) {
COUNTER_MAP.put(
MetricsType.CONSUMER_TOTAL_PROCESSED,
Counter.builder("CONSUMER_TOTAL_PROCESSED").register(meterRegistry)
);

COUNTER_MAP.put(
MetricsType.CONSUMER_DUPLICATE_PROCESSED,
Counter.builder("CONSUMER_DUPLICATE_PROCESSED").register(meterRegistry)
);
}

public void increment(MetricsType metricsType, int size) {
COUNTER_MAP.get(metricsType).increment(size);
}
}

枚举MetricsType包含所有类型的计数器。

process 方法随时由 16 个线程调用。我面临的问题是打印计数的记录器和 grafana 中报告的总计数​​相差甚远。

每次递增计数器时都必须同步吗?

<小时/>

编辑 - 我所说的计数关闭是指,如果有两个大小为 200 的日志,那么 grafana 应该报告总计数器 400。我通过 2 小时的时间范围来验证这一点,我提取了所有大小从日志中添加它们。

<小时/>

如果您偶然发现这一点并发现两个来源之间存在差异,请检查 Grafana 中的最大数据点数量是多少,这就是我认为计数器可能不是线程安全的实际问题。

最佳答案

计数器是线程安全的,它们在内部使用一些原子数据结构进行计数。根据您的代码,我怀疑记录器打印的内容与您在 grafana 中看到的内容有很大不同,因为记录器打印当前批处理的大小,而计数器打印所有批处理大小的总和。

关于java - Micrometer 中的计数器线程安全吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60651605/

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