chore(internal): migrate crashtracking to the product plugin interface#17184
chore(internal): migrate crashtracking to the product plugin interface#17184
Conversation
Codeowners resolved as |
Convert ddtrace/internal/core/crashtracking.py into a package and add a product.py that integrates with the product plugin interface (ddtrace.products entry points). The forksafe registration is removed from crashtracking.start(); the product's restart() now calls crashtracker_on_fork() directly, following the same pattern used by other products to delegate post-fork work to the product manager. Also fix the product manager to check enabled() before calling restart() on each product, consistent with how start() and stop() are already gated. Profiling and the remaining products (runtime metrics, OpenTelemetry, LLMObs) will be migrated in follow-up work. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
a5b8c01 to
ba3642e
Compare
Performance SLOsComparing candidate chore/migrate-crashtracking-to-product-plugin (ba3642e) with baseline main (6720aaf) 📈 Performance Regressions (2 suites)📈 iastaspects - 118/118✅ add_aspectTime: ✅ 104.072µs (SLO: <130.000µs 📉 -19.9%) vs baseline: +1.6% Memory: ✅ 44.138MB (SLO: <46.000MB -4.0%) vs baseline: +5.8% ✅ add_inplace_aspectTime: ✅ 101.357µs (SLO: <130.000µs 📉 -22.0%) vs baseline: -0.9% Memory: ✅ 43.946MB (SLO: <46.000MB -4.5%) vs baseline: +5.6% ✅ add_inplace_noaspectTime: ✅ 28.204µs (SLO: <40.000µs 📉 -29.5%) vs baseline: -0.3% Memory: ✅ 43.998MB (SLO: <46.000MB -4.4%) vs baseline: +5.5% ✅ add_noaspectTime: ✅ 48.702µs (SLO: <70.000µs 📉 -30.4%) vs baseline: -0.9% Memory: ✅ 43.996MB (SLO: <46.000MB -4.4%) vs baseline: +5.5% ✅ bytearray_aspectTime: ✅ 251.305µs (SLO: <400.000µs 📉 -37.2%) vs baseline: -2.9% Memory: ✅ 43.961MB (SLO: <46.000MB -4.4%) vs baseline: +5.4% ✅ bytearray_extend_aspectTime: ✅ 650.224µs (SLO: <800.000µs 📉 -18.7%) vs baseline: -1.1% Memory: ✅ 43.948MB (SLO: <46.000MB -4.5%) vs baseline: +5.2% ✅ bytearray_extend_noaspectTime: ✅ 264.501µs (SLO: <400.000µs 📉 -33.9%) vs baseline: -2.8% Memory: ✅ 44.057MB (SLO: <46.000MB -4.2%) vs baseline: +5.7% ✅ bytearray_noaspectTime: ✅ 138.218µs (SLO: <300.000µs 📉 -53.9%) vs baseline: -2.7% Memory: ✅ 44.166MB (SLO: <46.000MB -4.0%) vs baseline: +6.0% ✅ bytes_aspectTime: ✅ 218.799µs (SLO: <300.000µs 📉 -27.1%) vs baseline: -1.0% Memory: ✅ 43.977MB (SLO: <46.000MB -4.4%) vs baseline: +5.6% ✅ bytes_noaspectTime: ✅ 132.327µs (SLO: <200.000µs 📉 -33.8%) vs baseline: -1.4% Memory: ✅ 44.003MB (SLO: <46.000MB -4.3%) vs baseline: +4.7% ✅ bytesio_aspectTime: ✅ 3.777ms (SLO: <5.000ms 📉 -24.5%) vs baseline: +0.5% Memory: ✅ 43.863MB (SLO: <46.000MB -4.6%) vs baseline: +5.3% ✅ bytesio_noaspectTime: ✅ 317.045µs (SLO: <420.000µs 📉 -24.5%) vs baseline: -0.6% Memory: ✅ 44.054MB (SLO: <46.000MB -4.2%) vs baseline: +4.9% ✅ capitalize_aspectTime: ✅ 88.810µs (SLO: <300.000µs 📉 -70.4%) vs baseline: -0.7% Memory: ✅ 44.010MB (SLO: <46.000MB -4.3%) vs baseline: +5.5% ✅ capitalize_noaspectTime: ✅ 250.366µs (SLO: <300.000µs 📉 -16.5%) vs baseline: +0.4% Memory: ✅ 43.950MB (SLO: <46.000MB -4.5%) vs baseline: +5.5% ✅ casefold_aspectTime: ✅ 88.056µs (SLO: <500.000µs 📉 -82.4%) vs baseline: -0.5% Memory: ✅ 44.000MB (SLO: <46.000MB -4.3%) vs baseline: +5.5% ✅ casefold_noaspectTime: ✅ 301.109µs (SLO: <500.000µs 📉 -39.8%) vs baseline: -2.6% Memory: ✅ 44.074MB (SLO: <46.000MB -4.2%) vs baseline: +4.9% ✅ decode_aspectTime: ✅ 86.886µs (SLO: <100.000µs 📉 -13.1%) vs baseline: +0.1% Memory: ✅ 43.963MB (SLO: <46.000MB -4.4%) vs baseline: +4.7% ✅ decode_noaspectTime: ✅ 152.796µs (SLO: <210.000µs 📉 -27.2%) vs baseline: -0.7% Memory: ✅ 44.036MB (SLO: <46.000MB -4.3%) vs baseline: +4.8% ✅ encode_aspectTime: ✅ 84.348µs (SLO: <200.000µs 📉 -57.8%) vs baseline: +0.3% Memory: ✅ 44.061MB (SLO: <46.000MB -4.2%) vs baseline: +4.9% ✅ encode_noaspectTime: ✅ 141.697µs (SLO: <200.000µs 📉 -29.2%) vs baseline: -1.2% Memory: ✅ 43.956MB (SLO: <46.000MB -4.4%) vs baseline: +4.6% ✅ format_aspectTime: ✅ 14.616ms (SLO: <19.200ms 📉 -23.9%) vs baseline: -0.7% Memory: ✅ 44.143MB (SLO: <46.000MB -4.0%) vs baseline: +4.8% ✅ format_map_aspectTime: ✅ 16.374ms (SLO: <21.500ms 📉 -23.8%) vs baseline: ~same Memory: ✅ 44.135MB (SLO: <46.000MB -4.1%) vs baseline: +5.6% ✅ format_map_noaspectTime: ✅ 373.953µs (SLO: <500.000µs 📉 -25.2%) vs baseline: -0.9% Memory: ✅ 43.930MB (SLO: <46.000MB -4.5%) vs baseline: +5.4% ✅ format_noaspectTime: ✅ 303.900µs (SLO: <500.000µs 📉 -39.2%) vs baseline: -2.9% Memory: ✅ 44.007MB (SLO: <46.000MB -4.3%) vs baseline: +4.7% ✅ index_aspectTime: ✅ 138.275µs (SLO: <300.000µs 📉 -53.9%) vs baseline: 📈 +11.0% Memory: ✅ 44.114MB (SLO: <46.000MB -4.1%) vs baseline: +5.8% ✅ index_noaspectTime: ✅ 40.473µs (SLO: <300.000µs 📉 -86.5%) vs baseline: -0.1% Memory: ✅ 44.034MB (SLO: <46.000MB -4.3%) vs baseline: +4.7% ✅ join_aspectTime: ✅ 210.910µs (SLO: <300.000µs 📉 -29.7%) vs baseline: -0.7% Memory: ✅ 44.007MB (SLO: <46.000MB -4.3%) vs baseline: +5.6% ✅ join_noaspectTime: ✅ 143.555µs (SLO: <300.000µs 📉 -52.1%) vs baseline: -1.6% Memory: ✅ 43.911MB (SLO: <46.000MB -4.5%) vs baseline: +5.4% ✅ ljust_aspectTime: ✅ 498.852µs (SLO: <700.000µs 📉 -28.7%) vs baseline: +0.5% Memory: ✅ 44.188MB (SLO: <46.000MB -3.9%) vs baseline: +5.9% ✅ ljust_noaspectTime: ✅ 269.589µs (SLO: <300.000µs 📉 -10.1%) vs baseline: +4.8% Memory: ✅ 44.042MB (SLO: <46.000MB -4.3%) vs baseline: +4.9% ✅ lower_aspectTime: ✅ 298.689µs (SLO: <500.000µs 📉 -40.3%) vs baseline: +0.7% Memory: ✅ 44.099MB (SLO: <46.000MB -4.1%) vs baseline: +5.8% ✅ lower_noaspectTime: ✅ 231.398µs (SLO: <300.000µs 📉 -22.9%) vs baseline: -2.4% Memory: ✅ 43.942MB (SLO: <46.000MB -4.5%) vs baseline: +4.6% ✅ lstrip_aspectTime: ✅ 0.277ms (SLO: <3.000ms 📉 -90.8%) vs baseline: +0.9% Memory: ✅ 44.042MB (SLO: <46.000MB -4.3%) vs baseline: +4.8% ✅ lstrip_noaspectTime: ✅ 0.174ms (SLO: <3.000ms 📉 -94.2%) vs baseline: -3.0% Memory: ✅ 44.081MB (SLO: <46.000MB -4.2%) vs baseline: +4.9% ✅ modulo_aspectTime: ✅ 14.246ms (SLO: <18.750ms 📉 -24.0%) vs baseline: -0.2% Memory: ✅ 44.145MB (SLO: <46.000MB -4.0%) vs baseline: +4.9% ✅ modulo_aspect_for_bytearray_bytearrayTime: ✅ 14.764ms (SLO: <19.350ms 📉 -23.7%) vs baseline: -0.3% Memory: ✅ 44.115MB (SLO: <46.000MB -4.1%) vs baseline: +5.8% ✅ modulo_aspect_for_bytesTime: ✅ 14.374ms (SLO: <18.900ms 📉 -23.9%) vs baseline: -0.3% Memory: ✅ 43.965MB (SLO: <46.000MB -4.4%) vs baseline: +5.8% ✅ modulo_aspect_for_bytes_bytearrayTime: ✅ 14.619ms (SLO: <19.150ms 📉 -23.7%) vs baseline: +0.2% Memory: ✅ 44.095MB (SLO: <46.000MB -4.1%) vs baseline: +5.9% ✅ modulo_noaspectTime: ✅ 0.353ms (SLO: <3.000ms 📉 -88.2%) vs baseline: -3.4% Memory: ✅ 43.987MB (SLO: <46.000MB -4.4%) vs baseline: +4.7% ✅ replace_aspectTime: ✅ 18.391ms (SLO: <24.000ms 📉 -23.4%) vs baseline: +0.1% Memory: ✅ 44.202MB (SLO: <46.000MB -3.9%) vs baseline: +5.9% ✅ replace_noaspectTime: ✅ 282.096µs (SLO: <400.000µs 📉 -29.5%) vs baseline: -0.2% Memory: ✅ 43.970MB (SLO: <46.000MB -4.4%) vs baseline: +4.7% ✅ repr_aspectTime: ✅ 318.652µs (SLO: <420.000µs 📉 -24.1%) vs baseline: -1.6% Memory: ✅ 44.060MB (SLO: <46.000MB -4.2%) vs baseline: +5.7% ✅ repr_noaspectTime: ✅ 46.579µs (SLO: <90.000µs 📉 -48.2%) vs baseline: -0.5% Memory: ✅ 43.984MB (SLO: <46.000MB -4.4%) vs baseline: +5.5% ✅ rstrip_aspectTime: ✅ 389.144µs (SLO: <500.000µs 📉 -22.2%) vs baseline: +0.4% Memory: ✅ 44.009MB (SLO: <46.000MB -4.3%) vs baseline: +4.6% ✅ rstrip_noaspectTime: ✅ 180.293µs (SLO: <300.000µs 📉 -39.9%) vs baseline: -3.3% Memory: ✅ 44.065MB (SLO: <46.000MB -4.2%) vs baseline: +4.9% ✅ slice_aspectTime: ✅ 185.367µs (SLO: <300.000µs 📉 -38.2%) vs baseline: +1.6% Memory: ✅ 44.271MB (SLO: <46.000MB -3.8%) vs baseline: +6.4% ✅ slice_noaspectTime: ✅ 54.971µs (SLO: <90.000µs 📉 -38.9%) vs baseline: +1.4% Memory: ✅ 44.007MB (SLO: <46.000MB -4.3%) vs baseline: +4.8% ✅ stringio_aspectTime: ✅ 4.389ms (SLO: <5.000ms 📉 -12.2%) vs baseline: 📈 +15.4% Memory: ✅ 44.024MB (SLO: <46.000MB -4.3%) vs baseline: +5.6% ✅ stringio_noaspectTime: ✅ 345.132µs (SLO: <500.000µs 📉 -31.0%) vs baseline: -1.0% Memory: ✅ 44.085MB (SLO: <46.000MB -4.2%) vs baseline: +5.0% ✅ strip_aspectTime: ✅ 274.319µs (SLO: <350.000µs 📉 -21.6%) vs baseline: +0.5% Memory: ✅ 44.178MB (SLO: <46.000MB -4.0%) vs baseline: +5.8% ✅ strip_noaspectTime: ✅ 175.898µs (SLO: <240.000µs 📉 -26.7%) vs baseline: -1.3% Memory: ✅ 44.051MB (SLO: <46.000MB -4.2%) vs baseline: +4.8% ✅ swapcase_aspectTime: ✅ 332.182µs (SLO: <500.000µs 📉 -33.6%) vs baseline: +0.5% Memory: ✅ 43.881MB (SLO: <46.000MB -4.6%) vs baseline: +5.4% ✅ swapcase_noaspectTime: ✅ 268.798µs (SLO: <400.000µs 📉 -32.8%) vs baseline: -1.9% Memory: ✅ 43.980MB (SLO: <46.000MB -4.4%) vs baseline: +4.7% ✅ title_aspectTime: ✅ 319.607µs (SLO: <500.000µs 📉 -36.1%) vs baseline: -1.6% Memory: ✅ 44.196MB (SLO: <46.000MB -3.9%) vs baseline: +6.1% ✅ title_noaspectTime: ✅ 254.491µs (SLO: <400.000µs 📉 -36.4%) vs baseline: -3.0% Memory: ✅ 44.052MB (SLO: <46.000MB -4.2%) vs baseline: +4.9% ✅ translate_aspectTime: ✅ 492.475µs (SLO: <700.000µs 📉 -29.6%) vs baseline: -0.7% Memory: ✅ 44.055MB (SLO: <46.000MB -4.2%) vs baseline: +5.8% ✅ translate_noaspectTime: ✅ 421.970µs (SLO: <500.000µs 📉 -15.6%) vs baseline: -2.3% Memory: ✅ 43.955MB (SLO: <46.000MB -4.4%) vs baseline: +5.6% ✅ upper_aspectTime: ✅ 296.424µs (SLO: <500.000µs 📉 -40.7%) vs baseline: -0.3% Memory: ✅ 44.032MB (SLO: <46.000MB -4.3%) vs baseline: +5.8% ✅ upper_noaspectTime: ✅ 233.550µs (SLO: <400.000µs 📉 -41.6%) vs baseline: -1.4% Memory: ✅ 43.983MB (SLO: <46.000MB -4.4%) vs baseline: +4.6% 📈 iastaspectsospath - 24/24✅ ospathbasename_aspectTime: ✅ 503.401µs (SLO: <700.000µs 📉 -28.1%) vs baseline: 📈 +18.9% Memory: ✅ 43.944MB (SLO: <46.000MB -4.5%) vs baseline: +5.9% ✅ ospathbasename_noaspectTime: ✅ 430.598µs (SLO: <700.000µs 📉 -38.5%) vs baseline: ~same Memory: ✅ 43.877MB (SLO: <46.000MB -4.6%) vs baseline: +5.6% ✅ ospathjoin_aspectTime: ✅ 626.793µs (SLO: <700.000µs 📉 -10.5%) vs baseline: -0.2% Memory: ✅ 43.825MB (SLO: <46.000MB -4.7%) vs baseline: +5.5% ✅ ospathjoin_noaspectTime: ✅ 632.754µs (SLO: <700.000µs -9.6%) vs baseline: -1.3% Memory: ✅ 43.793MB (SLO: <46.000MB -4.8%) vs baseline: +5.3% ✅ ospathnormcase_aspectTime: ✅ 348.331µs (SLO: <700.000µs 📉 -50.2%) vs baseline: -1.2% Memory: ✅ 43.833MB (SLO: <46.000MB -4.7%) vs baseline: +5.6% ✅ ospathnormcase_noaspectTime: ✅ 357.070µs (SLO: <700.000µs 📉 -49.0%) vs baseline: -0.4% Memory: ✅ 43.896MB (SLO: <46.000MB -4.6%) vs baseline: +5.7% ✅ ospathsplit_aspectTime: ✅ 484.372µs (SLO: <700.000µs 📉 -30.8%) vs baseline: -0.8% Memory: ✅ 43.911MB (SLO: <46.000MB -4.5%) vs baseline: +5.7% ✅ ospathsplit_noaspectTime: ✅ 492.723µs (SLO: <700.000µs 📉 -29.6%) vs baseline: -0.6% Memory: ✅ 43.776MB (SLO: <46.000MB -4.8%) vs baseline: +5.4% ✅ ospathsplitdrive_aspectTime: ✅ 376.144µs (SLO: <700.000µs 📉 -46.3%) vs baseline: +0.5% Memory: ✅ 43.839MB (SLO: <46.000MB -4.7%) vs baseline: +5.6% ✅ ospathsplitdrive_noaspectTime: ✅ 73.135µs (SLO: <700.000µs 📉 -89.6%) vs baseline: +0.3% Memory: ✅ 43.799MB (SLO: <46.000MB -4.8%) vs baseline: +5.5% ✅ ospathsplitext_aspectTime: ✅ 455.247µs (SLO: <700.000µs 📉 -35.0%) vs baseline: -1.3% Memory: ✅ 43.893MB (SLO: <46.000MB -4.6%) vs baseline: +5.6% ✅ ospathsplitext_noaspectTime: ✅ 462.701µs (SLO: <700.000µs 📉 -33.9%) vs baseline: -2.0% Memory: ✅ 43.876MB (SLO: <46.000MB -4.6%) vs baseline: +5.7% 🟡 Near SLO Breach (3 suites)🟡 djangosimple - 30/30✅ appsecTime: ✅ 19.699ms (SLO: <22.300ms 📉 -11.7%) vs baseline: -0.1% Memory: ✅ 69.399MB (SLO: <73.500MB -5.6%) vs baseline: +5.2% ✅ exception-replay-enabledTime: ✅ 1.319ms (SLO: <1.450ms -9.0%) vs baseline: +0.1% Memory: ✅ 67.539MB (SLO: <71.500MB -5.5%) vs baseline: +5.2% ✅ iastTime: ✅ 19.754ms (SLO: <22.250ms 📉 -11.2%) vs baseline: ~same Memory: ✅ 69.335MB (SLO: <75.000MB -7.6%) vs baseline: +5.0% ✅ profilerTime: ✅ 15.111ms (SLO: <16.550ms -8.7%) vs baseline: -0.6% Memory: ✅ 60.404MB (SLO: <61.000MB 🟡 -1.0%) vs baseline: +5.4% ✅ resource-renamingTime: ✅ 19.704ms (SLO: <21.750ms -9.4%) vs baseline: ~same Memory: ✅ 69.322MB (SLO: <73.500MB -5.7%) vs baseline: +5.1% ✅ span-code-originTime: ✅ 19.929ms (SLO: <28.200ms 📉 -29.3%) vs baseline: ~same Memory: ✅ 69.589MB (SLO: <75.000MB -7.2%) vs baseline: +5.3% ✅ tracerTime: ✅ 19.687ms (SLO: <21.750ms -9.5%) vs baseline: -0.2% Memory: ✅ 69.365MB (SLO: <75.000MB -7.5%) vs baseline: +5.1% ✅ tracer-and-profilerTime: ✅ 21.081ms (SLO: <23.500ms 📉 -10.3%) vs baseline: ~same Memory: ✅ 71.408MB (SLO: <75.000MB -4.8%) vs baseline: +5.0% ✅ tracer-dont-create-db-spansTime: ✅ 19.783ms (SLO: <21.500ms -8.0%) vs baseline: +0.2% Memory: ✅ 69.319MB (SLO: <75.000MB -7.6%) vs baseline: +5.1% ✅ tracer-minimalTime: ✅ 16.870ms (SLO: <17.500ms -3.6%) vs baseline: ~same Memory: ✅ 69.390MB (SLO: <75.000MB -7.5%) vs baseline: +5.2% ✅ tracer-nativeTime: ✅ 19.632ms (SLO: <21.750ms -9.7%) vs baseline: +0.8% Memory: ✅ 69.351MB (SLO: <72.500MB -4.3%) vs baseline: +5.1% ✅ tracer-no-cachesTime: ✅ 17.632ms (SLO: <19.650ms 📉 -10.3%) vs baseline: ~same Memory: ✅ 69.392MB (SLO: <75.000MB -7.5%) vs baseline: +5.2% ✅ tracer-no-databasesTime: ✅ 19.367ms (SLO: <20.100ms -3.6%) vs baseline: +0.2% Memory: ✅ 69.395MB (SLO: <75.000MB -7.5%) vs baseline: +5.2% ✅ tracer-no-middlewareTime: ✅ 19.467ms (SLO: <21.500ms -9.5%) vs baseline: +0.2% Memory: ✅ 69.372MB (SLO: <75.000MB -7.5%) vs baseline: +5.1% ✅ tracer-no-templatesTime: ✅ 19.664ms (SLO: <22.000ms 📉 -10.6%) vs baseline: +1.2% Memory: ✅ 69.368MB (SLO: <73.500MB -5.6%) 🟡 flasksimple - 18/18✅ appsec-getTime: ✅ 3.388ms (SLO: <4.750ms 📉 -28.7%) vs baseline: +0.7% Memory: ✅ 56.556MB (SLO: <66.500MB 📉 -15.0%) vs baseline: +5.6% ✅ appsec-postTime: ✅ 2.862ms (SLO: <6.750ms 📉 -57.6%) vs baseline: ~same Memory: ✅ 56.500MB (SLO: <66.500MB 📉 -15.0%) vs baseline: +5.3% ✅ appsec-telemetryTime: ✅ 3.385ms (SLO: <4.750ms 📉 -28.7%) vs baseline: +0.9% Memory: ✅ 56.485MB (SLO: <66.500MB 📉 -15.1%) vs baseline: +5.3% ✅ debuggerTime: ✅ 1.875ms (SLO: <2.000ms -6.2%) vs baseline: -0.1% Memory: ✅ 49.220MB (SLO: <51.500MB -4.4%) vs baseline: +5.7% ✅ iast-getTime: ✅ 1.871ms (SLO: <2.000ms -6.4%) vs baseline: ~same Memory: ✅ 45.912MB (SLO: <49.000MB -6.3%) vs baseline: +5.6% ✅ profilerTime: ✅ 1.917ms (SLO: <2.100ms -8.7%) vs baseline: -0.2% Memory: ✅ 52.576MB (SLO: <53.500MB 🟡 -1.7%) vs baseline: +5.3% ✅ resource-renamingTime: ✅ 3.344ms (SLO: <3.650ms -8.4%) vs baseline: -0.1% Memory: ✅ 56.505MB (SLO: <60.000MB -5.8%) vs baseline: +5.5% ✅ tracerTime: ✅ 3.359ms (SLO: <3.650ms -8.0%) vs baseline: ~same Memory: ✅ 56.574MB (SLO: <60.000MB -5.7%) vs baseline: +5.6% ✅ tracer-nativeTime: ✅ 3.346ms (SLO: <3.650ms -8.3%) vs baseline: -0.3% Memory: ✅ 56.556MB (SLO: <60.000MB -5.7%) vs baseline: +5.6% 🟡 recursivecomputation - 8/8✅ deepTime: ✅ 312.335ms (SLO: <320.950ms -2.7%) vs baseline: +0.5% Memory: ✅ 37.473MB (SLO: <38.750MB -3.3%) vs baseline: +5.7% ✅ deep-profiledTime: ✅ 328.661ms (SLO: <359.150ms -8.5%) vs baseline: -0.4% Memory: ✅ 43.765MB (SLO: <46.000MB -4.9%) vs baseline: +5.4% ✅ mediumTime: ✅ 7.284ms (SLO: <7.400ms 🟡 -1.6%) vs baseline: +0.2% Memory: ✅ 36.687MB (SLO: <38.000MB -3.5%) vs baseline: +5.9% ✅ shallowTime: ✅ 1.016ms (SLO: <1.050ms -3.3%) vs baseline: +1.0% Memory: ✅ 36.766MB (SLO: <38.000MB -3.2%) vs baseline: +6.0%
|
Description
Convert ddtrace/internal/core/crashtracking.py into a package and add a product.py that integrates with the product plugin interface (ddtrace.products entry points).
The forksafe registration is removed from crashtracking.start(); the product's restart() now calls crashtracker_on_fork() directly, following the same pattern used by other products to delegate post-fork work to the product manager.
Also fix the product manager to check enabled() before calling restart() on each product, consistent with how start() and stop() are already gated.
Profiling and the remaining products (runtime metrics, OpenTelemetry, LLMObs) will be migrated in follow-up work.