11from basictracer import Sampler , SpanRecorder
22import instana .agent_const as a
3+ import instana .http as http
4+ import instana .custom as c
35import threading as t
6+ import opentracing .ext .tags as ext
7+ import socket
8+ import instana .data as d
49
510class InstanaSpan (object ):
611 t = 0
@@ -15,7 +20,6 @@ class InstanaSpan(object):
1520 def __init__ (self , ** kwds ):
1621 self .__dict__ .update (kwds )
1722
18-
1923class InstanaRecorder (SpanRecorder ):
2024 sensor = None
2125
@@ -25,9 +29,13 @@ def __init__(self, sensor):
2529
2630 def record_span (self , span ):
2731 if self .sensor .agent .can_send ():
28- data = self .get_span_log_field (span , "data" )
29- if not data .service :
30- data .service = self .sensor .service_name
32+ data = d .Data (service = self .get_service_name (span ),
33+ http = http .HttpData (host = self .get_host_name (span ),
34+ url = self .get_string_tag (span , ext .HTTP_URL ),
35+ method = self .get_string_tag (span , ext .HTTP_METHOD ),
36+ status = self .get_tag (span , ext .HTTP_STATUS_CODE )),
37+ custom = c .CustomData (tags = span .tags ,
38+ logs = self .collect_logs (span )))
3139
3240 t .Thread (target = self .sensor .agent .request ,
3341 args = (self .sensor .agent .make_url (a .AGENT_TRACES_URL ), "POST" ,
@@ -36,24 +44,63 @@ def record_span(self, span):
3644 s = span .context .span_id ,
3745 ts = int (round (span .start_time * 1000 )),
3846 d = int (round (span .duration * 1000 )),
39- n = self .get_string_span_log_field (span , "type" ),
47+ n = self .get_http_type (span ),
4048 f = self .sensor .agent .from_ ,
4149 data = data )])).start ()
4250
43- def get_string_span_log_field (self , span , field ):
44- ret = self .get_span_log_field (span , field )
51+ def get_tag (self , span , tag ):
52+ if tag in span .tags :
53+ return span .tags [tag ]
54+
55+ return None
56+
57+ def get_string_tag (self , span , tag ):
58+ ret = self .get_tag (span , tag )
4559 if not ret :
4660 return ""
4761
4862 return ret
4963
50- def get_span_log_field (self , span , field ):
51- for e in span . logs :
52- if field in e . key_values :
53- return e . key_values [ field ]
64+ def get_host_name (self , span ):
65+ h = self . get_string_tag ( span , ext . PEER_HOSTNAME )
66+ if len ( h ) > 0 :
67+ return h
5468
55- return None
69+ h = socket .gethostname ()
70+ if h and len (h ) > 0 :
71+ return h
72+
73+ return "localhost"
74+
75+ def get_service_name (self , span ):
76+ s = self .get_string_tag (span , ext .COMPONENT )
77+ if len (s ) > 0 :
78+ return s
79+
80+ s = self .get_string_tag (span , ext .PEER_SERVICE )
81+ if len (s ) > 0 :
82+ return s
83+
84+ return self .sensor .service_name
85+
86+ def get_http_type (self , span ):
87+ k = self .get_string_tag (span , ext .SPAN_KIND )
88+ if k == ext .SPAN_KIND_RPC_CLIENT :
89+ return http .HTTP_CLIENT
90+
91+ return http .HTTP_SERVER
92+
93+ def collect_logs (self , span ):
94+ logs = {}
95+ for l in span .logs :
96+ ts = int (round (l .timestamp * 1000 ))
97+ if not ts in logs :
98+ logs [ts ] = {}
99+
100+ for f in l .key_values :
101+ logs [ts ][f ] = l .key_values [f ]
56102
103+ return logs
57104
58105class InstanaSampler (Sampler ):
59106
0 commit comments