1
+ import socket
1
2
import time
2
3
import unittest
3
4
15
16
class MockConnection (object ):
16
17
"""MockConnection is used to debug and test Runtime.
17
18
"""
19
+
18
20
def __init__ (self ):
19
21
self .reports = []
20
22
self .ready = False
@@ -40,121 +42,140 @@ def clear(self):
40
42
41
43
@pytest .fixture (params = [True , False ])
42
44
def recorder (request ):
43
- runtime_args = {'collector_encryption' : 'none' ,
44
- 'collector_host' : 'localhost' ,
45
- 'collector_port' : 9998 ,
46
- 'access_token' : '{your_access_token}' ,
47
- 'component_name' : 'python/runtime_test' ,
48
- 'periodic_flush_seconds' : 0 ,
49
- 'use_thrift' : request .param ,
50
- 'use_http' : not request .param }
51
- recorder = lightstep .recorder .Recorder (runtime_args )
52
- yield recorder
53
-
54
-
55
- # ------_
56
- # HELPERS
57
- # ------_
58
- def check_spans (converter , report ):
59
- """Checks spans' name.
60
- """
61
- def setUp (self ):
62
- self .mock_connection = MockConnection ()
63
- self .mock_connection .open ()
64
- self .runtime_args = {'collector_encryption' : 'none' ,
65
- 'collector_host' : 'localhost' ,
66
- 'collector_port' : 9998 ,
67
- 'access_token' : '{your_access_token}' ,
68
- 'component_name' : 'python/runtime_test' ,
69
- 'periodic_flush_seconds' : 0 }
70
-
71
- def create_test_recorder (self ):
72
- """Returns a LightStep Recorder based on self.runtime_args.
73
- """
74
- return lightstep .recorder .Recorder (** self .runtime_args )
75
-
76
- # -------------
77
- # SHUTDOWN TESTS
78
- # -------------
79
- def test_send_spans_after_shutdown (self ):
80
- recorder = self .create_test_recorder ()
81
-
82
- # Send 10 spans
83
- for i in range (10 ):
84
- recorder .record_span (self .dummy_basic_span (recorder , i ))
85
- self .assertTrue (recorder .flush (self .mock_connection ))
86
-
87
- # Check 10 spans
88
- self .check_spans (self .mock_connection .reports [0 ].span_records )
89
-
90
- # Delete current logs and shutdown runtime
91
- self .mock_connection .clear ()
92
- recorder .shutdown ()
93
-
94
- # Send 10 spans, though none should get through
95
- for i in range (10 ):
96
- recorder .record_span (self .dummy_basic_span (recorder , i ))
97
- self .assertFalse (recorder .flush (self .mock_connection ))
98
- self .assertEqual (len (self .mock_connection .reports ), 0 )
99
-
100
- def test_shutdown_twice (self ):
101
- recorder = self .create_test_recorder ()
45
+ runtime_args = {
46
+ "collector_encryption" : "none" ,
47
+ "collector_host" : "localhost" ,
48
+ "collector_port" : 9998 ,
49
+ "access_token" : "{your_access_token}" ,
50
+ "component_name" : "python/runtime_test" ,
51
+ "periodic_flush_seconds" : 0 ,
52
+ "use_thrift" : request .param ,
53
+ "use_http" : not request .param ,
54
+ }
55
+ yield lightstep .recorder .Recorder (** runtime_args )
56
+
57
+
58
+ def test_default_tags_set_correctly (recorder ):
59
+ mock_connection = MockConnection ()
60
+ mock_connection .open ()
61
+ tags = getattr (recorder ._runtime , "tags" , None )
62
+ if tags is None :
63
+ tags = getattr (recorder ._runtime , "attrs" )
64
+ for tag in tags :
65
+ if hasattr (tag , "key" ):
66
+ if tag .key == "lightstep.hostname" :
67
+ assert tag .string_value == socket .gethostname ()
68
+ elif tag .key == "lightstep.tracer_platform" :
69
+ assert tag .string_value == "python"
70
+ else :
71
+ if tag .Key == "lightstep.hostname" :
72
+ assert tag .Value == socket .gethostname ()
73
+ elif tag .Key == "lightstep.tracer_platform" :
74
+ assert tag .Value == "python"
75
+ assert len (tags ) == 6
76
+ runtime_args = {
77
+ "collector_encryption" : "none" ,
78
+ "collector_host" : "localhost" ,
79
+ "collector_port" : 9998 ,
80
+ "access_token" : "{your_access_token}" ,
81
+ "component_name" : "python/runtime_test" ,
82
+ "periodic_flush_seconds" : 0 ,
83
+ "tags" : {
84
+ "lightstep.hostname" : "hostname" ,
85
+ },
86
+ }
87
+ new_recorder = lightstep .recorder .Recorder (** runtime_args )
88
+ for tag in new_recorder ._runtime .tags :
89
+ if tag .key == "lightstep.hostname" :
90
+ assert tag .string_value == "hostname"
91
+ assert len (new_recorder ._runtime .tags ) == 6
92
+
93
+
94
+ # --------------
95
+ # SHUTDOWN TESTS
96
+ # --------------
97
+ def test_send_spans_after_shutdown (recorder ):
98
+ mock_connection = MockConnection ()
99
+ mock_connection .open ()
100
+ # Send 10 spans
101
+ for i in range (10 ):
102
+ dummy_basic_span (recorder , i )
103
+ assert recorder .flush (mock_connection )
104
+
105
+ # Check 10 spans
106
+ check_spans (recorder .converter , mock_connection .reports [0 ])
107
+
108
+ # Delete current logs and shutdown runtime
109
+ mock_connection .clear ()
110
+ recorder .shutdown ()
111
+
112
+ # Send 10 spans, though none should get through
113
+ for i in range (10 ):
114
+ recorder .record_span (dummy_basic_span (recorder , i ))
115
+ assert not recorder .flush (mock_connection )
116
+ assert len (mock_connection .reports ) == 0
117
+
118
+
119
+ def test_shutdown_twice (recorder ):
120
+ try :
102
121
recorder .shutdown ()
103
122
recorder .shutdown ()
123
+ except Exception as error :
124
+ self .fail ("Unexpected exception raised: {}" .format (error ))
125
+
126
+
127
+ # ------------
128
+ # STRESS TESTS
129
+ # ------------
130
+ def test_stress_logs (recorder ):
131
+ mock_connection = MockConnection ()
132
+ mock_connection .open ()
133
+ for i in range (1000 ):
134
+ dummy_basic_span (recorder , i )
135
+ assert recorder .flush (mock_connection )
136
+ assert recorder .converter .num_span_records (mock_connection .reports [0 ]) == 1000
137
+ check_spans (recorder .converter , mock_connection .reports [0 ])
138
+
139
+
140
+ def test_stress_spans (recorder ):
141
+ mock_connection = MockConnection ()
142
+ mock_connection .open ()
143
+ for i in range (1000 ):
144
+ dummy_basic_span (recorder , i )
145
+ assert recorder .flush (mock_connection )
146
+ assert recorder .converter .num_span_records (mock_connection .reports [0 ]) == 1000
147
+ check_spans (recorder .converter , mock_connection .reports [0 ])
148
+
149
+
150
+ # -------------
151
+ # RUNTIME TESTS
152
+ # -------------
153
+ def test_buffer_limits (recorder ):
154
+ mock_connection = MockConnection ()
155
+ mock_connection .open ()
156
+ recorder ._max_span_records = 88
157
+
158
+ assert len (recorder ._span_records ) == 0
159
+ for i in range (0 , 100 ):
160
+ dummy_basic_span (recorder , i )
161
+ assert len (recorder ._span_records ) == 88
162
+ assert recorder .flush (mock_connection )
104
163
105
- # ------------
106
- # STRESS TESTS
107
- # ------------
108
- def test_stress_logs (self ):
109
- recorder = self .create_test_recorder ()
110
- for i in range (1000 ):
111
- recorder .record_span (self .dummy_basic_span (recorder , i ))
112
- self .assertTrue (recorder .flush (self .mock_connection ))
113
- self .assertEqual (len (self .mock_connection .reports [0 ].span_records ), 1000 )
114
- self .check_spans (self .mock_connection .reports [0 ].span_records )
115
-
116
- def test_stress_spans (self ):
117
- recorder = self .create_test_recorder ()
118
- for i in range (1000 ):
119
- recorder .record_span (self .dummy_basic_span (recorder , i ))
120
- self .assertTrue (recorder .flush (self .mock_connection ))
121
- self .assertEqual (len (self .mock_connection .reports [0 ].span_records ), 1000 )
122
- self .check_spans (self .mock_connection .reports [0 ].span_records )
123
-
124
- # -------------
125
- # RUNTIME TESTS
126
- # -------------
127
-
128
- def test_buffer_limits (self ):
129
- self .runtime_args .update ({
130
- 'max_span_records' : 88 ,
131
- })
132
- recorder = self .create_test_recorder ()
133
-
134
- self .assertEqual (len (recorder ._span_records ), 0 )
135
- for i in range (0 , 10000 ):
136
- recorder .record_span (self .dummy_basic_span (recorder , i ))
137
- self .assertEqual (len (recorder ._span_records ), 88 )
138
- self .assertTrue (recorder .flush (self .mock_connection ))
139
-
140
- # ------
141
- # HELPER
142
- # ------
143
- def check_spans (self , spans ):
144
- """Checks spans' name.
145
- """
146
- for i , span in enumerate (spans ):
147
- self .assertEqual (span .span_name , str (i ))
148
-
149
- def dummy_basic_span (self , recorder , i ):
150
- return BasicSpan (
151
- lightstep .tracer ._LightstepTracer (False , recorder , None ),
152
- operation_name = str (i ),
153
- context = SpanContext (
154
- trace_id = 1000 + i ,
155
- span_id = 2000 + i ),
156
- start_time = time .time ())
157
164
158
-
159
- if __name__ == '__main__' :
160
- unittest .main ()
165
+ def check_spans (converter , report ):
166
+ """Checks spans' name.
167
+ """
168
+ spans = converter .get_span_records (report )
169
+ for i , span in enumerate (spans ):
170
+ assert converter .get_span_name (span ) == str (i )
171
+
172
+
173
+ def dummy_basic_span (recorder , i ):
174
+ span = BasicSpan (
175
+ lightstep .tracer ._LightstepTracer (False , recorder , None ),
176
+ operation_name = str (i ),
177
+ context = SpanContext (trace_id = 1000 + i , span_id = 2000 + i ),
178
+ start_time = time .time () - 100 ,
179
+ )
180
+ span .finish ()
181
+ return span
0 commit comments