[spring-projects/spring-boot]使用反应器调度程序添加对微米指标的支持

2018-12-03 30 views
1

在 Reactor 3.2.3 中可以启用指标。可能会引入财产,例如。reactor.schedulers.metrics: enabled 这将通过调用启用指标 Schedulers.enableMetrics()

回答

5

今天我们作为一个团队对此进行了一些讨论,但我们不确定我们是否喜欢Schedulers.enableMetrics().我们特别关心的事实是,SchedulerMetricDecoratorusesMetrics.globalRegistry具有以下 javadoc:

特别适用于无法进行 MeterRegistry 依赖注入的地方

这似乎不是一种对 Spring 非常友好的提供集成的方式。

我们仍然希望提供指标支持,但我们还不确定具体如何提供。

2

/cc @smaldini @simonbasle 以防已经在考虑任何替代的非静态集成。

9

@philwebb 从我与 @jkschneider 的最初讨论以及我们在将指标添加到Flux和时所做的事情来看Mono,这globalRegistry似乎是可行的方法,因为应用程序添加的任何注册表都应该添加到其中,从而转发仪器数据。

我可能错了。但请记住,对我们来说,挑战是我们无法在“主”API( 、 等)中公开 Micrometer 类,Flux#metrics()因为Schedulers#enableMetrics()我们只想要对它的可选依赖项。

很高兴听到您是否有关于如何以非静态方式集成指标的想法?

4

同意。添加静态注册表正是为了这种情况,其中核心库无法通过其 API 泄​​漏 Micrometer 类型。我没有看到其他选择,但很高兴听到建议。

4

如果 Reactor 公开SchedulerMetricDecorator为公共 API 并允许为特定的实例创建实例MeterRegistry,则 Boot 可以MeterRegistry通过将其创建的实例传递SchedulerMetricDecorator到对 的调用中来启用该实例的指标addExecutorServiceDecorator

8

可能是一种解决方法(存在暴露公共类的危险,该公共类在第一次加载到不依赖于 Micrometer 的应用程序时会破坏运行时),但会引入Flux指标之间的差异(这确实需要全局注册表)和调度程序指标...

编辑:澄清一下,确实需要上面的声明:在其公共 API 中Flux 不能有 Micrometer 的痕迹,因为它 100% 肯定会被加载,从而触发与 Micrometer 相关的类(和关联的NoClassDefFoundError)的加载。所以还得依赖globalRegistry.

我能想到的唯一替代方案是在该级别拥有完全非类型化的 API Metrics,例如Metrics.setDefaultRegistry(Object maybeARegistryOrNotWhatever).

6

@wilkinsona @philwebb @jkschneider 我已经打开了一个 PR 来探索最后一条途径,请插话并告诉我您是否认为它值得丑陋的非类型化 API:reactor/reactor-core#1464

2

globalRegistry经过上面关于我的 PR 的评论和讨论后,除了使用我们目前正在做的那样之外,我没有看到任何遵守以下限制的好方法:

  • Reactor 希望避免显式依赖Micrometer
  • Micrometer的类不能泄漏到Reactor API和公共类中(否则会导致NoClassDefFoundError野乱)
  • Reactor 不应该负责实现指标接口集(重新发明 Micrometer 中的大部分轮子)

任何想法?

1

Micrometer的类不能泄漏到Reactor API和公共类中(否则会导致NoClassDefFoundError)

如果是我的话,我会放宽这个限制。在 Spring 世界中,有一个类需要在类路径上有一个可选依赖项才能使用,这是很常见的。如果被命名为使其对 Micrometer 的依赖更加明显,我认为如果有人尝试在类路径上没有 Micrometer 的情况下使用该类,则抛出或SchedulerMetricDecorator是合理的。NoClassDefFoundErrorClassNotFoundException

5

调度程序的简单包装怎么样?因此,用户可以控制调度程序——他想要测量哪些调度程序,而不想测量哪些调度程序。

0

简单的包装器解决方案是不可行的,因为当前唯一可检测/可检测的是底层的ScheduledExecutorService 某些 Schedulers用途。这不是由 公开的Schedulers,因此不能被包装器访问。 Reactor-core 公开了一个钩子,以在 aScheduler实例化 a时进行拦截ScheduledExecutorService,可用于将其更改为 Micrometer 检测的包装器,但这适用于所有“调度程序”。

8

这将由启动团队或贡献者来承担该任务,但是是的,自上周以来,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
        );
    }
5

@wilkinsona 看起来 Spring Boot 现在可以利用TimedScheduler包装器了:)

9

这项工作的现状如何?其预期结果是什么?是否打算提供某种开箱即用的装饰,以便开箱即用地监控调度程序?

目前,我似乎找不到Schedulers.enableMetrics()该工具默认调度程序的替代品,除非我在使用它们的任何地方手动装饰它们TimedScheduler(或者在装饰后将它们作为bean提供)

3

我也遇到了这个问题,我真的没有看到Schedulers.enableMetrics()Spring 使用的那些调度程序的一个很好的替代品。