-
Notifications
You must be signed in to change notification settings - Fork 467
Fix generic Exception ordering in ASGI middleware #15059
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Fix generic Exception ordering in ASGI middleware #15059
Conversation
|
Bits AI Dev Agent Status: ✅ Done [Fix CI Errors] Status History (1 entries)You can ask for changes by mentioning @DataDog in a comment. |
|
|
Bootstrap import analysisComparison of import times between this PR and base. SummaryThe average import time from this PR is: 241 ± 3 ms. The average import time from base is: 243 ± 3 ms. The import time difference between this PR and base is: -2.2 ± 0.1 ms. Import time breakdownThe following import paths have shrunk:
|
Performance SLOsComparing candidate dd/fix/asgi-exception-handler-ordering (099f83c) with baseline main (9c2acd7) 📈 Performance Regressions (1 suite)📈 iastaspects - 118/118✅ add_aspectTime: ✅ 0.405µs (SLO: <10.000µs 📉 -96.0%) vs baseline: -0.3% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.8% ✅ add_inplace_aspectTime: ✅ 0.405µs (SLO: <10.000µs 📉 -95.9%) vs baseline: -0.4% Memory: ✅ 38.044MB (SLO: <39.000MB -2.5%) vs baseline: +4.7% ✅ add_inplace_noaspectTime: ✅ 0.317µs (SLO: <10.000µs 📉 -96.8%) vs baseline: -1.0% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +4.7% ✅ add_noaspectTime: ✅ 0.276µs (SLO: <10.000µs 📉 -97.2%) vs baseline: -0.4% Memory: ✅ 38.044MB (SLO: <39.000MB -2.5%) vs baseline: +5.0% ✅ bytearray_aspectTime: ✅ 1.484µs (SLO: <10.000µs 📉 -85.2%) vs baseline: +9.1% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ bytearray_extend_aspectTime: ✅ 1.504µs (SLO: <10.000µs 📉 -85.0%) vs baseline: -0.5% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.7% ✅ bytearray_extend_noaspectTime: ✅ 0.615µs (SLO: <10.000µs 📉 -93.8%) vs baseline: ~same Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.8% ✅ bytearray_noaspectTime: ✅ 0.486µs (SLO: <10.000µs 📉 -95.1%) vs baseline: +0.4% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ bytes_aspectTime: ✅ 1.466µs (SLO: <10.000µs 📉 -85.3%) vs baseline: 📈 +13.4% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.9% ✅ bytes_noaspectTime: ✅ 0.497µs (SLO: <10.000µs 📉 -95.0%) vs baseline: +1.0% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +4.8% ✅ bytesio_aspectTime: ✅ 1.350µs (SLO: <10.000µs 📉 -86.5%) vs baseline: -1.0% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.9% ✅ bytesio_noaspectTime: ✅ 0.496µs (SLO: <10.000µs 📉 -95.0%) vs baseline: -0.3% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +5.1% ✅ capitalize_aspectTime: ✅ 0.734µs (SLO: <10.000µs 📉 -92.7%) vs baseline: +0.2% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ capitalize_noaspectTime: ✅ 0.436µs (SLO: <10.000µs 📉 -95.6%) vs baseline: -0.4% Memory: ✅ 38.142MB (SLO: <39.000MB -2.2%) vs baseline: +5.0% ✅ casefold_aspectTime: ✅ 0.736µs (SLO: <10.000µs 📉 -92.6%) vs baseline: -0.1% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.7% ✅ casefold_noaspectTime: ✅ 0.373µs (SLO: <10.000µs 📉 -96.3%) vs baseline: +0.1% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.9% ✅ decode_aspectTime: ✅ 0.724µs (SLO: <10.000µs 📉 -92.8%) vs baseline: ~same Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ decode_noaspectTime: ✅ 0.421µs (SLO: <10.000µs 📉 -95.8%) vs baseline: -0.1% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +5.1% ✅ encode_aspectTime: ✅ 0.713µs (SLO: <10.000µs 📉 -92.9%) vs baseline: +0.2% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +5.0% ✅ encode_noaspectTime: ✅ 0.400µs (SLO: <10.000µs 📉 -96.0%) vs baseline: -0.6% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.9% ✅ format_aspectTime: ✅ 3.424µs (SLO: <10.000µs 📉 -65.8%) vs baseline: +0.3% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ format_map_aspectTime: ✅ 3.981µs (SLO: <10.000µs 📉 -60.2%) vs baseline: +8.4% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.7% ✅ format_map_noaspectTime: ✅ 0.789µs (SLO: <10.000µs 📉 -92.1%) vs baseline: +1.4% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +5.1% ✅ format_noaspectTime: ✅ 0.597µs (SLO: <10.000µs 📉 -94.0%) vs baseline: -0.3% Memory: ✅ 38.044MB (SLO: <39.000MB -2.5%) vs baseline: +4.8% ✅ index_aspectTime: ✅ 0.360µs (SLO: <10.000µs 📉 -96.4%) vs baseline: +0.2% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.7% ✅ index_noaspectTime: ✅ 0.278µs (SLO: <10.000µs 📉 -97.2%) vs baseline: +0.6% Memory: ✅ 38.142MB (SLO: <39.000MB -2.2%) vs baseline: +5.2% ✅ join_aspectTime: ✅ 1.360µs (SLO: <10.000µs 📉 -86.4%) vs baseline: -0.2% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +5.0% ✅ join_noaspectTime: ✅ 0.498µs (SLO: <10.000µs 📉 -95.0%) vs baseline: ~same Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +5.1% ✅ ljust_aspectTime: ✅ 2.747µs (SLO: <20.000µs 📉 -86.3%) vs baseline: +6.6% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ ljust_noaspectTime: ✅ 0.411µs (SLO: <10.000µs 📉 -95.9%) vs baseline: +0.7% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +4.8% ✅ lower_aspectTime: ✅ 2.190µs (SLO: <10.000µs 📉 -78.1%) vs baseline: -0.5% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ lower_noaspectTime: ✅ 0.367µs (SLO: <10.000µs 📉 -96.3%) vs baseline: -1.5% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.9% ✅ lstrip_aspectTime: ✅ 2.228µs (SLO: <20.000µs 📉 -88.9%) vs baseline: +0.6% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ lstrip_noaspectTime: ✅ 0.382µs (SLO: <10.000µs 📉 -96.2%) vs baseline: -0.5% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +5.0% ✅ modulo_aspectTime: ✅ 1.003µs (SLO: <10.000µs 📉 -90.0%) vs baseline: +0.5% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.7% ✅ modulo_aspect_for_bytearray_bytearrayTime: ✅ 1.566µs (SLO: <10.000µs 📉 -84.3%) vs baseline: +0.3% Memory: ✅ 38.044MB (SLO: <39.000MB -2.5%) vs baseline: +4.7% ✅ modulo_aspect_for_bytesTime: ✅ 0.985µs (SLO: <10.000µs 📉 -90.1%) vs baseline: +0.4% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.8% ✅ modulo_aspect_for_bytes_bytearrayTime: ✅ 1.221µs (SLO: <10.000µs 📉 -87.8%) vs baseline: -1.3% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +5.0% ✅ modulo_noaspectTime: ✅ 0.629µs (SLO: <10.000µs 📉 -93.7%) vs baseline: +0.5% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ replace_aspectTime: ✅ 4.950µs (SLO: <10.000µs 📉 -50.5%) vs baseline: +0.4% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ replace_noaspectTime: ✅ 0.462µs (SLO: <10.000µs 📉 -95.4%) vs baseline: -0.1% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.9% ✅ repr_aspectTime: ✅ 0.910µs (SLO: <10.000µs 📉 -90.9%) vs baseline: +0.8% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +5.0% ✅ repr_noaspectTime: ✅ 0.415µs (SLO: <10.000µs 📉 -95.8%) vs baseline: -0.1% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.8% ✅ rstrip_aspectTime: ✅ 1.920µs (SLO: <20.000µs 📉 -90.4%) vs baseline: +0.3% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ rstrip_noaspectTime: ✅ 0.385µs (SLO: <10.000µs 📉 -96.2%) vs baseline: +0.5% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.9% ✅ slice_aspectTime: ✅ 0.494µs (SLO: <10.000µs 📉 -95.1%) vs baseline: +0.1% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ slice_noaspectTime: ✅ 0.448µs (SLO: <10.000µs 📉 -95.5%) vs baseline: -0.4% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +4.8% ✅ stringio_aspectTime: ✅ 1.572µs (SLO: <10.000µs 📉 -84.3%) vs baseline: +0.1% Memory: ✅ 38.142MB (SLO: <39.000MB -2.2%) vs baseline: +5.0% ✅ stringio_noaspectTime: ✅ 0.717µs (SLO: <10.000µs 📉 -92.8%) vs baseline: ~same Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ strip_aspectTime: ✅ 2.195µs (SLO: <20.000µs 📉 -89.0%) vs baseline: -0.5% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ strip_noaspectTime: ✅ 0.392µs (SLO: <10.000µs 📉 -96.1%) vs baseline: +1.1% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.9% ✅ swapcase_aspectTime: ✅ 2.396µs (SLO: <10.000µs 📉 -76.0%) vs baseline: -0.6% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.9% ✅ swapcase_noaspectTime: ✅ 0.531µs (SLO: <10.000µs 📉 -94.7%) vs baseline: -2.1% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.7% ✅ title_aspectTime: ✅ 2.332µs (SLO: <10.000µs 📉 -76.7%) vs baseline: +0.8% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.9% ✅ title_noaspectTime: ✅ 0.501µs (SLO: <10.000µs 📉 -95.0%) vs baseline: +0.4% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.7% ✅ translate_aspectTime: ✅ 3.239µs (SLO: <10.000µs 📉 -67.6%) vs baseline: -0.2% Memory: ✅ 38.083MB (SLO: <39.000MB -2.4%) vs baseline: +4.7% ✅ translate_noaspectTime: ✅ 1.042µs (SLO: <10.000µs 📉 -89.6%) vs baseline: +0.2% Memory: ✅ 38.103MB (SLO: <39.000MB -2.3%) vs baseline: +4.9% ✅ upper_aspectTime: ✅ 2.214µs (SLO: <10.000µs 📉 -77.9%) vs baseline: +0.8% Memory: ✅ 38.063MB (SLO: <39.000MB -2.4%) vs baseline: +4.7% ✅ upper_noaspectTime: ✅ 0.368µs (SLO: <10.000µs 📉 -96.3%) vs baseline: -1.4% Memory: ✅ 38.122MB (SLO: <39.000MB -2.3%) vs baseline: +5.0% 🟡 Near SLO Breach (5 suites)🟡 djangosimple - 30/30✅ appsecTime: ✅ 20.463ms (SLO: <22.300ms -8.2%) vs baseline: -0.3% Memory: ✅ 66.471MB (SLO: <67.000MB 🟡 -0.8%) vs baseline: +4.9% ✅ exception-replay-enabledTime: ✅ 1.345ms (SLO: <1.450ms -7.2%) vs baseline: -0.6% Memory: ✅ 64.665MB (SLO: <67.000MB -3.5%) vs baseline: +4.8% ✅ iastTime: ✅ 20.473ms (SLO: <22.250ms -8.0%) vs baseline: ~same Memory: ✅ 66.445MB (SLO: <67.000MB 🟡 -0.8%) vs baseline: +4.9% ✅ profilerTime: ✅ 15.460ms (SLO: <16.550ms -6.6%) vs baseline: +0.3% Memory: ✅ 53.986MB (SLO: <54.500MB 🟡 -0.9%) vs baseline: +4.7% ✅ resource-renamingTime: ✅ 20.593ms (SLO: <21.750ms -5.3%) vs baseline: +0.2% Memory: ✅ 66.452MB (SLO: <67.000MB 🟡 -0.8%) vs baseline: +4.9% ✅ span-code-originTime: ✅ 25.523ms (SLO: <28.200ms -9.5%) vs baseline: +0.5% Memory: ✅ 67.502MB (SLO: <69.500MB -2.9%) vs baseline: +4.9% ✅ tracerTime: ✅ 20.522ms (SLO: <21.750ms -5.6%) vs baseline: ~same Memory: ✅ 66.422MB (SLO: <67.000MB 🟡 -0.9%) vs baseline: +4.9% ✅ tracer-and-profilerTime: ✅ 22.695ms (SLO: <23.500ms -3.4%) vs baseline: ~same Memory: ✅ 67.826MB (SLO: <68.000MB 🟡 -0.3%) vs baseline: +4.9% ✅ tracer-dont-create-db-spansTime: ✅ 19.330ms (SLO: <21.500ms 📉 -10.1%) vs baseline: -0.2% Memory: ✅ 66.485MB (SLO: <67.000MB 🟡 -0.8%) vs baseline: +4.9% ✅ tracer-minimalTime: ✅ 16.616ms (SLO: <17.500ms -5.1%) vs baseline: +0.2% Memory: ✅ 66.433MB (SLO: <67.000MB 🟡 -0.8%) vs baseline: +4.8% ✅ tracer-nativeTime: ✅ 20.473ms (SLO: <21.750ms -5.9%) vs baseline: +0.2% Memory: ✅ 72.214MB (SLO: <72.500MB 🟡 -0.4%) vs baseline: +4.8% ✅ tracer-no-cachesTime: ✅ 18.508ms (SLO: <19.650ms -5.8%) vs baseline: +0.1% Memory: ✅ 66.418MB (SLO: <67.000MB 🟡 -0.9%) vs baseline: +4.9% ✅ tracer-no-databasesTime: ✅ 18.844ms (SLO: <20.100ms -6.2%) vs baseline: +0.2% Memory: ✅ 66.473MB (SLO: <67.000MB 🟡 -0.8%) vs baseline: +4.9% ✅ tracer-no-middlewareTime: ✅ 20.185ms (SLO: <21.500ms -6.1%) vs baseline: -0.2% Memory: ✅ 66.473MB (SLO: <67.000MB 🟡 -0.8%) vs baseline: +4.9% ✅ tracer-no-templatesTime: ✅ 20.340ms (SLO: <22.000ms -7.5%) vs baseline: ~same Memory: ✅ 66.426MB (SLO: <67.000MB 🟡 -0.9%) vs baseline: +4.7% 🟡 errortrackingdjangosimple - 6/6✅ errortracking-enabled-allTime: ✅ 18.126ms (SLO: <19.850ms -8.7%) vs baseline: +0.3% Memory: ✅ 66.452MB (SLO: <66.500MB 🟡 ~same) vs baseline: +4.9% ✅ errortracking-enabled-userTime: ✅ 18.097ms (SLO: <19.400ms -6.7%) vs baseline: +0.1% Memory: ✅ 66.431MB (SLO: <66.500MB 🟡 -0.1%) vs baseline: +4.9% ✅ tracer-enabledTime: ✅ 18.402ms (SLO: <19.450ms -5.4%) vs baseline: +1.5% Memory: ✅ 66.338MB (SLO: <66.500MB 🟡 -0.2%) vs baseline: +4.8% 🟡 errortrackingflasksqli - 6/6✅ errortracking-enabled-allTime: ✅ 2.100ms (SLO: <2.300ms -8.7%) vs baseline: +1.1% Memory: ✅ 52.927MB (SLO: <53.500MB 🟡 -1.1%) vs baseline: +5.1% ✅ errortracking-enabled-userTime: ✅ 2.072ms (SLO: <2.250ms -7.9%) vs baseline: -0.2% Memory: ✅ 52.848MB (SLO: <53.500MB 🟡 -1.2%) vs baseline: +4.9% ✅ tracer-enabledTime: ✅ 2.074ms (SLO: <2.300ms -9.8%) vs baseline: ~same Memory: ✅ 52.868MB (SLO: <53.500MB 🟡 -1.2%) vs baseline: +4.6% 🟡 flasksimple - 18/18✅ appsec-getTime: ✅ 4.591ms (SLO: <4.750ms -3.3%) vs baseline: +0.1% Memory: ✅ 62.738MB (SLO: <65.000MB -3.5%) vs baseline: +5.0% ✅ appsec-postTime: ✅ 6.620ms (SLO: <6.750ms 🟡 -1.9%) vs baseline: -0.2% Memory: ✅ 62.757MB (SLO: <65.000MB -3.5%) vs baseline: +4.9% ✅ appsec-telemetryTime: ✅ 4.596ms (SLO: <4.750ms -3.3%) vs baseline: ~same Memory: ✅ 62.718MB (SLO: <65.000MB -3.5%) vs baseline: +4.9% ✅ debuggerTime: ✅ 1.860ms (SLO: <2.000ms -7.0%) vs baseline: +0.1% Memory: ✅ 45.357MB (SLO: <47.000MB -3.5%) vs baseline: +4.8% ✅ iast-getTime: ✅ 1.862ms (SLO: <2.000ms -6.9%) vs baseline: +0.6% Memory: ✅ 42.389MB (SLO: <49.000MB 📉 -13.5%) vs baseline: +4.9% ✅ profilerTime: ✅ 1.913ms (SLO: <2.100ms -8.9%) vs baseline: +0.2% Memory: ✅ 46.458MB (SLO: <47.000MB 🟡 -1.2%) vs baseline: +4.1% ✅ resource-renamingTime: ✅ 3.364ms (SLO: <3.650ms -7.8%) vs baseline: ~same Memory: ✅ 52.986MB (SLO: <53.500MB 🟡 -1.0%) vs baseline: +4.7% ✅ tracerTime: ✅ 3.363ms (SLO: <3.650ms -7.9%) vs baseline: +0.5% Memory: ✅ 52.986MB (SLO: <53.500MB 🟡 -1.0%) vs baseline: +4.8% ✅ tracer-nativeTime: ✅ 3.357ms (SLO: <3.650ms -8.0%) vs baseline: ~same Memory: ✅ 58.868MB (SLO: <60.000MB 🟡 -1.9%) vs baseline: +4.8% 🟡 flasksqli - 6/6✅ appsec-enabledTime: ✅ 3.967ms (SLO: <4.200ms -5.5%) vs baseline: +0.3% Memory: ✅ 62.875MB (SLO: <66.000MB -4.7%) vs baseline: +4.7% ✅ iast-enabledTime: ✅ 2.436ms (SLO: <2.800ms 📉 -13.0%) vs baseline: -0.7% Memory: ✅ 59.494MB (SLO: <60.000MB 🟡 -0.8%) vs baseline: +4.5% ✅ tracer-enabledTime: ✅ 2.066ms (SLO: <2.250ms -8.2%) vs baseline: +0.2% Memory: ✅ 53.006MB (SLO: <54.500MB -2.7%) vs baseline: +4.8%
|
PR by Bits for Dev Agent Session identified by campaign Campaign for python-best-practices/generic-exception-last Oct. 27 2025 created by Veer Veda
You can ask for changes by mentioning @DataDog in a comment.
Feedback (especially what can be better) welcome in #code-gen-feedback!
Description
This fix addresses a static analysis violation where generic
Exceptionwas being caught before more specific exceptions in the ASGI middleware error handling.The issue was in the exception handling order at line 460 of
ddtrace/contrib/internal/asgi/middleware.py. TheExceptionhandler was positioned before theBaseExceptionhandler, which violates the principle that generic exceptions must be caught last to allow specific exception handlers to execute properly.The fix reorders the exception handlers so that
BaseExceptionis caught first, allowing it to handle bothBlockingException(viafind_exception) and regularExceptioninstances appropriately. This ensures specific exception types are properly handled before falling back to the generic exception handler.Testing
The existing test suite for ASGI middleware should be run to verify that exception handling continues to work correctly for:
BlockingExceptioncases (both regular and withinBaseExceptionGroup)Risks
Low risk. This change only reorders exception handlers without altering the underlying logic. The same operations are performed; they're simply organized in the correct order to follow Python best practices.
Additional Notes
This change maintains backward compatibility and ensures compliance with the
python-best-practices/generic-exception-laststatic analysis rule across all affected branches.