在 Reactor 3.2.3 中可以启用指标。可能会引入财产,例如。reactor.schedulers.metrics: enabled
这将通过调用启用指标
Schedulers.enableMetrics()
[spring-projects/spring-boot]使用反应器调度程序添加对微米指标的支持
回答
今天我们作为一个团队对此进行了一些讨论,但我们不确定我们是否喜欢Schedulers.enableMetrics()
.我们特别关心的事实是,SchedulerMetricDecorator
usesMetrics.globalRegistry
具有以下 javadoc:
特别适用于无法进行 MeterRegistry 依赖注入的地方
这似乎不是一种对 Spring 非常友好的提供集成的方式。
我们仍然希望提供指标支持,但我们还不确定具体如何提供。
/cc @smaldini @simonbasle 以防已经在考虑任何替代的非静态集成。
@philwebb 从我与 @jkschneider 的最初讨论以及我们在将指标添加到Flux
和时所做的事情来看Mono
,这globalRegistry
似乎是可行的方法,因为应用程序添加的任何注册表都应该添加到其中,从而转发仪器数据。
我可能错了。但请记住,对我们来说,挑战是我们无法在“主”API( 、 等)中公开 Micrometer 类,Flux#metrics()
因为Schedulers#enableMetrics()
我们只想要对它的可选依赖项。
很高兴听到您是否有关于如何以非静态方式集成指标的想法?
同意。添加静态注册表正是为了这种情况,其中核心库无法通过其 API 泄漏 Micrometer 类型。我没有看到其他选择,但很高兴听到建议。
如果 Reactor 公开SchedulerMetricDecorator
为公共 API 并允许为特定的实例创建实例MeterRegistry
,则 Boot 可以MeterRegistry
通过将其创建的实例传递SchedulerMetricDecorator
到对 的调用中来启用该实例的指标addExecutorServiceDecorator
。
这可能是一种解决方法(存在暴露公共类的危险,该公共类在第一次加载到不依赖于 Micrometer 的应用程序时会破坏运行时),但会引入Flux
指标之间的差异(这确实需要全局注册表)和调度程序指标...
编辑:澄清一下,确实需要上面的声明:在其公共 API 中Flux
不能有 Micrometer 的痕迹,因为它 100% 肯定会被加载,从而触发与 Micrometer 相关的类(和关联的NoClassDefFoundError
)的加载。所以还得依赖globalRegistry
.
我能想到的唯一替代方案是在该级别拥有完全非类型化的 API Metrics
,例如Metrics.setDefaultRegistry(Object maybeARegistryOrNotWhatever)
.
@wilkinsona @philwebb @jkschneider 我已经打开了一个 PR 来探索最后一条途径,请插话并告诉我您是否认为它值得丑陋的非类型化 API:reactor/reactor-core#1464
globalRegistry
经过上面关于我的 PR 的评论和讨论后,除了使用我们目前正在做的那样之外,我没有看到任何遵守以下限制的好方法:
- Reactor 希望避免显式依赖
Micrometer
- Micrometer的类不能泄漏到Reactor API和公共类中(否则会导致
NoClassDefFoundError
野乱) - Reactor 不应该负责实现指标接口集(重新发明 Micrometer 中的大部分轮子)
任何想法?
Micrometer的类不能泄漏到Reactor API和公共类中(否则会导致NoClassDefFoundError)
如果是我的话,我会放宽这个限制。在 Spring 世界中,有一个类需要在类路径上有一个可选依赖项才能使用,这是很常见的。如果被命名为使其对 Micrometer 的依赖更加明显,我认为如果有人尝试在类路径上没有 Micrometer 的情况下使用该类,则抛出或SchedulerMetricDecorator
是合理的。NoClassDefFoundError
ClassNotFoundException
调度程序的简单包装怎么样?因此,用户可以控制调度程序——他想要测量哪些调度程序,而不想测量哪些调度程序。
简单的包装器解决方案是不可行的,因为当前唯一可检测/可检测的是底层的ScheduledExecutorService
某些 Schedulers
用途。这不是由 公开的Schedulers
,因此不能被包装器访问。 Reactor-core 公开了一个钩子,以在 aScheduler
实例化 a时进行拦截ScheduledExecutorService
,可用于将其更改为 Micrometer 检测的包装器,但这适用于所有“调度程序”。
@simonbasle 由于实现了包装器,因此有任何更新吗?
这将由启动团队或贡献者来承担该任务,但是是的,自上周以来,io.projectreactor:reactor-core-micrometer:1.0.0
可选模块与reactor-core:3.5.0
.它公开了一个TimedScheduler
包装器,可以根据具体情况使用,而不依赖于全局注册表。就像是:
@Bean
public static SimpleMeterRegistry metricsRegistry() {
return new SimpleMeterRegistry();
}
@Bean
public static Scheduler parallel() {
return Schedulers.newParallel("my.parallel.scheduler");
}
@Bean
public static Scheduler instrumentedParallel(MeterRegistry registry, Scheduler parallel) {
String metricsPrefix = "my.instrumented.parallel.scheduler";
return Micrometer.timedScheduler(
parallel,
registry,
metricsPrefix
);
}
@wilkinsona 看起来 Spring Boot 现在可以利用TimedScheduler
包装器了:)
这项工作的现状如何?其预期结果是什么?是否打算提供某种开箱即用的装饰,以便开箱即用地监控调度程序?
目前,我似乎找不到Schedulers.enableMetrics()
该工具默认调度程序的替代品,除非我在使用它们的任何地方手动装饰它们TimedScheduler
(或者在装饰后将它们作为bean提供)
@rubasace嗨,我在reactor中创建了一个PR来支持这个 - https://github.com/reactor/reactor-core/pull/3288
我也遇到了这个问题,我真的没有看到Schedulers.enableMetrics()
Spring 使用的那些调度程序的一个很好的替代品。