Skip to content

Commit e9d3746

Browse files
authored
Merge pull request #139 from chanchiem/master
Flask & Django create subsegments only if in LambdaContext & Lambda Env
2 parents fddb405 + bc4c4b5 commit e9d3746

File tree

4 files changed

+47
-18
lines changed

4 files changed

+47
-18
lines changed

aws_xray_sdk/ext/django/middleware.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from aws_xray_sdk.core.utils import stacktrace
66
from aws_xray_sdk.ext.util import calculate_sampling_decision, \
77
calculate_segment_name, construct_xray_header, prepare_response_header
8-
from aws_xray_sdk.core.lambda_launcher import check_in_lambda
8+
from aws_xray_sdk.core.lambda_launcher import check_in_lambda, LambdaContext
99

1010

1111
log = logging.getLogger(__name__)
@@ -25,10 +25,10 @@ class XRayMiddleware(object):
2525
def __init__(self, get_response):
2626

2727
self.get_response = get_response
28-
self.in_lambda = False
28+
self.in_lambda_ctx = False
2929

30-
if check_in_lambda():
31-
self.in_lambda = True
30+
if check_in_lambda() and type(xray_recorder.context) == LambdaContext:
31+
self.in_lambda_ctx = True
3232

3333
# hooks for django version >= 1.10
3434
def __call__(self, request):
@@ -51,7 +51,7 @@ def __call__(self, request):
5151
sampling_req=sampling_req,
5252
)
5353

54-
if self.in_lambda:
54+
if self.in_lambda_ctx:
5555
segment = xray_recorder.begin_subsegment(name)
5656
else:
5757
segment = xray_recorder.begin_segment(
@@ -83,7 +83,7 @@ def __call__(self, request):
8383
segment.put_http_meta(http.CONTENT_LENGTH, length)
8484
response[http.XRAY_HEADER] = prepare_response_header(xray_header, segment)
8585

86-
if self.in_lambda:
86+
if self.in_lambda_ctx:
8787
xray_recorder.end_subsegment()
8888
else:
8989
xray_recorder.end_segment()

aws_xray_sdk/ext/flask/middleware.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from aws_xray_sdk.core.utils import stacktrace
66
from aws_xray_sdk.ext.util import calculate_sampling_decision, \
77
calculate_segment_name, construct_xray_header, prepare_response_header
8-
from aws_xray_sdk.core.lambda_launcher import check_in_lambda
8+
from aws_xray_sdk.core.lambda_launcher import check_in_lambda, LambdaContext
99

1010

1111
class XRayMiddleware(object):
@@ -18,10 +18,10 @@ def __init__(self, app, recorder):
1818
self.app.before_request(self._before_request)
1919
self.app.after_request(self._after_request)
2020
self.app.teardown_request(self._handle_exception)
21-
self.in_lambda = False
21+
self.in_lambda_ctx = False
2222

23-
if check_in_lambda():
24-
self.in_lambda = True
23+
if check_in_lambda() and type(self._recorder.context) == LambdaContext:
24+
self.in_lambda_ctx = True
2525

2626
_patch_render(recorder)
2727

@@ -44,7 +44,7 @@ def _before_request(self):
4444
sampling_req=sampling_req,
4545
)
4646

47-
if self.in_lambda:
47+
if self.in_lambda_ctx:
4848
segment = self._recorder.begin_subsegment(name)
4949
else:
5050
segment = self._recorder.begin_segment(
@@ -67,7 +67,7 @@ def _before_request(self):
6767
segment.put_http_meta(http.CLIENT_IP, req.remote_addr)
6868

6969
def _after_request(self, response):
70-
if self.in_lambda:
70+
if self.in_lambda_ctx:
7171
segment = self._recorder.current_subsegment()
7272
else:
7373
segment = self._recorder.current_segment()
@@ -81,7 +81,7 @@ def _after_request(self, response):
8181
if cont_len:
8282
segment.put_http_meta(http.CONTENT_LENGTH, int(cont_len))
8383

84-
if self.in_lambda:
84+
if self.in_lambda_ctx:
8585
self._recorder.end_subsegment()
8686
else:
8787
self._recorder.end_segment()
@@ -92,7 +92,7 @@ def _handle_exception(self, exception):
9292
return
9393
segment = None
9494
try:
95-
if self.in_lambda:
95+
if self.in_lambda_ctx:
9696
segment = self._recorder.current_subsegment()
9797
else:
9898
segment = self._recorder.current_segment()
@@ -104,7 +104,7 @@ def _handle_exception(self, exception):
104104
segment.put_http_meta(http.STATUS, 500)
105105
stack = stacktrace.get_stacktrace(limit=self._recorder._max_trace_back)
106106
segment.add_exception(exception, stack)
107-
if self.in_lambda:
107+
if self.in_lambda_ctx:
108108
self._recorder.end_subsegment()
109109
else:
110110
self._recorder.end_segment()

tests/ext/django/test_middleware.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from aws_xray_sdk.core import xray_recorder, lambda_launcher
77
from aws_xray_sdk.core.context import Context
8-
from aws_xray_sdk.core.models import http, facade_segment
8+
from aws_xray_sdk.core.models import http, facade_segment, segment
99
from tests.util import get_new_stubbed_recorder
1010
import os
1111

@@ -132,3 +132,10 @@ def test_lambda_serverless(self):
132132
self.client.get(url)
133133
segment = new_recorder.emitter.pop()
134134
assert not segment
135+
136+
def test_lambda_default_ctx(self):
137+
# Track to make sure that Django will default to generating segments if context is not the lambda context
138+
url = reverse('200ok')
139+
self.client.get(url)
140+
cur_segment = xray_recorder.emitter.pop()
141+
assert type(cur_segment) == segment.Segment

tests/ext/flask/test_flask.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from aws_xray_sdk.ext.flask.middleware import XRayMiddleware
66
from aws_xray_sdk.core.context import Context
77
from aws_xray_sdk.core import lambda_launcher
8-
from aws_xray_sdk.core.models import http, facade_segment
8+
from aws_xray_sdk.core.models import http, facade_segment, segment
99
from tests.util import get_new_stubbed_recorder
1010
import os
1111

@@ -186,7 +186,7 @@ def trace_header():
186186
return 'ok'
187187

188188
middleware = XRayMiddleware(new_app, new_recorder)
189-
middleware.in_lambda = True
189+
middleware.in_lambda_ctx = True
190190

191191
app_client = new_app.test_client()
192192

@@ -197,3 +197,25 @@ def trace_header():
197197

198198
path2 = '/trace_header'
199199
app_client.get(path2, headers={http.XRAY_HEADER: 'k1=v1'})
200+
201+
202+
def test_lambda_default_ctx():
203+
# Track to make sure that Flask will default to generating segments if context is not the lambda context
204+
new_recorder = get_new_stubbed_recorder()
205+
new_recorder.configure(service='test', sampling=False)
206+
new_app = Flask(__name__)
207+
208+
@new_app.route('/segment')
209+
def subsegment():
210+
# Test in between request and make sure Lambda that uses default context generates a segment.
211+
assert new_recorder.current_segment()
212+
assert type(new_recorder.current_segment()) == segment.Segment
213+
return 'ok'
214+
215+
XRayMiddleware(new_app, new_recorder)
216+
app_client = new_app.test_client()
217+
218+
path = '/segment'
219+
app_client.get(path)
220+
segment = recorder.emitter.pop()
221+
assert not segment # Segment should be none because it's created and ended by the middleware

0 commit comments

Comments
 (0)