package cn.seecoder.seecoderlog.interceptor; import cn.seecoder.seecoderlog.context.TraceContext; import cn.seecoder.seecoderlog.context.TraceInfo; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class SeecoderRequestInterceptor implements HandlerInterceptor { private static final String START_TIME = "startTime"; private static final String TRACE_INFO_ATTR = "traceInfo"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 记录请求开始时间 request.setAttribute(START_TIME, System.currentTimeMillis()); // 处理traceId和rpcId String traceId = request.getHeader("X-Trace-Id"); if (traceId == null || traceId.isEmpty()) { // 生成新的traceId traceId = TraceInfo.generateTraceId(); } String parentSpanId = request.getHeader("X-Span-Id"); String spanId = TraceInfo.generateChildSpanId(parentSpanId); TraceInfo traceInfo = new TraceInfo(traceId, spanId); // 设置到当前线程上下文 TraceContext.setTraceInfo(traceInfo); request.setAttribute(TRACE_INFO_ATTR, traceInfo); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }