我有一個 bean,它是 MessageHandler 來處理傳入的訊息。訊息處理程式的型別為org.springframework.integration.aws.outbound.S3MessageHandler,它將訊息上傳到亞馬遜 s3。問題是,這個訊息處理程式的操作是在不同的執行緒中執行的。如何確保我可以跟蹤事務 ID 一直傳播到執行此事務的執行緒?
DEBUG [app-name,,] 22540 --- [anager-worker-1]
附加到此訊息處理程式的還有一個型別為 的進度偵聽器com.amazonaws.services.s3.transfer.internal.S3ProgressListener。對此偵聽器的回呼完全在不同的執行緒中執行。我也需要此偵聽器中的跟蹤 ID。
INFO [app-name,,] 22540 --- [callback-thread]
uj5u.com熱心網友回復:
您可以使用MDC日志記錄功能并記錄您的跟蹤 ID 和跨度 ID。
您有多個執行緒進行處理的關鍵問題導致質疑如何關聯它們之間的日志..所以,
- 把
traceidspanunique message id到MDC執行緒在處理請求 - 把
uniq message id成MDC線的那MessageHelper用途 - 修改您的附加程式以將
traceid,span,列印unique message id到日志中
ELK(或任何類似工具,甚至grep)可以很好地索引此類欄位。然后,通過在日志中搜索,uniq message id您將找到所有日志記錄 執行緒名稱和其他詳細資訊,例如traceid和spanid
uj5u.com熱心網友回復:
Sleuth 可以為您完成此操作,您需要查看檔案如何使用其 API:https : //docs.spring.io/spring-cloud-sleuth/docs/current/reference/html/using.html#using-creating -and-end-spans
正如您在那里看到的,您可以創建一個Span,也可以創建一個Scope(in SpanInScope )。該Scope負責背景關系傳播,如:處理MDC給你,讓你不需要做與MDC什么事。
您需要做的是正確使用此 API,以便傳播背景關系。這通常是通過檢測ExuecutorService/CompletionService和/或Runnable/ Callable(無論您使用哪個)來完成的。以下是如何實作這樣的事情:
- 獲取
Span呼叫者執行緒中的當前(tracer.currentSpan()) - 使用此跨度并在“其他”執行緒(執行緒池內部)中創建一個
Scope(Span如果需要,還可以創建一個新的)
你不需要自己做這件事,Sleuth 有一個TraceRunnable(這正是我上面描述的)和一個TraceableExecutorService.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/386977.html
