-
Notifications
You must be signed in to change notification settings - Fork 467
feat(profiling): [unwrapt] remove wrapt dependency from Lock Profiler
#15003
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?
Conversation
|
|
wrapt
wraptwrapt
Bootstrap import analysisComparison of import times between this PR and base. SummaryThe average import time from this PR is: 242 ± 6 ms. The average import time from base is: 243 ± 7 ms. The import time difference between this PR and base is: -1.1 ± 0.3 ms. Import time breakdownThe following import paths have shrunk:
|
Performance SLOsComparing candidate vlad/lock-profiler-un-wrapted (22de35d) with baseline main (59f52c2) 📈 Performance Regressions (1 suite)📈 telemetryaddmetric - 30/30✅ 1-count-metric-1-timesTime: ✅ 2.943µs (SLO: <20.000µs 📉 -85.3%) vs baseline: -1.2% Memory: ✅ 32.008MB (SLO: <34.000MB -5.9%) vs baseline: +5.2% ✅ 1-count-metrics-100-timesTime: ✅ 198.709µs (SLO: <220.000µs -9.7%) vs baseline: -1.0% Memory: ✅ 31.968MB (SLO: <34.000MB -6.0%) vs baseline: +5.2% ✅ 1-distribution-metric-1-timesTime: ✅ 3.598µs (SLO: <20.000µs 📉 -82.0%) vs baseline: +9.5% Memory: ✅ 31.988MB (SLO: <34.000MB -5.9%) vs baseline: +5.2% ✅ 1-distribution-metrics-100-timesTime: ✅ 212.860µs (SLO: <220.000µs -3.2%) vs baseline: -1.0% Memory: ✅ 32.008MB (SLO: <34.000MB -5.9%) vs baseline: +5.2% ✅ 1-gauge-metric-1-timesTime: ✅ 2.181µs (SLO: <20.000µs 📉 -89.1%) vs baseline: -0.3% Memory: ✅ 31.890MB (SLO: <34.000MB -6.2%) vs baseline: +4.7% ✅ 1-gauge-metrics-100-timesTime: ✅ 136.494µs (SLO: <150.000µs -9.0%) vs baseline: -0.2% Memory: ✅ 31.968MB (SLO: <34.000MB -6.0%) vs baseline: +5.1% ✅ 1-rate-metric-1-timesTime: ✅ 3.453µs (SLO: <20.000µs 📉 -82.7%) vs baseline: 📈 +11.0% Memory: ✅ 31.988MB (SLO: <34.000MB -5.9%) vs baseline: +5.1% ✅ 1-rate-metrics-100-timesTime: ✅ 213.473µs (SLO: <250.000µs 📉 -14.6%) vs baseline: +0.3% Memory: ✅ 31.929MB (SLO: <34.000MB -6.1%) vs baseline: +4.7% ✅ 100-count-metrics-100-timesTime: ✅ 20.186ms (SLO: <22.000ms -8.2%) vs baseline: +1.2% Memory: ✅ 31.929MB (SLO: <34.000MB -6.1%) vs baseline: +4.7% ✅ 100-distribution-metrics-100-timesTime: ✅ 2.221ms (SLO: <2.300ms -3.4%) vs baseline: ~same Memory: ✅ 31.949MB (SLO: <34.000MB -6.0%) vs baseline: +4.9% ✅ 100-gauge-metrics-100-timesTime: ✅ 1.412ms (SLO: <1.550ms -8.9%) vs baseline: +1.0% Memory: ✅ 31.890MB (SLO: <34.000MB -6.2%) vs baseline: +4.8% ✅ 100-rate-metrics-100-timesTime: ✅ 2.226ms (SLO: <2.550ms 📉 -12.7%) vs baseline: +2.3% Memory: ✅ 31.949MB (SLO: <34.000MB -6.0%) vs baseline: +5.1% ✅ flush-1-metricTime: ✅ 4.393µs (SLO: <20.000µs 📉 -78.0%) vs baseline: -0.3% Memory: ✅ 31.929MB (SLO: <34.000MB -6.1%) vs baseline: +4.9% ✅ flush-100-metricsTime: ✅ 174.290µs (SLO: <250.000µs 📉 -30.3%) vs baseline: -0.3% Memory: ✅ 31.988MB (SLO: <34.000MB -5.9%) vs baseline: +5.0% ✅ flush-1000-metricsTime: ✅ 2.140ms (SLO: <2.500ms 📉 -14.4%) vs baseline: ~same Memory: ✅ 32.696MB (SLO: <34.500MB -5.2%) vs baseline: +5.2% 🟡 Near SLO Breach (6 suites)🟡 djangosimple - 30/30✅ appsecTime: ✅ 20.429ms (SLO: <22.300ms -8.4%) vs baseline: -0.1% Memory: ✅ 66.218MB (SLO: <67.000MB 🟡 -1.2%) vs baseline: +5.0% ✅ exception-replay-enabledTime: ✅ 1.343ms (SLO: <1.450ms -7.4%) vs baseline: +0.3% Memory: ✅ 64.300MB (SLO: <67.000MB -4.0%) vs baseline: +4.8% ✅ iastTime: ✅ 20.481ms (SLO: <22.250ms -7.9%) vs baseline: +0.5% Memory: ✅ 66.139MB (SLO: <67.000MB 🟡 -1.3%) vs baseline: +4.9% ✅ profilerTime: ✅ 15.379ms (SLO: <16.550ms -7.1%) vs baseline: -0.8% Memory: ✅ 53.991MB (SLO: <54.500MB 🟡 -0.9%) vs baseline: +4.9% ✅ resource-renamingTime: ✅ 20.552ms (SLO: <21.750ms -5.5%) vs baseline: +0.4% Memory: ✅ 66.218MB (SLO: <67.000MB 🟡 -1.2%) vs baseline: +4.8% ✅ span-code-originTime: ✅ 25.317ms (SLO: <28.200ms 📉 -10.2%) vs baseline: +1.7% Memory: ✅ 67.283MB (SLO: <69.500MB -3.2%) vs baseline: +4.4% ✅ tracerTime: ✅ 20.431ms (SLO: <21.750ms -6.1%) vs baseline: +0.1% Memory: ✅ 66.198MB (SLO: <67.000MB 🟡 -1.2%) vs baseline: +5.0% ✅ tracer-and-profilerTime: ✅ 22.554ms (SLO: <23.500ms -4.0%) vs baseline: -0.3% Memory: ✅ 67.653MB (SLO: <68.000MB 🟡 -0.5%) vs baseline: +4.5% ✅ tracer-dont-create-db-spansTime: ✅ 19.337ms (SLO: <21.500ms 📉 -10.1%) vs baseline: -0.3% Memory: ✅ 66.180MB (SLO: <67.000MB 🟡 -1.2%) vs baseline: +4.9% ✅ tracer-minimalTime: ✅ 16.611ms (SLO: <17.500ms -5.1%) vs baseline: +0.2% Memory: ✅ 65.974MB (SLO: <67.000MB 🟡 -1.5%) vs baseline: +4.7% ✅ tracer-nativeTime: ✅ 20.489ms (SLO: <21.750ms -5.8%) vs baseline: +0.2% Memory: ✅ 67.810MB (SLO: <72.500MB -6.5%) vs baseline: +4.9% ✅ tracer-no-cachesTime: ✅ 18.448ms (SLO: <19.650ms -6.1%) vs baseline: +0.3% Memory: ✅ 66.100MB (SLO: <67.000MB 🟡 -1.3%) vs baseline: +4.9% ✅ tracer-no-databasesTime: ✅ 18.761ms (SLO: <20.100ms -6.7%) vs baseline: +0.3% Memory: ✅ 65.923MB (SLO: <67.000MB 🟡 -1.6%) vs baseline: +4.8% ✅ tracer-no-middlewareTime: ✅ 20.192ms (SLO: <21.500ms -6.1%) vs baseline: +0.2% Memory: ✅ 66.178MB (SLO: <67.000MB 🟡 -1.2%) vs baseline: +5.0% ✅ tracer-no-templatesTime: ✅ 20.332ms (SLO: <22.000ms -7.6%) vs baseline: +0.4% Memory: ✅ 66.198MB (SLO: <67.000MB 🟡 -1.2%) vs baseline: +5.0% 🟡 errortrackingdjangosimple - 6/6✅ errortracking-enabled-allTime: ✅ 18.047ms (SLO: <19.850ms -9.1%) vs baseline: -0.2% Memory: ✅ 66.113MB (SLO: <66.500MB 🟡 -0.6%) vs baseline: +5.0% ✅ errortracking-enabled-userTime: ✅ 18.048ms (SLO: <19.400ms -7.0%) vs baseline: +0.1% Memory: ✅ 66.148MB (SLO: <66.500MB 🟡 -0.5%) vs baseline: +5.0% ✅ tracer-enabledTime: ✅ 18.127ms (SLO: <19.450ms -6.8%) vs baseline: +0.4% Memory: ✅ 65.903MB (SLO: <66.500MB 🟡 -0.9%) vs baseline: +4.7% 🟡 errortrackingflasksqli - 6/6✅ errortracking-enabled-allTime: ✅ 2.071ms (SLO: <2.300ms -9.9%) vs baseline: +0.4% Memory: ✅ 52.612MB (SLO: <53.500MB 🟡 -1.7%) vs baseline: +4.8% ✅ errortracking-enabled-userTime: ✅ 2.071ms (SLO: <2.250ms -8.0%) vs baseline: -0.3% Memory: ✅ 52.652MB (SLO: <53.500MB 🟡 -1.6%) vs baseline: +5.0% ✅ tracer-enabledTime: ✅ 2.066ms (SLO: <2.300ms 📉 -10.2%) vs baseline: -0.2% Memory: ✅ 52.632MB (SLO: <53.500MB 🟡 -1.6%) vs baseline: +4.9% 🟡 flasksimple - 18/18✅ appsec-getTime: ✅ 4.605ms (SLO: <4.750ms -3.0%) vs baseline: +0.2% Memory: ✅ 62.197MB (SLO: <65.000MB -4.3%) vs baseline: +4.7% ✅ appsec-postTime: ✅ 6.636ms (SLO: <6.750ms 🟡 -1.7%) vs baseline: -0.1% Memory: ✅ 62.283MB (SLO: <65.000MB -4.2%) vs baseline: +4.7% ✅ appsec-telemetryTime: ✅ 4.598ms (SLO: <4.750ms -3.2%) vs baseline: +0.2% Memory: ✅ 62.281MB (SLO: <65.000MB -4.2%) vs baseline: +4.7% ✅ debuggerTime: ✅ 1.855ms (SLO: <2.000ms -7.2%) vs baseline: -0.3% Memory: ✅ 45.358MB (SLO: <47.000MB -3.5%) vs baseline: +5.3% ✅ iast-getTime: ✅ 1.859ms (SLO: <2.000ms -7.0%) vs baseline: ~same Memory: ✅ 42.209MB (SLO: <49.000MB 📉 -13.9%) vs baseline: +4.8% ✅ profilerTime: ✅ 1.910ms (SLO: <2.100ms -9.0%) vs baseline: ~same Memory: ✅ 46.688MB (SLO: <47.000MB 🟡 -0.7%) vs baseline: +5.1% ✅ resource-renamingTime: ✅ 3.368ms (SLO: <3.650ms -7.7%) vs baseline: ~same Memory: ✅ 52.539MB (SLO: <53.500MB 🟡 -1.8%) vs baseline: +4.7% ✅ tracerTime: ✅ 3.357ms (SLO: <3.650ms -8.0%) vs baseline: +0.2% Memory: ✅ 52.625MB (SLO: <53.500MB 🟡 -1.6%) vs baseline: +4.9% ✅ tracer-nativeTime: ✅ 3.358ms (SLO: <3.650ms -8.0%) vs baseline: ~same Memory: ✅ 54.127MB (SLO: <60.000MB -9.8%) vs baseline: +4.9% 🟡 flasksqli - 6/6✅ appsec-enabledTime: ✅ 3.968ms (SLO: <4.200ms -5.5%) vs baseline: ~same Memory: ✅ 62.423MB (SLO: <66.000MB -5.4%) vs baseline: +4.8% ✅ iast-enabledTime: ✅ 2.447ms (SLO: <2.800ms 📉 -12.6%) vs baseline: +0.3% Memory: ✅ 59.277MB (SLO: <60.000MB 🟡 -1.2%) vs baseline: +4.9% ✅ tracer-enabledTime: ✅ 2.061ms (SLO: <2.250ms -8.4%) vs baseline: ~same Memory: ✅ 52.652MB (SLO: <54.500MB -3.4%) vs baseline: +4.9% 🟡 recursivecomputation - 8/8✅ deepTime: ✅ 308.994ms (SLO: <320.950ms -3.7%) vs baseline: +0.3% Memory: ✅ 32.794MB (SLO: <34.500MB -4.9%) vs baseline: +5.4% ✅ deep-profiledTime: ✅ 326.846ms (SLO: <359.150ms -9.0%) vs baseline: -0.3% Memory: ✅ 38.630MB (SLO: <39.000MB 🟡 -0.9%) vs baseline: +5.7% ✅ mediumTime: ✅ 7.017ms (SLO: <7.400ms -5.2%) vs baseline: ~same Memory: ✅ 31.988MB (SLO: <34.000MB -5.9%) vs baseline: +5.0% ✅ shallowTime: ✅ 0.944ms (SLO: <1.050ms 📉 -10.1%) vs baseline: ~same Memory: ✅ 32.067MB (SLO: <34.000MB -5.7%) vs baseline: +5.6%
|
|
test comment |
d5f6245 to
897d642
Compare
|
test |
cba7ce2 to
ba19aff
Compare
wraptwrapt dependency from lock profiler
wrapt dependency from lock profilerwrapt dependency from Lock Profiler
d34e7f1 to
90d1d64
Compare
wrapt dependency from Lock Profilerwrapt dependency from Lock Profiler
9914135 to
2778109
Compare
wrapt dependency from Lock Profilerwrapt dependency from Lock Profiler
wrapt dependency from Lock Profilerwrapt dependency from Lock Profiler
c240aa2 to
ab97e9b
Compare
ab97e9b to
c16cdc1
Compare
33b44f4 to
6f8c5c5
Compare
b4da0d9 to
d297d5b
Compare
d297d5b to
21673c9
Compare
https://datadoghq.atlassian.net/browse/PROF-12854
Description
This PR removes
wraptdependency from lock profiler - replaced with direct delegation using__slots__. It implements the following proposal in the Lock Profiler RFC: Remove wrapt dependencyWhy
Changes
wrapt.ObjectProxywith internal_ProfiledLockclass using__slots____slots__explicitly declares data members without using__dict___LockAllocatorWrapperas protocol wrapper__hash__,__eq__,__getattr__Performance
Measurement tools:
gc.get_referents()+sys.getsizeof()(direct object measurement)benchmark.pywithtracemallocandtime.perf_counter()Test configuration:
Ran empirical benchmarks at 1% and 100% sampling rates:
Key findings:
Note: These are synthetic benchmarks. Real-world impact will be measured using dd-trace-doe benchmarking framework.
See
benchmarks/lock_profiler_wrapt_removal/VERIFIED_COMPARISON.mdfor details.Implementation Notes
wrapt.ObjectProxyprovided automatic delegation. We now implement these features directly:__getattr____hash__and__eq____enter__,__exit__,__aenter__,__aexit__Removed/Not Needed:
isinstance()checksdir(),vars())Testing
test_patchfor new behavior)vlad/benchmark-lock-profilerRisks
Low: Existing functionality intact, as shown by unit/e2e tests and empirical benchmarks.
Potential issues: Users with esoteric workflows depending on deep wrapt features (unlikely).