Firefly 4.8.1 正式版釋出,增加 MDC 實現

類別: IT

Firefly 4.8.1 新增了基於Coroutine的MDC實現並修復了網路框架在Windows系統中無法傳送大的資料的問題。

Firefly HTTP伺服器是非同步的。一個HTTP請求會跨越多個執行緒。預設的MDC將資料儲存在ThreadLocal中。這意味著預設的MDC無法跟蹤使用者請求。
我們新增了一個新的CoroutineMappedDiagnosticContext,可以通過整個HTTP請求儲存資料。
CoroutineMappedDiagnosticContext使用協程攔截器機制。您只能在Firefly HTTP伺服器Kotlin版中使用它。

首先,我們需要建立一個新的Java ServiceLoader配置來替換預設的MDC實現。在類路徑中建立一個新檔案:

classpath:/META-INF/services/com.firefly.utils.log.MappedDiagnosticContext

在此檔案中新增一個新的MDC類名稱:

com.firefly.kotlin.ext.log.CoroutineMappedDiagnosticContext

初始化CoroutineMappedDiagnosticContext:

@Injectprivate lateinit var requestCtx: CoroutineLocal<RoutingContext>@InitialMethodfun init() {    val mdc = MappedDiagnosticContextFactory.getInstance()            .mappedDiagnosticContext as CoroutineMappedDiagnosticContext    mdc.setRequestCtx(requestCtx)}

然後,我們可以在Firefly HTTP伺服器Kotlin版本中使用MDC API。如新增跟蹤ID:

val mdc = MDC.putCloseable("tracingId", UUID.randomUUID().toString().replace("-", ""))

如果在新的上下文中啟動Coroutine,則需要組合新的上下文和當前請求上下文。我們提供該方法asyncTraceable。

fun <T> asyncTraceable(context: ContinuationInterceptor = Unconfined, block: suspend CoroutineScope.() -> T): Deferred<T> = asyncTraceable(getRequestCtx(), context, block)

將新的Coroutine上下文組合到當前的請求上下文中。如:

val data = asyncTraceable(ioBlocking) {    fileInputStream.use {        `$`.io.readBytes(it)    }}.await()

更新日誌:

  1. 新增CoroutineMappedDiagnosticContext。

  2. 修復AsynchronousTcpSession無法在Windows系統上寫入大資料的問題。

Firefly 4.8.1 正式版釋出,增加 MDC 實現原文請看這裡