From ea97291ff20b3476f17141ffbdcc576859644716 Mon Sep 17 00:00:00 2001 From: Jeffery Saeteurn Date: Mon, 4 Mar 2019 10:31:09 -0800 Subject: [PATCH] Fix exception processing in Django running in Lambda #86 --- aws_xray_sdk/ext/django/middleware.py | 5 ++++- tests/ext/django/test_middleware.py | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/aws_xray_sdk/ext/django/middleware.py b/aws_xray_sdk/ext/django/middleware.py index d3eeec7c..bb0c8a3a 100644 --- a/aws_xray_sdk/ext/django/middleware.py +++ b/aws_xray_sdk/ext/django/middleware.py @@ -95,7 +95,10 @@ def process_exception(self, request, exception): Add exception information and fault flag to the current segment. """ - segment = xray_recorder.current_segment() + if self.in_lambda_ctx: + segment = xray_recorder.current_subsegment() + else: + segment = xray_recorder.current_segment() segment.put_http_meta(http.STATUS, 500) stack = stacktrace.get_stacktrace(limit=xray_recorder._max_trace_back) diff --git a/tests/ext/django/test_middleware.py b/tests/ext/django/test_middleware.py index a428d9e8..3c89c51e 100644 --- a/tests/ext/django/test_middleware.py +++ b/tests/ext/django/test_middleware.py @@ -133,6 +133,25 @@ def test_lambda_serverless(self): segment = new_recorder.emitter.pop() assert not segment + # Test Fault in Lambda + url = reverse('500fault') + try: + self.client.get(url) + except Exception: + pass + segment = xray_recorder.emitter.pop() + assert segment.fault + + request = segment.http['request'] + response = segment.http['response'] + + assert request['method'] == 'GET' + assert request['client_ip'] == '127.0.0.1' + assert response['status'] == 500 + + exception = segment.cause['exceptions'][0] + assert exception.type == 'KeyError' + def test_lambda_default_ctx(self): # Track to make sure that Django will default to generating segments if context is not the lambda context url = reverse('200ok')