千分尺死锁的解决方法

问题描述 投票:0回答:1

我正在使用 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 prometheus deadlock micrometer
1个回答
0
投票

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 控制器就会遇到同样的问题。 我可能弄错了,这与您遇到的问题相同,您有我们可以看一下的重现器吗? (您可以向该问题添加转载者的评论。)

© www.soinside.com 2019 - 2024. All rights reserved.