【问题标题】:How to set up logback MDC in apache beam and dataflow?如何在 Apache Beam 和数据流中设置 logback MDC?
【发布时间】:2021-07-12 13:36:32
【问题描述】:

我们正在使用 apache beam 并希望设置 logback MDC。 logback MDC 是一个很棒的资源,当你有一个请求进来并且你存储了一个 userId(在我们的例子中,它是 custId、fileId、requestId),然后每当开发人员登录时,它就会神奇地将这些信息标记到开发人员日志上.开发人员不再忘记在他添加的每个日志语句中添加它。

我开始使用嵌入我们微服务中的 Apache Beam Direct Runner 进行端到端集成类型测试(在生产中,微服务调用数据流)。目前,我看到 MDC 在调用 expand() 方法之前一直很好。一旦调用了 processElement 方法,上下文当然就消失了,因为我在另一个线程中。

所以,首先尝试修复这个部分。我应该把这个上下文放在哪里,以便我可以在这个线程的开头恢复它。

例如,如果我有一个 Executor.execute(runnable),那么我只需像这样使用该 runnable 传输上下文

    public class MDCContextRunnable implements Runnable {
    private final Map<String, String> mdcSnapshot;
    private Runnable runnable;

    public MDCContextRunnable(Runnable runnable) {
        this.runnable = runnable;
        mdcSnapshot = MDC.getCopyOfContextMap();
    }


    @Override
    public void run() {
        try {
            MDC.setContextMap(mdcSnapshot);

            runnable.run();
            
        } Catch {
            //Must log errors before mdc is cleared
            log.error("message", e);.  /// Logs error and MDC
        } finally {
            MDC.clear();
        }

    }
}

所以我基本上需要对 apache Beam 做同样的事情。我需要

  1. 有一点要占领 MDC
  2. 有一点要恢复 MDC
  3. 有一点要清除 MDC 以防止它泄漏到另一个请求(真的以防我错过了似乎不时发生的事情)

关于如何做到这一点的任何想法?

哦,如果在框架记录任何异常时 MDC 可以在那里,则可以加分!!!! (即,理想情况下,框架应该为您执行此操作,但 apache Beam 似乎没有执行此操作。大多数 Web 框架都内置了此功能)。

谢谢, 院长

【问题讨论】:

    标签: google-cloud-dataflow apache-beam logback slf4j


    【解决方案1】:

    根据您提供的上下文和示例,听起来您想使用 MDC 为您自己的 DoFns 自动捕获更多信息。您最好的选择是,根据您需要上下文可用的生命周期,在 DoFns 上使用 StartBundle/FinishBundleSetup/Teardown 方法来创建 MDC 上下文(请参阅 @987654321 @ 用于解释两者之间的差异)。重要的是这些方法是为每个 DoFn 实例执行的,这意味着它们将在为执行这些 DoFn 而创建的新线程上调用。

    幕后

    我应该解释一下这里发生了什么,以及这种方法与您最初的目标有何不同。 Apache Beam 的执行方式是您编写的管道在您自己的机器上执行并执行管道构建(这是所有扩展调用发生的地方)。但是,一旦构建了管道,它就会被发送到通常在单独的应用程序上执行的运行程序,除非它是 Direct Runner,然后运行程序要么直接执行您的用户代码,要么在 docker 环境中运行它。

    在您的原始方法中,您可以成功地将 MDC 应用于所有日志,直到开始执行,因为执行可能不仅发生在不同的线程中,而且可能发生在不同的应用程序或机器中。但是,上述方法是作为用户代码的一部分执行的,因此在那里设置 MDC 将允许它在执行转换的任何线程/应用程序/机器上运行。

    请记住,每个 DoFn 都会调用这些方法,并且每个线程通常会有多个 DoFn,根据 MDC 的工作方式,您可能需要注意这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 2019-06-04
      • 2018-12-27
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多