From 2c7d30440877c8582048ace5266fa39bada2030e Mon Sep 17 00:00:00 2001 From: zhangjf Date: Fri, 20 Feb 2026 11:52:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DContextInterceptor?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E5=A4=B4=E6=9C=AA=E8=AE=BE=E7=BD=AEtraceId?= =?UTF-8?q?=E5=92=8CspanId=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增HEADER_SPAN_ID常量 - preHandle中生成SpanId并设置到响应头 - response.setHeader(HEADER_TRACE_ID, traceId) - response.setHeader(HEADER_SPAN_ID, spanId) --- .../common/web/ContextInterceptor.java | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/fund-common/src/main/java/com/fundplatform/common/web/ContextInterceptor.java b/fund-common/src/main/java/com/fundplatform/common/web/ContextInterceptor.java index d44f134..cf7f860 100644 --- a/fund-common/src/main/java/com/fundplatform/common/web/ContextInterceptor.java +++ b/fund-common/src/main/java/com/fundplatform/common/web/ContextInterceptor.java @@ -14,7 +14,7 @@ import org.springframework.web.servlet.HandlerInterceptor; /** * 租户和用户上下文拦截器 * 从HTTP Header中提取租户ID、用户ID、请求来源等信息,设置到ThreadLocal中 - * 同时记录请求来源和链路耗时信息 + * 同时记录请求来源和链路耗时信息,并在响应头中返回traceId和spanId */ @Component public class ContextInterceptor implements HandlerInterceptor { @@ -26,6 +26,7 @@ public class ContextInterceptor implements HandlerInterceptor { public static final String HEADER_TENANT_ID = "X-Tenant-Id"; public static final String HEADER_USER_ID = "X-User-Id"; public static final String HEADER_TRACE_ID = "X-Trace-Id"; + public static final String HEADER_SPAN_ID = "X-Span-Id"; /** * 请求开始时间属性Key @@ -80,19 +81,31 @@ public class ContextInterceptor implements HandlerInterceptor { } } - // 提取 TraceId(如不存在,后续会在需要时自动生成) + // 提取或生成 TraceId(全链路唯一标识) String traceId = request.getHeader(HEADER_TRACE_ID); if (traceId != null && !traceId.isEmpty()) { TraceContextHolder.setTraceId(traceId); + } else { + traceId = TraceContextHolder.getOrCreateTraceId(); } - // 记录请求追踪日志 + // 生成 SpanId(当前服务处理标识,每个请求唯一) + String spanId = TraceContextHolder.getOrCreateSpanId(); + + // 在响应头中返回 traceId 和 spanId,方便客户端追踪 + response.setHeader(HEADER_TRACE_ID, traceId); + response.setHeader(HEADER_SPAN_ID, spanId); + + // 记录请求追踪日志(使用spanId作为索引ID) if (sourceService != null && chainDuration != null) { - logger.info("[Trace] {} -> {} | traceId={} | chainTime={}ms | path={}", - sourceService, serviceName, traceId, chainDuration, request.getRequestURI()); + logger.info("[{}] {} -> {} | traceId={} | chainTime={}ms | path={}", + spanId, sourceService, serviceName, traceId, chainDuration, request.getRequestURI()); } else if (sourceService != null) { - logger.info("[Trace] {} -> {} | traceId={} | path={}", - sourceService, serviceName, traceId, request.getRequestURI()); + logger.info("[{}] {} -> {} | traceId={} | path={}", + spanId, sourceService, serviceName, traceId, request.getRequestURI()); + } else { + logger.info("[{}] external -> {} | traceId={} | path={}", + spanId, serviceName, traceId, request.getRequestURI()); } return true; @@ -103,12 +116,15 @@ public class ContextInterceptor implements HandlerInterceptor { Object handler, Exception ex) { // 计算当前服务处理耗时 Long startTime = (Long) request.getAttribute(ATTR_START_TIME); + String spanId = TraceContextHolder.getSpanId(); + String traceId = TraceContextHolder.getTraceId(); + String sourceService = request.getHeader(HEADER_SOURCE_SERVICE); + if (startTime != null) { long duration = System.currentTimeMillis() - startTime; - String traceId = request.getHeader(HEADER_TRACE_ID); - String sourceService = request.getHeader(HEADER_SOURCE_SERVICE); - logger.debug("[Trace] {} -> {} | traceId={} | processTime={}ms | status={}", + logger.debug("[{}] {} -> {} | traceId={} | processTime={}ms | status={}", + spanId != null ? spanId : "unknown", sourceService != null ? sourceService : "external", serviceName, traceId,