簡體   English   中英

TraceId 和 SpanId 在 WebFilter 中是 null,即使它是在 TraceWebFilter 之后注冊的

[英]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

請注意以下事項:

  • 日志中的traceId和spanId為null
  • 日志中記錄的 tracer.currentSpan 為 null

關於為什么會發生這種情況的任何線索?

如果您查看TraceWebFilter ,您會發現它沒有將任何內容放入MDCMDC基本上是一個ThreadLocal並且您處於異步事件循環中)。

  1. 但它與Tracer交互,您也可以將其注入過濾器並從中獲取當前 Span: tracer.currentSpan()並從SpanTraceContext中獲取traceIdspanId

  2. 此外,它將Span放入 Exchange 屬性中:

this.exchange.getAttributes().put(TRACE_REQUEST_ATTR, span);

我建議將Tracer注入您的過濾器並從中獲取當前Span

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM