package net.dubboclub.tracing.client; import com.alibaba.dubbo.rpc.Invocation; import com.alibaba.dubbo.rpc.Invoker; import net.dubboclub.tracing.api.Span; import java.util.EmptyStackException; import java.util.Stack; /** * Created by Zetas on 2016/7/8. */ public class ContextHolder { //一个线程中span栈,用来存放一个线程中多个span情况 private static ThreadLocal<Stack<Span>> localSpan = new ThreadLocal<Stack<Span>>(){ @Override protected Stack<Span> initialValue() { return new Stack<Span>(); } }; private static ThreadLocal<String> localTraceId = new ThreadLocal<String>(); private static ThreadLocal<Boolean> localSample = new ThreadLocal<Boolean>(){ @Override protected Boolean initialValue() { return true; } }; static String getTraceId(){ return localTraceId.get(); } static void setTraceId(String traceId){ localTraceId.set(traceId); } static void removeTraceId(){ localTraceId.remove(); } static boolean isSample(){ return localSample.get(); } static void setLocalSample(boolean isSample){ localSample.set(isSample); } static void removeSample(){ localSample.remove(); } static void setSpan(Span span) { ContextHolder.localSpan.get().push(span); } static Span getSpan() { try { return localSpan.get().peek(); }catch (EmptyStackException e){ return null; } } static Span popSpan(){ try { return localSpan.get().pop(); }catch (EmptyStackException e){ return null; } } static void removeSpan() { localSpan.remove(); } public static void removeAll() { if(localSpan.get().size()<=0){//span堆栈为空的时候才能清除 removeSpan(); removeTraceId(); removeSample(); } } }