1 module hunt.trace.Tracer; 2 3 import hunt.trace.Endpoint; 4 import hunt.trace.Span; 5 import hunt.trace.Utils; 6 import hunt.trace.Constrants; 7 8 import std.string; 9 10 private static Tracer g_tracer; 11 12 Tracer getTracer() 13 { 14 return g_tracer; 15 } 16 17 void setTracer(Tracer tracer) 18 { 19 g_tracer = tracer; 20 } 21 22 class Tracer 23 { 24 __gshared EndPoint localEndpoint; 25 __gshared bool upload; 26 Span root; 27 Span[] children; 28 29 this(string spanName , string b3Header = string.init) 30 { 31 root = new Span(); 32 if( b3Header != string.init ) 33 { 34 string[] args = b3Header.split("-"); 35 if(args.length >= 4) 36 { 37 root.traceId = args[0]; 38 root.parentId = args[1]; 39 root.id = args[3]; 40 } 41 } 42 43 if(root.traceId == string.init) 44 { 45 root.traceId = LID; 46 root.id = ID; 47 } 48 49 root.name = spanName; 50 root.kind = KindOfServer; 51 root.localEndpoint = localEndpoint; 52 } 53 54 Span addSpan( string spanName) 55 { 56 auto span = new Span(); 57 span.traceId = root.traceId; 58 span.name = spanName; 59 span.id = ID; 60 span.parentId = root.id; 61 span.kind = KindOfClient; 62 span.localEndpoint = localEndpoint; 63 children ~= span; 64 return span; 65 } 66 }