问题描述
我有一个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()
- 添加WebFilter
- 将上方过滤器中的traceId标头复制到ReactorContext
- 在需要时在其中添加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()
}
}
- 利润