-
Notifications
You must be signed in to change notification settings - Fork 457
ci(iast): add many scenarios to test gevent and iast #14644
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
Conversation
|
Bootstrap import analysisComparison of import times between this PR and base. SummaryThe average import time from this PR is: 275 ± 3 ms. The average import time from base is: 279 ± 4 ms. The import time difference between this PR and base is: -3.2 ± 0.2 ms. Import time breakdownThe following import paths have shrunk:
|
Performance SLOsComparing candidate avara1986/gevent_cpu_limit_experiment (f22c5a3) with baseline main (08ff751) 📈 Performance Regressions (1 suite)📈 telemetryaddmetric - 30/30✅ 1-count-metric-1-timesTime: ✅ 3.230µs (SLO: <20.000µs 📉 -83.8%) vs baseline: +3.5% Memory: ✅ 32.106MB (SLO: <34.000MB -5.6%) vs baseline: +4.6% ✅ 1-count-metrics-100-timesTime: ✅ 214.114µs (SLO: <250.000µs 📉 -14.4%) vs baseline: +1.2% Memory: ✅ 32.145MB (SLO: <34.000MB -5.5%) vs baseline: +4.9% ✅ 1-distribution-metric-1-timesTime: ✅ 2.977µs (SLO: <20.000µs 📉 -85.1%) vs baseline: +1.6% Memory: ✅ 32.204MB (SLO: <34.000MB -5.3%) vs baseline: +5.0% ✅ 1-distribution-metrics-100-timesTime: ✅ 191.823µs (SLO: <220.000µs 📉 -12.8%) vs baseline: +0.4% Memory: ✅ 32.106MB (SLO: <34.000MB -5.6%) vs baseline: +4.8% ✅ 1-gauge-metric-1-timesTime: ✅ 2.106µs (SLO: <20.000µs 📉 -89.5%) vs baseline: -0.3% Memory: ✅ 32.106MB (SLO: <34.000MB -5.6%) vs baseline: +4.7% ✅ 1-gauge-metrics-100-timesTime: ✅ 126.448µs (SLO: <150.000µs 📉 -15.7%) vs baseline: +0.9% Memory: ✅ 32.067MB (SLO: <34.000MB -5.7%) vs baseline: +4.7% ✅ 1-rate-metric-1-timesTime: ✅ 3.556µs (SLO: <20.000µs 📉 -82.2%) vs baseline: 📈 +13.3% Memory: ✅ 32.086MB (SLO: <34.000MB -5.6%) vs baseline: +4.8% ✅ 1-rate-metrics-100-timesTime: ✅ 214.948µs (SLO: <250.000µs 📉 -14.0%) vs baseline: +0.7% Memory: ✅ 32.165MB (SLO: <34.000MB -5.4%) vs baseline: +5.0% ✅ 100-count-metrics-100-timesTime: ✅ 21.675ms (SLO: <23.500ms -7.8%) vs baseline: +1.4% Memory: ✅ 32.185MB (SLO: <34.000MB -5.3%) vs baseline: +5.1% ✅ 100-distribution-metrics-100-timesTime: ✅ 2.007ms (SLO: <2.250ms 📉 -10.8%) vs baseline: +0.4% Memory: ✅ 32.165MB (SLO: <34.000MB -5.4%) vs baseline: +4.9% ✅ 100-gauge-metrics-100-timesTime: ✅ 1.291ms (SLO: <1.550ms 📉 -16.7%) vs baseline: -0.9% Memory: ✅ 32.165MB (SLO: <34.000MB -5.4%) vs baseline: +4.9% ✅ 100-rate-metrics-100-timesTime: ✅ 2.192ms (SLO: <2.550ms 📉 -14.1%) vs baseline: -0.3% Memory: ✅ 32.145MB (SLO: <34.000MB -5.5%) vs baseline: +4.9% ✅ flush-1-metricTime: ✅ 4.604µs (SLO: <20.000µs 📉 -77.0%) vs baseline: 📈 +11.9% Memory: ✅ 32.106MB (SLO: <34.000MB -5.6%) vs baseline: +4.7% ✅ flush-100-metricsTime: ✅ 183.234µs (SLO: <250.000µs 📉 -26.7%) vs baseline: +1.0% Memory: ✅ 32.106MB (SLO: <34.000MB -5.6%) vs baseline: +4.7% ✅ flush-1000-metricsTime: ✅ 2.208ms (SLO: <2.500ms 📉 -11.7%) vs baseline: +0.6% Memory: ✅ 32.912MB (SLO: <34.500MB -4.6%) vs baseline: +4.9% 🟡 Near SLO Breach (4 suites)🟡 djangosimple - 28/28✅ appsecTime: ✅ 20.568ms (SLO: <22.300ms -7.8%) vs baseline: -0.2% Memory: ✅ 65.348MB (SLO: <67.000MB -2.5%) vs baseline: +5.0% ✅ exception-replay-enabledTime: ✅ 1.346ms (SLO: <1.450ms -7.2%) vs baseline: -0.1% Memory: ✅ 64.192MB (SLO: <67.000MB -4.2%) vs baseline: +4.7% ✅ iastTime: ✅ 20.494ms (SLO: <22.250ms -7.9%) vs baseline: -0.1% Memory: ✅ 65.365MB (SLO: <67.000MB -2.4%) vs baseline: +5.1% ✅ profilerTime: ✅ 15.290ms (SLO: <16.550ms -7.6%) vs baseline: -0.2% Memory: ✅ 53.618MB (SLO: <54.500MB 🟡 -1.6%) vs baseline: +5.3% ✅ span-code-originTime: ✅ 26.214ms (SLO: <28.200ms -7.0%) vs baseline: ~same Memory: ✅ 67.234MB (SLO: <69.500MB -3.3%) vs baseline: +4.6% ✅ tracerTime: ✅ 20.555ms (SLO: <21.750ms -5.5%) vs baseline: +0.2% Memory: ✅ 65.332MB (SLO: <67.000MB -2.5%) vs baseline: +5.0% ✅ tracer-and-profilerTime: ✅ 22.132ms (SLO: <23.500ms -5.8%) vs baseline: -0.4% Memory: ✅ 66.343MB (SLO: <67.500MB 🟡 -1.7%) vs baseline: +5.1% ✅ tracer-dont-create-db-spansTime: ✅ 19.321ms (SLO: <21.500ms 📉 -10.1%) vs baseline: +0.1% Memory: ✅ 65.332MB (SLO: <66.000MB 🟡 -1.0%) vs baseline: +5.0% ✅ tracer-minimalTime: ✅ 16.622ms (SLO: <17.500ms -5.0%) vs baseline: -0.5% Memory: ✅ 64.915MB (SLO: <66.000MB 🟡 -1.6%) vs baseline: +4.4% ✅ tracer-nativeTime: ✅ 20.474ms (SLO: <21.750ms -5.9%) vs baseline: -0.4% Memory: ✅ 71.109MB (SLO: <72.500MB 🟡 -1.9%) vs baseline: +4.9% ✅ tracer-no-cachesTime: ✅ 18.440ms (SLO: <19.650ms -6.2%) vs baseline: -0.1% Memory: ✅ 65.133MB (SLO: <67.000MB -2.8%) vs baseline: +4.6% ✅ tracer-no-databasesTime: ✅ 18.791ms (SLO: <20.100ms -6.5%) vs baseline: +0.2% Memory: ✅ 64.938MB (SLO: <67.000MB -3.1%) vs baseline: +4.9% ✅ tracer-no-middlewareTime: ✅ 20.188ms (SLO: <21.500ms -6.1%) vs baseline: -0.1% Memory: ✅ 65.312MB (SLO: <67.000MB -2.5%) vs baseline: +4.9% ✅ tracer-no-templatesTime: ✅ 20.433ms (SLO: <22.000ms -7.1%) vs baseline: +0.5% Memory: ✅ 65.310MB (SLO: <67.000MB -2.5%) vs baseline: +5.0% 🟡 errortrackingdjangosimple - 6/6✅ errortracking-enabled-allTime: ✅ 18.078ms (SLO: <19.850ms -8.9%) vs baseline: +0.1% Memory: ✅ 65.216MB (SLO: <66.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ errortracking-enabled-userTime: ✅ 18.096ms (SLO: <19.400ms -6.7%) vs baseline: ~same Memory: ✅ 65.184MB (SLO: <66.500MB 🟡 -2.0%) vs baseline: +5.0% ✅ tracer-enabledTime: ✅ 18.044ms (SLO: <19.450ms -7.2%) vs baseline: ~same Memory: ✅ 65.220MB (SLO: <66.500MB 🟡 -1.9%) vs baseline: +5.2% 🟡 flasksqli - 6/6✅ appsec-enabledTime: ✅ 3.956ms (SLO: <4.200ms -5.8%) vs baseline: ~same Memory: ✅ 63.384MB (SLO: <66.000MB -4.0%) vs baseline: +5.2% ✅ iast-enabledTime: ✅ 2.456ms (SLO: <2.800ms 📉 -12.3%) vs baseline: -0.3% Memory: ✅ 58.818MB (SLO: <60.000MB 🟡 -2.0%) vs baseline: +5.2% ✅ tracer-enabledTime: ✅ 2.076ms (SLO: <2.250ms -7.7%) vs baseline: ~same Memory: ✅ 52.015MB (SLO: <54.500MB -4.6%) vs baseline: +5.1% 🟡 otelspan - 22/22✅ add-eventTime: ✅ 45.249ms (SLO: <47.150ms -4.0%) vs baseline: -0.1% Memory: ✅ 45.131MB (SLO: <47.000MB -4.0%) vs baseline: +5.1% ✅ add-metricsTime: ✅ 319.836ms (SLO: <344.800ms -7.2%) vs baseline: ~same Memory: ✅ 553.681MB (SLO: <562.000MB 🟡 -1.5%) vs baseline: +4.7% ✅ add-tagsTime: ✅ 289.041ms (SLO: <314.000ms -7.9%) vs baseline: -1.0% Memory: ✅ 554.824MB (SLO: <563.500MB 🟡 -1.5%) vs baseline: +4.6% ✅ get-contextTime: ✅ 82.795ms (SLO: <92.350ms 📉 -10.3%) vs baseline: ~same Memory: ✅ 40.183MB (SLO: <46.500MB 📉 -13.6%) vs baseline: +4.9% ✅ is-recordingTime: ✅ 43.020ms (SLO: <44.500ms -3.3%) vs baseline: +0.2% Memory: ✅ 44.524MB (SLO: <47.500MB -6.3%) vs baseline: +5.1% ✅ record-exceptionTime: ✅ 61.443ms (SLO: <67.650ms -9.2%) vs baseline: +0.3% Memory: ✅ 40.459MB (SLO: <47.000MB 📉 -13.9%) vs baseline: +4.9% ✅ set-statusTime: ✅ 48.707ms (SLO: <50.400ms -3.4%) vs baseline: ~same Memory: ✅ 44.453MB (SLO: <47.000MB -5.4%) vs baseline: +4.8% ✅ startTime: ✅ 41.983ms (SLO: <43.450ms -3.4%) vs baseline: -0.5% Memory: ✅ 44.505MB (SLO: <47.000MB -5.3%) vs baseline: +5.0% ✅ start-finishTime: ✅ 83.350ms (SLO: <88.000ms -5.3%) vs baseline: +0.6% Memory: ✅ 34.544MB (SLO: <46.500MB 📉 -25.7%) vs baseline: +4.8% ✅ start-finish-telemetryTime: ✅ 84.860ms (SLO: <89.000ms -4.7%) vs baseline: +0.8% Memory: ✅ 34.564MB (SLO: <46.500MB 📉 -25.7%) vs baseline: +4.9% ✅ update-nameTime: ✅ 44.204ms (SLO: <45.150ms -2.1%) vs baseline: +0.3% Memory: ✅ 44.811MB (SLO: <47.000MB -4.7%) vs baseline: +5.1%
|
Description
This PR strengthens IAST end-to-end coverage for shutdown and gevent scenarios that have historically caused intermittent timeouts and missing spans. It introduces downstream request propagation tests for Django and FastAPI (mirroring Flask), adds gevent-sensitive tests (socket, Greenlet, subprocess) under multiple Gunicorn configurations, and provides a Gunicorn runner for the Django test app. These additions validate the early-initialization fixes and lifecycle behaviors outlined in our gevent research and prevent regressions like those seen when urllib3 and gevent interact during application shutdown.
Motivation
Gevent + Gunicorn can trigger sporadic worker timeouts and span loss during shutdown when the app issues internal HTTP requests (e.g., urllib3 PoolManager). See internal research notes in .windsurf/context/RESEARCH_gevent_errors.md.
We need to ensure IAST remains robust when:
Applications make downstream calls before shutdown.
Gevent monkey-patching is active.
Sockets and subprocesses are used.
Expand coverage across frameworks (Django, FastAPI) to match existing Flask scenarios.
TODO: this test fails for every configuration (IAST enable/disable, Appsec enable/disable) so the problem is related to the trace lifecycle.
I.E: this view is stuck:
if we start ddtrace with
python -m ddtrace.commands.ddtrace_run gunicorn...
instead of:import ddtrace.auto
APPSEC-59081
Checklist
Reviewer Checklist