diff --git a/instana/span.py b/instana/span.py index b01c9c54..d1b72ae2 100644 --- a/instana/span.py +++ b/instana/span.py @@ -104,12 +104,10 @@ def __init__(self, span, source, service_name, **kwargs): self.f = source self.ec = span.tags.pop('ec', None) self.data = DictionaryOfStan() + self.stack = span.stack - if span.synthetic: - self.sy = True - - if span.stack: - self.stack = span.stack + if span.synthetic is True: + self.sy = span.synthetic self.__dict__.update(kwargs) diff --git a/instana/tracer.py b/instana/tracer.py index 0fd29c2c..7d1b3b1e 100644 --- a/instana/tracer.py +++ b/instana/tracer.py @@ -104,10 +104,6 @@ def start_span(self, if operation_name in RegisteredSpan.EXIT_SPANS: self.__add_stack(span) - elif operation_name in RegisteredSpan.ENTRY_SPANS: - # For entry spans, add only a backtrace fingerprint - self.__add_stack(span, limit=2) - return span def inject(self, span_context, format, carrier): @@ -122,33 +118,42 @@ def extract(self, format, carrier): raise ot.UnsupportedFormatException() - def __add_stack(self, span, limit=None): - """ Adds a backtrace to this span """ - span.stack = [] - frame_count = 0 - - tb = traceback.extract_stack() - tb.reverse() - for frame in tb: - if limit is not None and frame_count >= limit: - break - - # Exclude Instana frames unless we're in dev mode - if "INSTANA_DEBUG" not in os.environ: - if re_tracer_frame.search(frame[0]) is not None: - continue - - if re_with_stan_frame.search(frame[2]) is not None: - continue - - span.stack.append({ - "c": frame[0], - "n": frame[1], - "m": frame[2] - }) - - if limit is not None: - frame_count += 1 + def __add_stack(self, span, limit=30): + """ + Adds a backtrace to . The default length limit for + stack traces is 30 frames. A hard limit of 40 frames is enforced. + """ + try: + sanitized_stack = [] + if limit > 40: + limit = 40 + + trace_back = traceback.extract_stack() + trace_back.reverse() + for frame in trace_back: + # Exclude Instana frames unless we're in dev mode + if "INSTANA_DEBUG" not in os.environ: + if re_tracer_frame.search(frame[0]) is not None: + continue + + if re_with_stan_frame.search(frame[2]) is not None: + continue + + sanitized_stack.append({ + "c": frame[0], + "n": frame[1], + "m": frame[2] + }) + + if len(sanitized_stack) > limit: + # (limit * -1) gives us negative form of used for + # slicing from the end of the list. e.g. stack[-30:] + span.stack = sanitized_stack[(limit*-1):] + else: + span.stack = sanitized_stack + except Exception: + # No fail + pass # Used by __add_stack diff --git a/tests/clients/test_urllib3.py b/tests/clients/test_urllib3.py index 2b763bb5..f6dfc879 100644 --- a/tests/clients/test_urllib3.py +++ b/tests/clients/test_urllib3.py @@ -62,8 +62,7 @@ def test_get_request(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -110,8 +109,7 @@ def test_get_request_with_query(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -159,8 +157,7 @@ def test_get_request_with_alt_query(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -208,8 +205,7 @@ def test_put_request(self): self.assertEqual('PUT', wsgi_span.data["http"]["method"]) self.assertEqual(404, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -265,8 +261,7 @@ def test_301_redirect(self): self.assertEqual('GET', wsgi_span1.data["http"]["method"]) self.assertEqual(200, wsgi_span1.data["http"]["status"]) self.assertIsNone(wsgi_span1.data["http"]["error"]) - self.assertIsNotNone(wsgi_span1.stack) - self.assertEqual(2, len(wsgi_span1.stack)) + self.assertIsNone(wsgi_span1.stack) self.assertEqual("wsgi", wsgi_span2.n) self.assertEqual('127.0.0.1:' + str(testenv["wsgi_port"]), wsgi_span2.data["http"]["host"]) @@ -274,8 +269,7 @@ def test_301_redirect(self): self.assertEqual('GET', wsgi_span2.data["http"]["method"]) self.assertEqual(301, wsgi_span2.data["http"]["status"]) self.assertIsNone(wsgi_span2.data["http"]["error"]) - self.assertIsNotNone(wsgi_span2.stack) - self.assertEqual(2, len(wsgi_span2.stack)) + self.assertIsNone(wsgi_span2.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -339,8 +333,7 @@ def test_302_redirect(self): self.assertEqual('GET', wsgi_span1.data["http"]["method"]) self.assertEqual(200, wsgi_span1.data["http"]["status"]) self.assertIsNone(wsgi_span1.data["http"]["error"]) - self.assertIsNotNone(wsgi_span1.stack) - self.assertEqual(2, len(wsgi_span1.stack)) + self.assertIsNone(wsgi_span1.stack) self.assertEqual("wsgi", wsgi_span2.n) self.assertEqual('127.0.0.1:' + str(testenv["wsgi_port"]), wsgi_span2.data["http"]["host"]) @@ -348,8 +341,7 @@ def test_302_redirect(self): self.assertEqual('GET', wsgi_span2.data["http"]["method"]) self.assertEqual(302, wsgi_span2.data["http"]["status"]) self.assertIsNone(wsgi_span2.data["http"]["error"]) - self.assertIsNotNone(wsgi_span2.stack) - self.assertEqual(2, len(wsgi_span2.stack)) + self.assertIsNone(wsgi_span2.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -405,8 +397,7 @@ def test_5xx_request(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(504, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -457,8 +448,7 @@ def test_exception_logging(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(500, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -545,8 +535,7 @@ def test_requestspkg_get(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -596,8 +585,7 @@ def test_requestspkg_get_with_custom_headers(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -643,8 +631,7 @@ def test_requestspkg_put(self): self.assertEqual('PUT', wsgi_span.data["http"]["method"]) self.assertEqual(404, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -694,8 +681,7 @@ def test_response_header_capture(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) diff --git a/tests/frameworks/test_aiohttp_server.py b/tests/frameworks/test_aiohttp_server.py index 9071c391..c9b96ebe 100644 --- a/tests/frameworks/test_aiohttp_server.py +++ b/tests/frameworks/test_aiohttp_server.py @@ -72,9 +72,7 @@ async def test(): self.assertEqual(testenv["aiohttp_server"] + "/", aioserver_span.data["http"]["url"]) self.assertEqual("GET", aioserver_span.data["http"]["method"]) - self.assertIsNotNone(aioserver_span.stack) - self.assertTrue(isinstance(aioserver_span.stack, list)) - self.assertTrue(len(aioserver_span.stack) > 1) + self.assertIsNone(aioserver_span.stack) self.assertEqual("aiohttp-client", aioclient_span.n) self.assertEqual(200, aioclient_span.data["http"]["status"]) @@ -136,9 +134,7 @@ async def test(): self.assertEqual(testenv["aiohttp_server"] + "/204", aioserver_span.data["http"]["url"]) self.assertEqual("GET", aioserver_span.data["http"]["method"]) - self.assertIsNotNone(aioserver_span.stack) - self.assertTrue(isinstance(aioserver_span.stack, list)) - self.assertTrue(len(aioserver_span.stack) > 1) + self.assertIsNone(aioserver_span.stack) self.assertEqual("aiohttp-client", aioclient_span.n) self.assertEqual(204, aioclient_span.data["http"]["status"]) @@ -220,9 +216,7 @@ async def test(): self.assertEqual("GET", aioserver_span.data["http"]["method"]) self.assertEqual("secret=", aioserver_span.data["http"]["params"]) - self.assertIsNotNone(aioserver_span.stack) - self.assertTrue(isinstance(aioserver_span.stack, list)) - self.assertTrue(len(aioserver_span.stack) > 1) + self.assertIsNone(aioserver_span.stack) self.assertEqual("aiohttp-client", aioclient_span.n) self.assertEqual(200, aioclient_span.data["http"]["status"]) @@ -291,9 +285,7 @@ async def test(): self.assertEqual("GET", aioserver_span.data["http"]["method"]) self.assertEqual("secret=", aioserver_span.data["http"]["params"]) - self.assertIsNotNone(aioserver_span.stack) - self.assertTrue(isinstance(aioserver_span.stack, list)) - self.assertTrue(len(aioserver_span.stack) > 1) + self.assertIsNone(aioserver_span.stack) self.assertEqual("aiohttp-client", aioclient_span.n) self.assertEqual(200, aioclient_span.data["http"]["status"]) @@ -357,9 +349,7 @@ async def test(): self.assertEqual(testenv["aiohttp_server"] + "/401", aioserver_span.data["http"]["url"]) self.assertEqual("GET", aioserver_span.data["http"]["method"]) - self.assertIsNotNone(aioserver_span.stack) - self.assertTrue(isinstance(aioserver_span.stack, list)) - self.assertTrue(len(aioserver_span.stack) > 1) + self.assertIsNone(aioserver_span.stack) self.assertEqual("aiohttp-client", aioclient_span.n) self.assertEqual(401, aioclient_span.data["http"]["status"]) @@ -416,9 +406,7 @@ async def test(): self.assertEqual(testenv["aiohttp_server"] + "/500", aioserver_span.data["http"]["url"]) self.assertEqual("GET", aioserver_span.data["http"]["method"]) - self.assertIsNotNone(aioserver_span.stack) - self.assertTrue(isinstance(aioserver_span.stack, list)) - self.assertTrue(len(aioserver_span.stack) > 1) + self.assertIsNone(aioserver_span.stack) self.assertEqual("aiohttp-client", aioclient_span.n) self.assertEqual(500, aioclient_span.data["http"]["status"]) @@ -477,9 +465,7 @@ async def test(): self.assertEqual(testenv["aiohttp_server"] + "/exception", aioserver_span.data["http"]["url"]) self.assertEqual("GET", aioserver_span.data["http"]["method"]) - self.assertIsNotNone(aioserver_span.stack) - self.assertTrue(isinstance(aioserver_span.stack, list)) - self.assertTrue(len(aioserver_span.stack) > 1) + self.assertIsNone(aioserver_span.stack) self.assertEqual("aiohttp-client", aioclient_span.n) self.assertEqual(500, aioclient_span.data["http"]["status"]) diff --git a/tests/frameworks/test_django.py b/tests/frameworks/test_django.py index eec217ac..02b8d365 100644 --- a/tests/frameworks/test_django.py +++ b/tests/frameworks/test_django.py @@ -71,8 +71,7 @@ def test_basic_request(self): self.assertEqual('/', django_span.data["http"]["url"]) self.assertEqual('GET', django_span.data["http"]["method"]) self.assertEqual(200, django_span.data["http"]["status"]) - assert django_span.stack - self.assertEqual(2, len(django_span.stack)) + self.assertIsNone(django_span.stack) def test_synthetic_request(self): headers = { @@ -154,8 +153,7 @@ def test_request_with_error(self): self.assertEqual('GET', django_span.data["http"]["method"]) self.assertEqual(500, django_span.data["http"]["status"]) self.assertEqual('This is a fake error: /cause-error', django_span.data["http"]["error"]) - assert(django_span.stack) - self.assertEqual(2, len(django_span.stack)) + self.assertIsNone(django_span.stack) def test_complex_request(self): with tracer.start_active_span('test'): @@ -204,8 +202,7 @@ def test_complex_request(self): self.assertEqual(ot_span2.p, ot_span1.s) self.assertEqual(None, django_span.ec) - assert(django_span.stack) - self.assertEqual(2, len(django_span.stack)) + self.assertIsNone(django_span.stack) self.assertEqual('/complex', django_span.data["http"]["url"]) self.assertEqual('GET', django_span.data["http"]["method"]) @@ -244,8 +241,7 @@ def test_custom_header_capture(self): self.assertEqual(django_span.p, urllib3_span.s) self.assertEqual(None, django_span.ec) - assert(django_span.stack) - self.assertEqual(2, len(django_span.stack)) + self.assertIsNone(django_span.stack) self.assertEqual('/', django_span.data["http"]["url"]) self.assertEqual('GET', django_span.data["http"]["method"]) diff --git a/tests/frameworks/test_flask.py b/tests/frameworks/test_flask.py index 6c1d1745..4def7420 100644 --- a/tests/frameworks/test_flask.py +++ b/tests/frameworks/test_flask.py @@ -84,9 +84,7 @@ def test_get_request(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -183,9 +181,7 @@ def test_render_template(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -263,9 +259,7 @@ def test_render_template_string(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -332,9 +326,7 @@ def test_301(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(301, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -401,9 +393,7 @@ def test_custom_404(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(404, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -470,9 +460,7 @@ def test_404(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(404, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -539,9 +527,7 @@ def test_500(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(500, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -617,9 +603,7 @@ def test_render_error(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(500, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -686,9 +670,7 @@ def test_exception(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(500, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -762,9 +744,7 @@ def test_custom_exception_with_log(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(502, wsgi_span.data["http"]["status"]) self.assertEqual('Simulated custom exception', wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) @@ -830,9 +810,7 @@ def test_path_templates(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) - self.assertIsNone(wsgi_span.data['service']) + self.assertIsNone(wsgi_span.stack) # urllib3 self.assertEqual("test", test_span.data["sdk"]["name"]) diff --git a/tests/frameworks/test_grpcio.py b/tests/frameworks/test_grpcio.py index 373edf18..dbc6c75d 100644 --- a/tests/frameworks/test_grpcio.py +++ b/tests/frameworks/test_grpcio.py @@ -85,8 +85,7 @@ def test_unary_one_to_one(self): # rpc-server self.assertEqual(server_span.n, 'rpc-server') self.assertEqual(server_span.k, 1) - self.assertIsNotNone(server_span.stack) - self.assertEqual(2, len(server_span.stack)) + self.assertIsNone(server_span.stack) self.assertEqual(server_span.data["rpc"]["flavor"], 'grpc') self.assertEqual(server_span.data["rpc"]["call"], '/stan.Stan/OneQuestionOneResponse') self.assertEqual(server_span.data["rpc"]["host"], testenv["grpc_host"]) @@ -146,8 +145,7 @@ def test_streaming_many_to_one(self): # rpc-server self.assertEqual(server_span.n, 'rpc-server') self.assertEqual(server_span.k, 1) - self.assertIsNotNone(server_span.stack) - self.assertEqual(2, len(server_span.stack)) + self.assertIsNone(server_span.stack) self.assertEqual(server_span.data["rpc"]["flavor"], 'grpc') self.assertEqual(server_span.data["rpc"]["call"], '/stan.Stan/ManyQuestionsOneResponse') self.assertEqual(server_span.data["rpc"]["host"], testenv["grpc_host"]) @@ -210,8 +208,7 @@ def test_streaming_one_to_many(self): # rpc-server self.assertEqual(server_span.n, 'rpc-server') self.assertEqual(server_span.k, 1) - self.assertIsNotNone(server_span.stack) - self.assertEqual(2, len(server_span.stack)) + self.assertIsNone(server_span.stack) self.assertEqual(server_span.data["rpc"]["flavor"], 'grpc') self.assertEqual(server_span.data["rpc"]["call"], '/stan.Stan/OneQuestionManyResponses') self.assertEqual(server_span.data["rpc"]["host"], testenv["grpc_host"]) @@ -273,8 +270,7 @@ def test_streaming_many_to_many(self): # rpc-server self.assertEqual(server_span.n, 'rpc-server') self.assertEqual(server_span.k, 1) - self.assertIsNotNone(server_span.stack) - self.assertEqual(2, len(server_span.stack)) + self.assertIsNone(server_span.stack) self.assertEqual(server_span.data["rpc"]["flavor"], 'grpc') self.assertEqual(server_span.data["rpc"]["call"], '/stan.Stan/ManyQuestionsManyReponses') self.assertEqual(server_span.data["rpc"]["host"], testenv["grpc_host"]) @@ -332,8 +328,7 @@ def test_unary_one_to_one_with_call(self): # rpc-server self.assertEqual(server_span.n, 'rpc-server') self.assertEqual(server_span.k, 1) - self.assertIsNotNone(server_span.stack) - self.assertEqual(2, len(server_span.stack)) + self.assertIsNone(server_span.stack) self.assertEqual(server_span.data["rpc"]["flavor"], 'grpc') self.assertEqual(server_span.data["rpc"]["call"], '/stan.Stan/OneQuestionOneResponse') self.assertEqual(server_span.data["rpc"]["host"], testenv["grpc_host"]) @@ -392,8 +387,7 @@ def test_streaming_many_to_one_with_call(self): # rpc-server self.assertEqual(server_span.n, 'rpc-server') self.assertEqual(server_span.k, 1) - self.assertIsNotNone(server_span.stack) - self.assertEqual(2, len(server_span.stack)) + self.assertIsNone(server_span.stack) self.assertEqual(server_span.data["rpc"]["flavor"], 'grpc') self.assertEqual(server_span.data["rpc"]["call"], '/stan.Stan/ManyQuestionsOneResponse') self.assertEqual(server_span.data["rpc"]["host"], testenv["grpc_host"]) @@ -456,8 +450,7 @@ def process_response(future): # rpc-server self.assertEqual(server_span.n, 'rpc-server') self.assertEqual(server_span.k, 1) - self.assertIsNotNone(server_span.stack) - self.assertEqual(2, len(server_span.stack)) + self.assertIsNone(server_span.stack) self.assertEqual(server_span.data["rpc"]["flavor"], 'grpc') self.assertEqual(server_span.data["rpc"]["call"], '/stan.Stan/OneQuestionOneResponse') self.assertEqual(server_span.data["rpc"]["host"], testenv["grpc_host"]) @@ -522,8 +515,7 @@ def process_response(future): # rpc-server self.assertEqual(server_span.n, 'rpc-server') self.assertEqual(server_span.k, 1) - self.assertIsNotNone(server_span.stack) - self.assertEqual(2, len(server_span.stack)) + self.assertIsNone(server_span.stack) self.assertEqual(server_span.data["rpc"]["flavor"], 'grpc') self.assertEqual(server_span.data["rpc"]["call"], '/stan.Stan/ManyQuestionsOneResponse') self.assertEqual(server_span.data["rpc"]["host"], testenv["grpc_host"]) @@ -585,8 +577,7 @@ def test_server_error(self): # rpc-server self.assertEqual(server_span.n, 'rpc-server') self.assertEqual(server_span.k, 1) - self.assertIsNotNone(server_span.stack) - self.assertEqual(2, len(server_span.stack)) + self.assertIsNone(server_span.stack) self.assertEqual(server_span.data["rpc"]["flavor"], 'grpc') self.assertEqual(server_span.data["rpc"]["call"], '/stan.Stan/OneQuestionOneErrorResponse') self.assertEqual(server_span.data["rpc"]["host"], testenv["grpc_host"]) diff --git a/tests/frameworks/test_tornado_server.py b/tests/frameworks/test_tornado_server.py index 155924de..b61d37c4 100644 --- a/tests/frameworks/test_tornado_server.py +++ b/tests/frameworks/test_tornado_server.py @@ -88,9 +88,7 @@ async def test(): self.assertEqual(testenv["tornado_server"] + "/", tornado_span.data["http"]["url"]) self.assertIsNone(tornado_span.data["http"]["params"]) self.assertEqual("GET", tornado_span.data["http"]["method"]) - self.assertIsNotNone(tornado_span.stack) - self.assertTrue(type(tornado_span.stack) is list) - self.assertTrue(len(tornado_span.stack) > 1) + self.assertIsNone(tornado_span.stack) self.assertEqual(200, aiohttp_span.data["http"]["status"]) self.assertEqual(testenv["tornado_server"] + "/", aiohttp_span.data["http"]["url"]) @@ -151,9 +149,7 @@ async def test(): self.assertEqual(testenv["tornado_server"] + "/", tornado_span.data["http"]["url"]) self.assertIsNone(tornado_span.data["http"]["params"]) self.assertEqual("POST", tornado_span.data["http"]["method"]) - self.assertIsNotNone(tornado_span.stack) - self.assertTrue(type(tornado_span.stack) is list) - self.assertTrue(len(tornado_span.stack) > 1) + self.assertIsNone(tornado_span.stack) self.assertEqual(200, aiohttp_span.data["http"]["status"]) self.assertEqual(testenv["tornado_server"] + "/", aiohttp_span.data["http"]["url"]) @@ -245,16 +241,12 @@ async def test(): self.assertEqual(testenv["tornado_server"] + "/301", tornado_301_span.data["http"]["url"]) self.assertIsNone(tornado_span.data["http"]["params"]) self.assertEqual("GET", tornado_301_span.data["http"]["method"]) - self.assertIsNotNone(tornado_301_span.stack) - self.assertTrue(type(tornado_301_span.stack) is list) - self.assertTrue(len(tornado_301_span.stack) > 1) + self.assertIsNone(tornado_301_span.stack) self.assertEqual(200, tornado_span.data["http"]["status"]) self.assertEqual(testenv["tornado_server"] + "/", tornado_span.data["http"]["url"]) self.assertEqual("GET", tornado_span.data["http"]["method"]) - self.assertIsNotNone(tornado_span.stack) - self.assertTrue(type(tornado_span.stack) is list) - self.assertTrue(len(tornado_span.stack) > 1) + self.assertIsNone(tornado_span.stack) self.assertEqual(200, aiohttp_span.data["http"]["status"]) self.assertEqual(testenv["tornado_server"] + "/301", aiohttp_span.data["http"]["url"]) @@ -315,9 +307,7 @@ async def test(): self.assertEqual(testenv["tornado_server"] + "/405", tornado_span.data["http"]["url"]) self.assertIsNone(tornado_span.data["http"]["params"]) self.assertEqual("GET", tornado_span.data["http"]["method"]) - self.assertIsNotNone(tornado_span.stack) - self.assertTrue(type(tornado_span.stack) is list) - self.assertTrue(len(tornado_span.stack) > 1) + self.assertIsNone(tornado_span.stack) self.assertEqual(405, aiohttp_span.data["http"]["status"]) self.assertEqual(testenv["tornado_server"] + "/405", aiohttp_span.data["http"]["url"]) @@ -378,9 +368,7 @@ async def test(): self.assertEqual(testenv["tornado_server"] + "/500", tornado_span.data["http"]["url"]) self.assertIsNone(tornado_span.data["http"]["params"]) self.assertEqual("GET", tornado_span.data["http"]["method"]) - self.assertIsNotNone(tornado_span.stack) - self.assertTrue(type(tornado_span.stack) is list) - self.assertTrue(len(tornado_span.stack) > 1) + self.assertIsNone(tornado_span.stack) self.assertEqual(500, aiohttp_span.data["http"]["status"]) self.assertEqual(testenv["tornado_server"] + "/500", aiohttp_span.data["http"]["url"]) @@ -442,9 +430,7 @@ async def test(): self.assertEqual(testenv["tornado_server"] + "/504", tornado_span.data["http"]["url"]) self.assertIsNone(tornado_span.data["http"]["params"]) self.assertEqual("GET", tornado_span.data["http"]["method"]) - self.assertIsNotNone(tornado_span.stack) - self.assertTrue(type(tornado_span.stack) is list) - self.assertTrue(len(tornado_span.stack) > 1) + self.assertIsNone(tornado_span.stack) self.assertEqual(504, aiohttp_span.data["http"]["status"]) self.assertEqual(testenv["tornado_server"] + "/504", aiohttp_span.data["http"]["url"]) @@ -506,9 +492,7 @@ async def test(): self.assertEqual(testenv["tornado_server"] + "/", tornado_span.data["http"]["url"]) self.assertEqual("secret=", tornado_span.data["http"]["params"]) self.assertEqual("GET", tornado_span.data["http"]["method"]) - self.assertIsNotNone(tornado_span.stack) - self.assertTrue(type(tornado_span.stack) is list) - self.assertTrue(len(tornado_span.stack) > 1) + self.assertIsNone(tornado_span.stack) self.assertEqual(200, aiohttp_span.data["http"]["status"]) self.assertEqual(testenv["tornado_server"] + "/", aiohttp_span.data["http"]["url"]) @@ -577,9 +561,7 @@ async def test(): self.assertEqual(testenv["tornado_server"] + "/", tornado_span.data["http"]["url"]) self.assertEqual("secret=", tornado_span.data["http"]["params"]) self.assertEqual("GET", tornado_span.data["http"]["method"]) - self.assertIsNotNone(tornado_span.stack) - self.assertTrue(type(tornado_span.stack) is list) - self.assertTrue(len(tornado_span.stack) > 1) + self.assertIsNone(tornado_span.stack) self.assertEqual(200, aiohttp_span.data["http"]["status"]) self.assertEqual(testenv["tornado_server"] + "/", aiohttp_span.data["http"]["url"]) diff --git a/tests/frameworks/test_wsgi.py b/tests/frameworks/test_wsgi.py index 9db3012b..1e9c683a 100644 --- a/tests/frameworks/test_wsgi.py +++ b/tests/frameworks/test_wsgi.py @@ -84,8 +84,7 @@ def test_get_request(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) def test_synthetic_request(self): headers = { @@ -166,8 +165,7 @@ def test_complex_request(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) def test_custom_header_capture(self): # Hack together a manual custom headers list @@ -227,8 +225,7 @@ def test_custom_header_capture(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) assert "X-Capture-This" in wsgi_span.data["http"]["header"] self.assertEqual("this", wsgi_span.data["http"]["header"]["X-Capture-This"]) @@ -287,8 +284,7 @@ def test_secret_scrubbing(self): self.assertEqual('GET', wsgi_span.data["http"]["method"]) self.assertEqual(200, wsgi_span.data["http"]["status"]) self.assertIsNone(wsgi_span.data["http"]["error"]) - self.assertIsNotNone(wsgi_span.stack) - self.assertEqual(2, len(wsgi_span.stack)) + self.assertIsNone(wsgi_span.stack) def test_with_incoming_context(self): request_headers = dict() diff --git a/tests/opentracing/test_ot_span.py b/tests/opentracing/test_ot_span.py index a8184c0a..88ee1e1d 100644 --- a/tests/opentracing/test_ot_span.py +++ b/tests/opentracing/test_ot_span.py @@ -45,6 +45,19 @@ def test_span_ids(self): assert 0 <= int(context.span_id, 16) <= 18446744073709551615 assert 0 <= int(context.trace_id, 16) <= 18446744073709551615 + def test_stacks(self): + # Entry spans have no stack attached by default + wsgi_span = opentracing.tracer.start_span("wsgi") + assert wsgi_span.stack is None + + # SDK spans have no stack attached by default + sdk_span = opentracing.tracer.start_span("unregistered_span_type") + assert sdk_span.stack is None + + # Exit spans are no longer than 30 frames + exit_span = opentracing.tracer.start_span("urllib3") + assert len(exit_span.stack) == 30 + def test_span_fields(self): span = opentracing.tracer.start_span("mycustom") self.assertEqual("mycustom", span.operation_name)