1+ import re
2+ import sys
3+ import json
14import time
25import unittest
36import opentracing
47from uuid import UUID
58from instana .util import to_json
69from instana .singletons import tracer
710
11+ PY2 = sys .version_info [0 ] == 2
12+ PY3 = sys .version_info [0 ] == 3
813
914class TestOTSpan (unittest .TestCase ):
1015 def setUp (self ):
@@ -146,7 +151,7 @@ def test_span_kind(self):
146151 span = spans [4 ]
147152 self .assertEqual (3 , span .k )
148153
149- def test_bad_tag_values (self ):
154+ def test_tag_values (self ):
150155 with tracer .start_active_span ('test' ) as scope :
151156 # Set a UUID class as a tag
152157 # If unchecked, this causes a json.dumps error: "ValueError: Circular reference detected"
@@ -155,33 +160,57 @@ def test_bad_tag_values(self):
155160 scope .span .set_tag ('tracer' , tracer )
156161 scope .span .set_tag ('none' , None )
157162 scope .span .set_tag ('mylist' , [1 , 2 , 3 ])
158-
163+ scope . span . set_tag ( 'myset' , { "one" , 2 })
159164
160165 spans = tracer .recorder .queued_spans ()
161166 assert len (spans ) == 1
162167
163168 test_span = spans [0 ]
164169 assert (test_span )
165- assert (len (test_span .data ['sdk' ]['custom' ]['tags' ]) == 4 )
166- assert (test_span .data ['sdk' ]['custom' ]['tags' ]['uuid' ] == '12345678-1234-5678-1234-567812345678' )
170+ assert (len (test_span .data ['sdk' ]['custom' ]['tags' ]) == 5 )
171+ assert (test_span .data ['sdk' ]['custom' ]['tags' ]['uuid' ] == "UUID( '12345678-1234-5678-1234-567812345678')" )
167172 assert (test_span .data ['sdk' ]['custom' ]['tags' ]['tracer' ])
168173 assert (test_span .data ['sdk' ]['custom' ]['tags' ]['none' ] == 'None' )
169174 assert (test_span .data ['sdk' ]['custom' ]['tags' ]['mylist' ] == [1 , 2 , 3 ])
170-
175+ if PY2 :
176+ set_regexp = re .compile (r"set\(\[.*,.*\]\)" )
177+ assert (set_regexp .search (test_span .data ['sdk' ]['custom' ]['tags' ]['myset' ]))
178+ else :
179+ set_regexp = re .compile (r"\{.*,.*\}" )
180+ assert (set_regexp .search (test_span .data ['sdk' ]['custom' ]['tags' ]['myset' ]))
181+
182+ # Convert to JSON
171183 json_data = to_json (test_span )
172184 assert (json_data )
173185
174- def test_bad_tag_names (self ):
186+ # And back
187+ span_dict = json .loads (json_data )
188+ assert (len (span_dict ['data' ]['sdk' ]['custom' ]['tags' ]) == 5 )
189+ assert (span_dict ['data' ]['sdk' ]['custom' ]['tags' ]['uuid' ] == "UUID('12345678-1234-5678-1234-567812345678')" )
190+ assert (span_dict ['data' ]['sdk' ]['custom' ]['tags' ]['tracer' ])
191+ assert (span_dict ['data' ]['sdk' ]['custom' ]['tags' ]['none' ] == 'None' )
192+ assert (span_dict ['data' ]['sdk' ]['custom' ]['tags' ]['mylist' ] == [1 , 2 , 3 ])
193+ if PY2 :
194+ set_regexp = re .compile (r"set\(\[.*,.*\]\)" )
195+ assert (set_regexp .search (test_span .data ['sdk' ]['custom' ]['tags' ]['myset' ]))
196+ else :
197+ set_regexp = re .compile (r"{.*,.*}" )
198+ assert (set_regexp .search (test_span .data ['sdk' ]['custom' ]['tags' ]['myset' ]))
199+
200+ def test_tag_names (self ):
175201 with tracer .start_active_span ('test' ) as scope :
176202 # Tag names (keys) must be strings
177203 scope .span .set_tag (1234567890 , 'This should not get set' )
204+ # Unicode key name
205+ scope .span .set_tag (u'asdf' , 'This should be ok' )
178206
179207 spans = tracer .recorder .queued_spans ()
180208 assert len (spans ) == 1
181209
182210 test_span = spans [0 ]
183211 assert (test_span )
184- assert (len (test_span .data ['sdk' ]['custom' ]['tags' ]) == 0 )
212+ assert (len (test_span .data ['sdk' ]['custom' ]['tags' ]) == 1 )
213+ assert (test_span .data ['sdk' ]['custom' ]['tags' ]['asdf' ] == 'This should be ok' )
185214
186215 json_data = to_json (test_span )
187216 assert (json_data )
0 commit comments