Operators#lift:MDC 日志记录的好主意?

Operators#lift: good idea for MDC logging?

Project Reactor 文档建议使用以下 MDC 日志记录模式:

.doOnEach(logOnNext(r -> LOG.debug("found restaurant {} for ${}", r.getName(), r.getPricePerPerson())))

为了避免必须包装每个日志记录调用,自定义订阅者,在每个信号之前从 currentContext 填充 MDC,使用 Hooks.onEachOperator(Operators.lift(...)) 添加是个好主意吗?

我的主要关注点是:

1.) 在每个信号之前填充 MDC 的成本,即使没有记录发生也是如此。

2.) 运算符融合:每个运算符上的 Operators.lift(...) 是否有效禁用运算符融合?尝试使用 StepVerifier#expectFusion 进行快速测试似乎表明了这一点。如果这是真的,那么在实践中这对性能有多大影响?

欢迎任何意见!

这是 Sleuth 最初通过 Hooks.onEachOperator 采用的方法。但是,这是 非常 昂贵的,如果您只需要 logging/MDC 反应管道中的一部分操作,则可能不值得。更不用说这种方法不仅会影响您定义的响应式步骤,还会影响任何其他库/框架。

推荐是有原因的:更好的控制、更少的影响和更明确的方法。