[英]TraceId and SpanId not available after migrating to Spring Boot 3
[英]TraceId and SpanId are null in WebFilter even when it is registered after TraceWebFilter
我目前正在使用帶有2020.0.0
Boot 2.4.2
的 2020.0.0 並注冊了一個自定義 web 過濾器,該過濾器記錄了來自請求的信息(順序為webProperties.filterOrder + 1
- 所以它應該在 TraceWebFilter 之后注冊)。 由於某種原因,traceId 和 spanId 不在 MDC 中(因此不記錄)。
網絡過濾器實現:
class TraceWebFilter(
private val webProperties: SleuthWebProperties,
private val tracer: Tracer
): WebFilter, Ordered {
override fun getOrder(): Int = webProperties.filterOrder + 1
override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
logger.debug { "Building trace web filter" }
return Mono.defer {
MDC.put("Request-Method", exchange.request.method?.toString())
MDC.put("Request-Path", exchange.request.path.toString())
logger.info { tracer.currentSpan() }
logger.info { ">> headers=${exchange.request.headers}" }
logger.info { ">> method=${exchange.request.method}" }
logger.info { ">> path=${exchange.request.path}" }
exchange.response.beforeCommit {
Mono.fromRunnable {
logger.info { "<< headers=${exchange.response.headers}" }
logger.info { "<< status=${exchange.response.rawStatusCode}" }
}
}
chain.filter(exchange)
}
}
}
日志:
app_1 | 2021-01-28 04:43:24.420 DEBUG [user-service,method=,path=,traceId=,spanId=] 1 --- [p-nio-80-exec-2] o.s.c.s.instrument.web.TraceWebFilter : Received a request to uri [/users]
app_1 | 2021-01-28 04:43:24.566 DEBUG [user-service,method=,path=,traceId=,spanId=] 1 --- [p-nio-80-exec-2] o.s.c.s.instrument.web.TraceWebFilter : Handled receive of span RealSpan(9b7383611e5a3bc2/9b7383611e5a3bc2)
app_1 | 2021-01-28 04:43:24.633 DEBUG [user-service,method=,path=,traceId=,spanId=] 1 --- [p-nio-80-exec-2] c.p.p.components.tracing.TraceWebFilter : Building trace web filter
app_1 | 2021-01-28 04:43:24.638 INFO [user-service,method=POST,path=/users,traceId=,spanId=] 1 --- [p-nio-80-exec-2] c.p.p.components.tracing.TraceWebFilter : null
app_1 | 2021-01-28 04:43:24.694 INFO [user-service,method=POST,path=/users,traceId=,spanId=] 1 --- [p-nio-80-exec-2] c.p.p.components.tracing.TraceWebFilter : >> headers=[content-type:"application/json", user-agent:"PostmanRuntime/7.26.8", accept:"*/*", cache-control:"no-cache", postman-token:"18d99e30-ce7a-4659-a2c1-21020d8bf2b5", host:"localhost:9100", accept-encoding:"gzip, deflate, br", connection:"keep-alive", content-length:"2"]
app_1 | 2021-01-28 04:43:24.699 INFO [user-service,method=POST,path=/users,traceId=,spanId=] 1 --- [p-nio-80-exec-2] c.p.p.components.tracing.TraceWebFilter : >> method=POST
app_1 | 2021-01-28 04:43:24.747 INFO [user-service,method=POST,path=/users,traceId=,spanId=] 1 --- [p-nio-80-exec-2] c.p.p.components.tracing.TraceWebFilter : >> path=/users
請注意以下事項:
關於為什么會發生這種情況的任何線索?
如果您查看TraceWebFilter
,您會發現它沒有將任何內容放入MDC
( MDC
基本上是一個ThreadLocal
並且您處於異步事件循環中)。
但它與Tracer
交互,您也可以將其注入過濾器並從中獲取當前 Span: tracer.currentSpan()
並從Span
的TraceContext
中獲取traceId
和spanId
。
此外,它將Span
放入 Exchange 屬性中:
this.exchange.getAttributes().put(TRACE_REQUEST_ATTR, span);
我建議將Tracer
注入您的過濾器並從中獲取當前Span
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.