Skip to content

Commit b4f02be

Browse files
committed
Add tests for exception and TraceParent
1 parent c25da7e commit b4f02be

File tree

4 files changed

+56
-4
lines changed

4 files changed

+56
-4
lines changed

elasticapm/instrumentation/packages/tornado.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ async def call(self, module, method, wrapped, instance, args, kwargs):
7272
class TornadoHandleRequestExceptionInstrumentation(AbstractInstrumentedModule):
7373
name = "tornado_handle_request_exception"
7474

75-
instrument_list = [("tornado.web.RequestHandler", "_handle_request_exception")]
75+
instrument_list = [("tornado.web", "RequestHandler._handle_request_exception")]
7676

7777
def call(self, module, method, wrapped, instance, args, kwargs):
7878

@@ -104,8 +104,8 @@ def call(self, module, method, wrapped, instance, args, kwargs):
104104
class TornadoRenderInstrumentation(AbstractInstrumentedModule):
105105
name = "tornado_render"
106106

107-
instrument_list = [("tornado.web.RequestHandler", "render")]
107+
instrument_list = [("tornado.web", "RequestHandler.render")]
108108

109-
async def call(self, module, method, wrapped, instance, args, kwargs):
109+
def call(self, module, method, wrapped, instance, args, kwargs):
110110
# FIXME
111111
return wrapped(*args, **kwargs)

elasticapm/instrumentation/register.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@
6767
"elasticapm.instrumentation.packages.asyncio.aiohttp_client.AioHttpClientInstrumentation",
6868
"elasticapm.instrumentation.packages.asyncio.aiopg.AioPGInstrumentation",
6969
"elasticapm.instrumentation.packages.tornado.TornadoRequestExecuteInstrumentation",
70+
"elasticapm.instrumentation.packages.tornado.TornadoHandleRequestExceptionInstrumentation",
71+
"elasticapm.instrumentation.packages.tornado.TornadoRenderInstrumentation",
7072
]
7173
)
7274

tests/contrib/tornado/tornado_web_tests.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
from elasticapm import async_capture_span
3838
from elasticapm.conf import constants
3939
from elasticapm.contrib.tornado import ElasticAPM
40+
from elasticapm.utils.disttracing import TraceParent
41+
42+
pytestmark = pytest.mark.tornado
4043

4144

4245
@pytest.fixture
@@ -49,7 +52,7 @@ def get(self):
4952

5053
class BoomHandler(tornado.web.RequestHandler):
5154
def get(self):
52-
raise ValueError()
55+
raise tornado.web.HTTPError()
5356

5457
app = tornado.web.Application([(r"/", HelloHandler), (r"/boom", BoomHandler)])
5558
apm = ElasticAPM(app, elasticapm_client)
@@ -77,3 +80,49 @@ async def test_get(app, base_url, http_client):
7780
request["socket"] == {"remote_address": "127.0.0.1", "encrypted": False}
7881

7982
assert span["name"] == "test"
83+
84+
85+
@pytest.mark.gen_test
86+
async def test_exception(app, base_url, http_client):
87+
elasticapm_client = app.elasticapm_client
88+
with pytest.raises(tornado.httpclient.HTTPClientError):
89+
response = await http_client.fetch(base_url + "/boom")
90+
91+
assert len(elasticapm_client.events[constants.TRANSACTION]) == 1
92+
transaction = elasticapm_client.events[constants.TRANSACTION][0]
93+
spans = elasticapm_client.spans_for_transaction(transaction)
94+
assert len(spans) == 0
95+
96+
assert transaction["name"] == "GET BoomHandler"
97+
assert transaction["result"] == "HTTP 5xx"
98+
assert transaction["type"] == "request"
99+
request = transaction["context"]["request"]
100+
assert request["method"] == "GET"
101+
assert request["socket"] == {"remote_address": "127.0.0.1", "encrypted": False}
102+
assert transaction["context"]["response"]["status_code"] == 500
103+
104+
assert len(elasticapm_client.events[constants.ERROR]) == 1
105+
error = elasticapm_client.events[constants.ERROR][0]
106+
assert error["transaction_id"] == transaction["id"]
107+
assert error["exception"]["type"] == "HTTPError"
108+
assert error["context"]["request"] == transaction["context"]["request"]
109+
110+
111+
@pytest.mark.gen_test
112+
async def test_traceparent_handling(app, base_url, http_client):
113+
elasticapm_client = app.elasticapm_client
114+
with mock.patch(
115+
"elasticapm.instrumentation.packages.tornado.TraceParent.from_headers", wraps=TraceParent.from_headers
116+
) as wrapped_from_string:
117+
headers = tornado.httputil.HTTPHeaders()
118+
headers.add(constants.TRACEPARENT_HEADER_NAME, "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-03")
119+
headers.add(constants.TRACESTATE_HEADER_NAME, "foo=bar,bar=baz")
120+
headers.add(constants.TRACESTATE_HEADER_NAME, "baz=bazzinga")
121+
request = tornado.httpclient.HTTPRequest(url=base_url, headers=headers)
122+
resp = await http_client.fetch(request)
123+
124+
transaction = elasticapm_client.events[constants.TRANSACTION][0]
125+
126+
assert transaction["trace_id"] == "0af7651916cd43dd8448eb211c80319c"
127+
assert transaction["parent_id"] == "b7ad6b7169203331"
128+
assert "foo=bar,bar=baz,baz=bazzinga" == wrapped_from_string.call_args[0][0]["TraceState"]

tests/scripts/envs/tornado.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export PYTEST_MARKER="-m tornado"

0 commit comments

Comments
 (0)