Skip to content

Commit f92c99e

Browse files
authored
fix(flask): flask 2.2.0 removes (#4026) (#4028)
This is an automatic backport of pull request #4026 done by [Mergify](https://mergify.com). Cherry-pick of d957850 has failed: ``` On branch mergify/bp/1.3/pr-4026 Your branch is up to date with 'origin/1.3'. You are currently cherry-picking commit d957850. (fix conflicts and run "git cherry-pick --continue") (use "git cherry-pick --skip" to skip this patch) (use "git cherry-pick --abort" to cancel the cherry-pick operation) Changes to be committed: modified: ddtrace/contrib/flask/patch.py new file: releasenotes/notes/fix-attribute-error-in-flask-2.2.0-94524c33b005d48a.yaml modified: tests/contrib/flask/test_hooks.py modified: tests/contrib/flask/test_request.py modified: tests/contrib/flask/test_static.py modified: tests/contrib/flask/test_template.py modified: tests/contrib/flask_autopatch/test_flask_autopatch.py new file: tests/snapshots/tests.contrib.flask.test_flask_snapshot.test_flask_200_220.json new file: tests/snapshots/tests.contrib.flask.test_flask_snapshot.test_flask_stream_220.json Unmerged paths: (use "git add/rm <file>..." as appropriate to mark resolution) deleted by us: tests/contrib/flask/test_flask_snapshot.py ``` To fix up this pull request, you can check it out locally. See documentation: https://docs.github.com/en/github/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/checking-out-pull-requests-locally --- <details> <summary>Mergify commands and options</summary> <br /> More conditions and actions can be found in the [documentation](https://docs.mergify.com/). You can also trigger Mergify actions by commenting on this pull request: - `@Mergifyio refresh` will re-evaluate the rules - `@Mergifyio rebase` will rebase this PR on its base branch - `@Mergifyio update` will merge the base branch into this PR - `@Mergifyio backport <destination>` will backport this PR on `<destination>` branch Additionally, on Mergify [dashboard](https://dashboard.mergify.com/) you can: - look at your merge queues - generate the Mergify configuration with the config editor. Finally, you can contact us on https://mergify.com </details>
1 parent 92ff29c commit f92c99e

File tree

7 files changed

+236
-90
lines changed

7 files changed

+236
-90
lines changed

ddtrace/contrib/flask/patch.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,13 @@ def patch():
102102
"handle_exception",
103103
"handle_http_exception",
104104
"handle_user_exception",
105-
"try_trigger_before_first_request_functions",
106105
"do_teardown_request",
107106
"do_teardown_appcontext",
108107
"send_static_file",
109108
]
109+
if flask_version < (2, 2, 0):
110+
flask_app_traces.append("try_trigger_before_first_request_functions")
111+
110112
for name in flask_app_traces:
111113
_w("flask", "Flask.{}".format(name), simple_tracer("flask.{}".format(name)))
112114

@@ -184,7 +186,6 @@ def unpatch():
184186
"Flask.handle_exception",
185187
"Flask.handle_http_exception",
186188
"Flask.handle_user_exception",
187-
"Flask.try_trigger_before_first_request_functions",
188189
"Flask.do_teardown_request",
189190
"Flask.do_teardown_appcontext",
190191
"Flask.send_static_file",
@@ -236,6 +237,10 @@ def unpatch():
236237
props.append("appcontext_popped.receivers_for")
237238
props.append("message_flashed.receivers_for")
238239

240+
# These were removed in 2.2.0
241+
if flask_version < (2, 2, 0):
242+
props.append("Flask.try_trigger_before_first_request_functions")
243+
239244
for prop in props:
240245
# Handle 'flask.request_started.receivers_for'
241246
obj = flask
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
fixes:
3+
- |
4+
Flask: version 2.2.0 removes ``try_trigger_before_first_request_functions``

tests/contrib/flask/test_hooks.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
from flask import Blueprint
22

3+
from ddtrace.contrib.flask.patch import flask_version
34
from ddtrace.ext import http
45
from tests.utils import assert_span_http_status_code
56

67
from . import BaseFlaskTestCase
78

89

10+
REMOVED_SPANS_2_2_0 = 1 if flask_version >= (2, 2, 0) else 0
11+
12+
913
class FlaskHookTestCase(BaseFlaskTestCase):
1014
def setUp(self):
1115
super(FlaskHookTestCase, self).setUp()
@@ -35,7 +39,7 @@ def before_request():
3539
self.assertEqual(req.data, b"Hello Flask")
3640

3741
spans = self.get_spans()
38-
self.assertEqual(len(spans), 9)
42+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
3943

4044
# DEV: This will raise an exception if this span doesn't exist
4145
self.find_span_by_name(spans, "flask.dispatch_request")
@@ -68,7 +72,7 @@ def before_request():
6872
self.assertEqual(req.data, b"Not Allowed")
6973

7074
spans = self.get_spans()
71-
self.assertEqual(len(spans), 7)
75+
self.assertEqual(len(spans), 7 - REMOVED_SPANS_2_2_0)
7276

7377
dispatch = self.find_span_by_name(spans, "flask.dispatch_request", required=False)
7478
self.assertIsNone(dispatch)
@@ -112,7 +116,7 @@ def before_first_request():
112116
self.assertEqual(req.data, b"Hello Flask")
113117

114118
spans = self.get_spans()
115-
self.assertEqual(len(spans), 9)
119+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
116120

117121
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.before_first_request")
118122
parent = self.find_span_parent(spans, span)
@@ -124,15 +128,18 @@ def before_first_request():
124128
self.assertEqual(span.get_tags(), dict())
125129

