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 }