我正在使用 Spring Boot 2.7 和 Micrometer 1.11.2。 我的应用程序跨越工作线程,这些线程负责处理后台作业。每个工作线程都使用 Spring beans(即存储库),并且还尝试注册meter。
meterRegistry.get(metricName)
.tags(tags)
.timer();
如果两个并发线程尝试注册相同的仪表(相同的名称和相同的标签),则应用程序会因死锁而挂起。
此行为已报告并不幸地公开(请参阅https://github.com/micrometer-metrics/micrometer/issues/1551)。
第一种方法是在工作线程启动之前注册所有自定义仪表/指标。但由于线程也在使用 spring 存储库(这导致为 spring_data_repository_* 指标注册计量),因此它不起作用。
有人知道使用千分尺的解决方法吗?
另一个想法是直接使用 Prometheus 客户端,但这看起来不像 Spring Boot 方式。
最诚挚的问候亚历克斯
Spring Boot 2.7 已达到 OSS 支持期限,请升级到 3.x。 Micrometer 与 Boot 2.7 的匹配版本是 Micrometer 1.9。 Micrometer 1.11 应该也可以工作,但 1.9 是使用 Boot 2.7 进行测试的版本。
请检查文档如何正确注册
Meter
,请使用Timer.builder(...)
或registy.timer(...)
:https://docs.micrometer.io/micrometer/reference/concepts/timers.html
如果两个并发线程尝试注册相同的仪表(相同的名称和相同的标签),则应用程序会因死锁而挂起。
我认为这应该可行,并且#1551演示的问题是不同的。否则,很多用户仅使用处理并发请求的 mvc 控制器就会遇到同样的问题。 我可能弄错了,这与您遇到的问题相同,您有我们可以看一下的重现器吗? (您可以向该问题添加转载者的评论。)