使用协程将traceId添加到Kotlin反应式api

问题描述

我有一个Kotlin / Spring / Reactor / Coroutines的spring api 像:suspend fun method(): String { return myService.data() }

我想添加traceId来调用myService.data(), traceId来自标头中的上述调用(来自Jaerger / Opentracing)

作为解决方案,我找到了以下库:实现(“ org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.3.9”) 当我打电话时,我应该输入代码

withContext(MDCContext()) {
    logger.info("call my service")
    myService.data()
}

问题: 如何将traceId从header放置到MDC协程上下文中,可能需要添加WebFilter来获取请求标头并创建类似请求协程上下文的内容

有什么想法吗?

解决方法

使用@EugeneZacharov: 找到了获取上下文的方法-> Mono.deferWithContext { ctx -> Mono.just(ctx) }.awaitFirst()

  1. 添加WebFilter
  2. 将上方过滤器中的traceId标头复制到ReactorContext
  3. 在需要时在其中添加MDC数据的地方添加额外乐趣:
suspend fun Logger.debugWithMDC(message: String) {
    if (isDebugEnabled) {
        val context = Mono.deferWithContext { ctx -> Mono.just(ctx) }.awaitFirst()
        context.copyToMdc()
        this.debug(message)
        MDC.clear()
    }
}
  1. 利润