126130
# Assert correct parent span
127-
self.assertEqual(parent.name, "flask.try_trigger_before_first_request_functions")
131+
if flask_version >= (2, 2, 0):
132+
self.assertEqual(parent.name, "flask.request")
133+
else:
134+
self.assertEqual(parent.name, "flask.try_trigger_before_first_request_functions")
128135

129136
# Make a second request to ensure a span isn't created
130137
req = self.client.get("/")
131138
self.assertEqual(req.status_code, 200)
132139
self.assertEqual(req.data, b"Hello Flask")
133140

134141
spans = self.get_spans()
135-
self.assertEqual(len(spans), 8)
142+
self.assertEqual(len(spans), 8 - REMOVED_SPANS_2_2_0)
136143

137144
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.before_first_request", required=False)
138145
self.assertIsNone(span)
@@ -152,7 +159,7 @@ def after_request(response):
152159
self.assertEqual(req.data, b"Hello Flask")
153160

154161
spans = self.get_spans()
155-
self.assertEqual(len(spans), 9)
162+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
156163

157164
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.after_request")
158165
parent = self.find_span_parent(spans, span)
@@ -182,7 +189,7 @@ def after_request(response):
182189
self.assertEqual(req.data, b"Hello Flask")
183190

184191
spans = self.get_spans()
185-
self.assertEqual(len(spans), 9)
192+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
186193

187194
root = self.find_span_by_name(spans, "flask.request")
188195
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.after_request")
@@ -215,7 +222,7 @@ def teardown_request(request):
215222
self.assertEqual(req.data, b"Hello Flask")
216223

217224
spans = self.get_spans()
218-
self.assertEqual(len(spans), 9)
225+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
219226

220227
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.teardown_request")
221228
parent = self.find_span_parent(spans, span)
@@ -244,7 +251,7 @@ def teardown_appcontext(appctx):
244251
self.assertEqual(req.data, b"Hello Flask")
245252

246253
spans = self.get_spans()
247-
self.assertEqual(len(spans), 9)
254+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
248255

249256
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.teardown_appcontext")
250257
parent = self.find_span_parent(spans, span)
@@ -274,7 +281,7 @@ def bp_before_request():
274281
self.assertEqual(req.data, b"Hello Blueprint")
275282

276283
spans = self.get_spans()
277-
self.assertEqual(len(spans), 9)
284+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
278285

279286
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.bp_before_request")
280287
parent = self.find_span_parent(spans, span)
@@ -304,7 +311,7 @@ def bp_before_app_request():
304311
self.assertEqual(req.data, b"Hello Flask")
305312

306313
spans = self.get_spans()
307-
self.assertEqual(len(spans), 9)
314+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
308315

309316
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.bp_before_app_request")
310317
parent = self.find_span_parent(spans, span)
@@ -334,7 +341,7 @@ def bp_before_app_first_request():
334341
self.assertEqual(req.data, b"Hello Flask")
335342

336343
spans = self.get_spans()
337-
self.assertEqual(len(spans), 9)
344+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
338345

339346
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.bp_before_app_first_request")
340347
parent = self.find_span_parent(spans, span)
@@ -346,15 +353,18 @@ def bp_before_app_first_request():
346353
self.assertEqual(span.get_tags(), dict())
347354

348355
# Assert correct parent span
349-
self.assertEqual(parent.name, "flask.try_trigger_before_first_request_functions")
356+
if flask_version >= (2, 2, 0):
357+
self.assertEqual(parent.name, "flask.request")
358+
else:
359+
self.assertEqual(parent.name, "flask.try_trigger_before_first_request_functions")
350360

351361
# Make a second request to ensure a span isn't created
352362
req = self.client.get("/")
353363
self.assertEqual(req.status_code, 200)
354364
self.assertEqual(req.data, b"Hello Flask")
355365

356366
spans = self.get_spans()
357-
self.assertEqual(len(spans), 8)
367+
self.assertEqual(len(spans), 8 - REMOVED_SPANS_2_2_0)
358368

359369
span = self.find_span_by_name(
360370
spans,
@@ -379,7 +389,7 @@ def bp_after_request(response):
379389
self.assertEqual(req.data, b"Hello Blueprint")
380390

381391
spans = self.get_spans()
382-
self.assertEqual(len(spans), 9)
392+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
383393

384394
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.bp_after_request")
385395
parent = self.find_span_parent(spans, span)
@@ -409,7 +419,7 @@ def bp_after_app_request(response):
409419
self.assertEqual(req.data, b"Hello Flask")
410420

411421
spans = self.get_spans()
412-
self.assertEqual(len(spans), 9)
422+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
413423

414424
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.bp_after_app_request")
415425
parent = self.find_span_parent(spans, span)
@@ -439,7 +449,7 @@ def bp_teardown_request(request):
439449
self.assertEqual(req.data, b"Hello Blueprint")
440450

441451
spans = self.get_spans()
442-
self.assertEqual(len(spans), 9)
452+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
443453

444454
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.bp_teardown_request")
445455
parent = self.find_span_parent(spans, span)
@@ -469,7 +479,7 @@ def bp_teardown_app_request(request):
469479
self.assertEqual(req.data, b"Hello Flask")
470480

471481
spans = self.get_spans()
472-
self.assertEqual(len(spans), 9)
482+
self.assertEqual(len(spans), 9 - REMOVED_SPANS_2_2_0)
473483

474484
span = self.find_span_by_name(spans, "tests.contrib.flask.test_hooks.bp_teardown_app_request")
475485
parent = self.find_span_parent(spans, span)

0 commit comments

Comments
 (0)