自定義request鏈路跟蹤

1.自定義註解類app

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Trace {

    String businessName() default "";

}

2.在須要攔截的方法上加自定義註解@Tracedom

@Trace(businessName = "線上複覈掃描出庫單號")
@Token
@RequestMapping(value = "/mst-obd-review/checkorderno", method = {RequestMethod.POST, RequestMethod.GET})
public RespJson checkorderno(@RequestParam("orderNo") String orderNo,HttpServletRequest request) {
...

3.自定義攔截器ide

public class RpcTraceInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        TraceContext traceContext = (TraceContext) TraceContext.ctx.get();
        //清除traceid
        traceContext.clear();
        //從新生成traceid
        MDC.put("traceId", traceContext.getTraceId());
        return super.preHandle(request, response, handler);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //請求結束狀況traceid
        MDC.remove("traceId");

        super.afterCompletion(request, response, handler, ex);
    }
}
public class TraceContext {
    public static ThreadLocal ctx = new InheritableThreadLocal() { //此處用InheritableThreadLocal保證能夠在子線程獲得相同的traceId
        @Override
        protected TraceContext initialValue() {
            return new TraceContext();
        }
    };

    private String traceId;

    public String getTraceId() {
        if (traceId == null || "".equals(traceId)) {
            int hashCodeV = UUID.randomUUID().toString().hashCode();
            if (hashCodeV < 0) {//有多是負數
                hashCodeV = -hashCodeV;
            }
            // 0 表明前面補充0
            // 4 表明長度爲4
            // d 表明參數爲正數型
            traceId = String.format("%012d", hashCodeV);
        }
        return traceId;
    }

    public void clear() {
        traceId = null;
    }
}
相關文章
相關標籤/搜索