Skip to content

Commit 76d6666

Browse files
mergify[bot]gnufedemabdinur
authored
fix(flask): flask 2.2.0 removes try_trigger_before_first_request_functions (backport #4026) (#4038)
* ## Description Fixes #4025 * remove _dd.p.dm tag from merge * update middleware tests (middleware was removed in ddtrace v1.0) Co-authored-by: Federico Mon <[email protected]> Co-authored-by: Munir Abdinur <[email protected]>
1 parent 31df4dc commit 76d6666

File tree

8 files changed

+241
-92
lines changed

8 files changed

+241
-92
lines changed

ddtrace/contrib/flask/patch.py

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

@@ -185,7 +187,6 @@ def unpatch():
185187
"Flask.handle_exception",
186188
"Flask.handle_http_exception",
187189
"Flask.handle_user_exception",
188-
"Flask.try_trigger_before_first_request_functions",
189190
"Flask.do_teardown_request",
190191
"Flask.do_teardown_appcontext",
191192
"Flask.send_static_file",
@@ -237,6 +238,10 @@ def unpatch():
237238
props.append("appcontext_popped.receivers_for")
238239
props.append("message_flashed.receivers_for")
239240

241+
# These were removed in 2.2.0
242+
if flask_version < (2, 2, 0):
243+
props.append("Flask.try_trigger_before_first_request_functions")
244+
240245
for prop in props:
241246
# Handle 'flask.request_started.receivers_for'
242247
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)

tests/contrib/flask/test_middleware.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from ddtrace.constants import ERROR_TYPE
1111
from ddtrace.constants import SAMPLING_PRIORITY_KEY
1212
from ddtrace.contrib.flask import TraceMiddleware
13+
from ddtrace.contrib.flask.patch import flask_version
1314
from ddtrace.ext import http
1415
from tests.opentracer.utils import init_tracer
1516
from tests.utils import DummyTracer
@@ -143,7 +144,8 @@ def test_template(self):
143144
assert s.get_tag(http.METHOD) == "GET"
144145

145146
t = by_name["flask.template"]
146-
assert t.get_tag("flask.template") == "test.html"
147+
resource = "tests.contrib.flask.web" if flask_version >= (2, 2, 0) else "test.html"
148+
assert t.get_tag("flask.template") == resource
147149
assert t.parent_id == s.span_id
148150
assert t.trace_id == s.trace_id
149151
assert s.start < t.start < t.start + t.duration < end
@@ -218,7 +220,8 @@ def test_template_render_err(self):
218220
assert_span_http_status_code(s, 500)
219221
assert s.get_tag(http.METHOD) == "GET"
220222
t = by_name["flask.template"]
221-
assert t.get_tag("flask.template") == "render_err.html"
223+
resource = "tests.contrib.flask.web" if flask_version >= (2, 2, 0) else "render_err.html"
224+
assert t.get_tag("flask.template") == resource
222225
assert t.error == 1
223226
assert t.parent_id == s.span_id
224227
assert t.trace_id == s.trace_id

0 commit comments

Comments
 (0)