chore: update structlog latest version to 25.5.0#15745
chore: update structlog latest version to 25.5.0#15745dd-octo-sts[bot] wants to merge 2 commits into
Conversation
|
|
Performance SLOsComparing candidate upgrade-latest-structlog-version (bb45108) with baseline main (38d6538) 📈 Performance Regressions (3 suites)📈 iastaspects - 118/118✅ add_aspectTime: ✅ 17.807µs (SLO: <20.000µs 📉 -11.0%) vs baseline: 📈 +19.7% Memory: ✅ 42.703MB (SLO: <43.250MB 🟡 -1.3%) vs baseline: +5.0% ✅ add_inplace_aspectTime: ✅ 14.803µs (SLO: <20.000µs 📉 -26.0%) vs baseline: -1.1% Memory: ✅ 42.566MB (SLO: <43.250MB 🟡 -1.6%) vs baseline: +5.0% ✅ add_inplace_noaspectTime: ✅ 0.341µs (SLO: <10.000µs 📉 -96.6%) vs baseline: +0.7% Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ add_noaspectTime: ✅ 0.546µs (SLO: <10.000µs 📉 -94.5%) vs baseline: +0.3% Memory: ✅ 42.684MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ bytearray_aspectTime: ✅ 17.810µs (SLO: <30.000µs 📉 -40.6%) vs baseline: -0.6% Memory: ✅ 42.644MB (SLO: <43.500MB 🟡 -2.0%) vs baseline: +5.2% ✅ bytearray_extend_aspectTime: ✅ 23.693µs (SLO: <30.000µs 📉 -21.0%) vs baseline: -0.3% Memory: ✅ 42.566MB (SLO: <43.500MB -2.1%) vs baseline: +4.8% ✅ bytearray_extend_noaspectTime: ✅ 2.742µs (SLO: <10.000µs 📉 -72.6%) vs baseline: +0.5% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +5.0% ✅ bytearray_noaspectTime: ✅ 1.450µs (SLO: <10.000µs 📉 -85.5%) vs baseline: -2.2% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +5.0% ✅ bytes_aspectTime: ✅ 16.483µs (SLO: <20.000µs 📉 -17.6%) vs baseline: -0.4% Memory: ✅ 42.703MB (SLO: <43.500MB 🟡 -1.8%) vs baseline: +5.1% ✅ bytes_noaspectTime: ✅ 1.398µs (SLO: <10.000µs 📉 -86.0%) vs baseline: -1.9% Memory: ✅ 42.723MB (SLO: <43.500MB 🟡 -1.8%) vs baseline: +5.3% ✅ bytesio_aspectTime: ✅ 55.077µs (SLO: <70.000µs 📉 -21.3%) vs baseline: -0.9% Memory: ✅ 42.684MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ bytesio_noaspectTime: ✅ 3.256µs (SLO: <10.000µs 📉 -67.4%) vs baseline: -0.8% Memory: ✅ 42.703MB (SLO: <43.500MB 🟡 -1.8%) vs baseline: +5.2% ✅ capitalize_aspectTime: ✅ 14.556µs (SLO: <20.000µs 📉 -27.2%) vs baseline: -1.3% Memory: ✅ 42.605MB (SLO: <43.500MB -2.1%) vs baseline: +4.9% ✅ capitalize_noaspectTime: ✅ 2.552µs (SLO: <10.000µs 📉 -74.5%) vs baseline: -1.4% Memory: ✅ 42.644MB (SLO: <43.500MB 🟡 -2.0%) vs baseline: +5.0% ✅ casefold_aspectTime: ✅ 14.496µs (SLO: <20.000µs 📉 -27.5%) vs baseline: -1.3% Memory: ✅ 42.605MB (SLO: <43.500MB -2.1%) vs baseline: +4.9% ✅ casefold_noaspectTime: ✅ 3.136µs (SLO: <10.000µs 📉 -68.6%) vs baseline: -0.3% Memory: ✅ 42.605MB (SLO: <43.500MB -2.1%) vs baseline: +4.9% ✅ decode_aspectTime: ✅ 15.428µs (SLO: <30.000µs 📉 -48.6%) vs baseline: -1.3% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +5.0% ✅ decode_noaspectTime: ✅ 1.606µs (SLO: <10.000µs 📉 -83.9%) vs baseline: -0.2% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +4.9% ✅ encode_aspectTime: ✅ 17.891µs (SLO: <30.000µs 📉 -40.4%) vs baseline: 📈 +21.5% Memory: ✅ 42.644MB (SLO: <43.500MB 🟡 -2.0%) vs baseline: +5.1% ✅ encode_noaspectTime: ✅ 1.423µs (SLO: <10.000µs 📉 -85.8%) vs baseline: -5.3% Memory: ✅ 42.703MB (SLO: <43.500MB 🟡 -1.8%) vs baseline: +5.1% ✅ format_aspectTime: ✅ 170.568µs (SLO: <200.000µs 📉 -14.7%) vs baseline: -0.3% Memory: ✅ 42.821MB (SLO: <43.250MB 🟡 -1.0%) vs baseline: +5.3% ✅ format_map_aspectTime: ✅ 190.912µs (SLO: <200.000µs -4.5%) vs baseline: -0.1% Memory: ✅ 42.782MB (SLO: <43.500MB 🟡 -1.7%) vs baseline: +5.3% ✅ format_map_noaspectTime: ✅ 3.806µs (SLO: <10.000µs 📉 -61.9%) vs baseline: -0.4% Memory: ✅ 42.684MB (SLO: <43.250MB 🟡 -1.3%) vs baseline: +5.1% ✅ format_noaspectTime: ✅ 3.135µs (SLO: <10.000µs 📉 -68.7%) vs baseline: -0.5% Memory: ✅ 42.684MB (SLO: <43.250MB 🟡 -1.3%) vs baseline: +5.1% ✅ index_aspectTime: ✅ 15.236µs (SLO: <20.000µs 📉 -23.8%) vs baseline: -0.2% Memory: ✅ 42.585MB (SLO: <43.250MB 🟡 -1.5%) vs baseline: +4.6% ✅ index_noaspectTime: ✅ 0.461µs (SLO: <10.000µs 📉 -95.4%) vs baseline: -0.1% Memory: ✅ 42.644MB (SLO: <43.500MB 🟡 -2.0%) vs baseline: +4.9% ✅ join_aspectTime: ✅ 16.973µs (SLO: <20.000µs 📉 -15.1%) vs baseline: -0.1% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +4.9% ✅ join_noaspectTime: ✅ 1.559µs (SLO: <10.000µs 📉 -84.4%) vs baseline: +0.5% Memory: ✅ 42.723MB (SLO: <43.250MB 🟡 -1.2%) vs baseline: +5.3% ✅ ljust_aspectTime: ✅ 20.535µs (SLO: <30.000µs 📉 -31.5%) vs baseline: -1.7% Memory: ✅ 42.585MB (SLO: <43.250MB 🟡 -1.5%) vs baseline: +4.8% ✅ ljust_noaspectTime: ✅ 2.660µs (SLO: <10.000µs 📉 -73.4%) vs baseline: -2.6% Memory: ✅ 42.526MB (SLO: <43.250MB 🟡 -1.7%) vs baseline: +4.6% ✅ lower_aspectTime: ✅ 17.714µs (SLO: <30.000µs 📉 -41.0%) vs baseline: -1.3% Memory: ✅ 42.585MB (SLO: <43.500MB -2.1%) vs baseline: +4.8% ✅ lower_noaspectTime: ✅ 2.394µs (SLO: <10.000µs 📉 -76.1%) vs baseline: -0.6% Memory: ✅ 42.605MB (SLO: <43.250MB 🟡 -1.5%) vs baseline: +4.9% ✅ lstrip_aspectTime: ✅ 17.598µs (SLO: <30.000µs 📉 -41.3%) vs baseline: -0.7% Memory: ✅ 42.723MB (SLO: <43.250MB 🟡 -1.2%) vs baseline: +5.2% ✅ lstrip_noaspectTime: ✅ 1.855µs (SLO: <10.000µs 📉 -81.4%) vs baseline: +0.2% Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.0% ✅ modulo_aspectTime: ✅ 166.176µs (SLO: <200.000µs 📉 -16.9%) vs baseline: -0.2% Memory: ✅ 42.743MB (SLO: <43.500MB 🟡 -1.7%) vs baseline: +5.3% ✅ modulo_aspect_for_bytearray_bytearrayTime: ✅ 180.083µs (SLO: <200.000µs -10.0%) vs baseline: +3.2% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +4.6% ✅ modulo_aspect_for_bytesTime: ✅ 168.975µs (SLO: <200.000µs 📉 -15.5%) vs baseline: +0.1% Memory: ✅ 42.703MB (SLO: <43.500MB 🟡 -1.8%) vs baseline: +5.3% ✅ modulo_aspect_for_bytes_bytearrayTime: ✅ 172.079µs (SLO: <200.000µs 📉 -14.0%) vs baseline: ~same Memory: ✅ 42.684MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ modulo_noaspectTime: ✅ 3.633µs (SLO: <10.000µs 📉 -63.7%) vs baseline: -0.7% Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.2% ✅ replace_aspectTime: ✅ 211.489µs (SLO: <300.000µs 📉 -29.5%) vs baseline: -0.1% Memory: ✅ 42.664MB (SLO: <44.000MB -3.0%) vs baseline: +5.1% ✅ replace_noaspectTime: ✅ 2.916µs (SLO: <10.000µs 📉 -70.8%) vs baseline: ~same Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.0% ✅ repr_aspectTime: ✅ 1.430µs (SLO: <10.000µs 📉 -85.7%) vs baseline: +0.5% Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ repr_noaspectTime: ✅ 0.524µs (SLO: <10.000µs 📉 -94.8%) vs baseline: ~same Memory: ✅ 42.703MB (SLO: <43.500MB 🟡 -1.8%) vs baseline: +5.0% ✅ rstrip_aspectTime: ✅ 18.877µs (SLO: <30.000µs 📉 -37.1%) vs baseline: -0.4% Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.0% ✅ rstrip_noaspectTime: ✅ 1.938µs (SLO: <10.000µs 📉 -80.6%) vs baseline: ~same Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ slice_aspectTime: ✅ 15.756µs (SLO: <20.000µs 📉 -21.2%) vs baseline: -1.0% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +5.1% ✅ slice_noaspectTime: ✅ 0.599µs (SLO: <10.000µs 📉 -94.0%) vs baseline: +0.4% Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ stringio_aspectTime: ✅ 53.671µs (SLO: <80.000µs 📉 -32.9%) vs baseline: -0.6% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +5.0% ✅ stringio_noaspectTime: ✅ 3.626µs (SLO: <10.000µs 📉 -63.7%) vs baseline: -0.1% Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ strip_aspectTime: ✅ 17.525µs (SLO: <20.000µs 📉 -12.4%) vs baseline: -0.5% Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ strip_noaspectTime: ✅ 1.840µs (SLO: <10.000µs 📉 -81.6%) vs baseline: -1.6% Memory: ✅ 42.644MB (SLO: <43.500MB 🟡 -2.0%) vs baseline: +4.8% ✅ swapcase_aspectTime: ✅ 18.331µs (SLO: <30.000µs 📉 -38.9%) vs baseline: -0.8% Memory: ✅ 42.566MB (SLO: <43.500MB -2.1%) vs baseline: +4.9% ✅ swapcase_noaspectTime: ✅ 2.775µs (SLO: <10.000µs 📉 -72.2%) vs baseline: -0.9% Memory: ✅ 42.723MB (SLO: <43.500MB 🟡 -1.8%) vs baseline: +5.1% ✅ title_aspectTime: ✅ 18.119µs (SLO: <30.000µs 📉 -39.6%) vs baseline: -0.7% Memory: ✅ 42.625MB (SLO: <43.000MB 🟡 -0.9%) vs baseline: +5.1% ✅ title_noaspectTime: ✅ 2.622µs (SLO: <10.000µs 📉 -73.8%) vs baseline: -1.2% Memory: ✅ 42.644MB (SLO: <43.500MB 🟡 -2.0%) vs baseline: +4.8% ✅ translate_aspectTime: ✅ 24.022µs (SLO: <30.000µs 📉 -19.9%) vs baseline: 📈 +16.6% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +4.9% ✅ translate_noaspectTime: ✅ 4.266µs (SLO: <10.000µs 📉 -57.3%) vs baseline: -1.4% Memory: ✅ 42.605MB (SLO: <43.500MB -2.1%) vs baseline: +4.9% ✅ upper_aspectTime: ✅ 17.814µs (SLO: <30.000µs 📉 -40.6%) vs baseline: -0.7% Memory: ✅ 42.664MB (SLO: <43.500MB 🟡 -1.9%) vs baseline: +5.1% ✅ upper_noaspectTime: ✅ 2.399µs (SLO: <10.000µs 📉 -76.0%) vs baseline: -1.1% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +4.6% 📈 iastaspectsospath - 24/24✅ ospathbasename_aspectTime: ✅ 5.108µs (SLO: <10.000µs 📉 -48.9%) vs baseline: 📈 +19.6% Memory: ✅ 42.644MB (SLO: <43.500MB 🟡 -2.0%) vs baseline: +5.3% ✅ ospathbasename_noaspectTime: ✅ 4.282µs (SLO: <10.000µs 📉 -57.2%) vs baseline: -0.7% Memory: ✅ 42.743MB (SLO: <43.500MB 🟡 -1.7%) vs baseline: +5.6% ✅ ospathjoin_aspectTime: ✅ 6.229µs (SLO: <10.000µs 📉 -37.7%) vs baseline: -0.7% Memory: ✅ 42.644MB (SLO: <43.500MB 🟡 -2.0%) vs baseline: +5.3% ✅ ospathjoin_noaspectTime: ✅ 6.329µs (SLO: <10.000µs 📉 -36.7%) vs baseline: +0.4% Memory: ✅ 42.625MB (SLO: <43.500MB -2.0%) vs baseline: +4.9% ✅ ospathnormcase_aspectTime: ✅ 3.546µs (SLO: <10.000µs 📉 -64.5%) vs baseline: -0.6% Memory: ✅ 42.644MB (SLO: <43.500MB 🟡 -2.0%) vs baseline: +5.2% ✅ ospathnormcase_noaspectTime: ✅ 3.583µs (SLO: <10.000µs 📉 -64.2%) vs baseline: -2.0% Memory: ✅ 42.546MB (SLO: <43.500MB -2.2%) vs baseline: +4.9% ✅ ospathsplit_aspectTime: ✅ 4.881µs (SLO: <10.000µs 📉 -51.2%) vs baseline: -0.8% Memory: ✅ 42.487MB (SLO: <43.500MB -2.3%) vs baseline: +4.5% ✅ ospathsplit_noaspectTime: ✅ 5.001µs (SLO: <10.000µs 📉 -50.0%) vs baseline: -0.8% Memory: ✅ 42.408MB (SLO: <43.500MB -2.5%) vs baseline: +4.6% ✅ ospathsplitdrive_aspectTime: ✅ 3.757µs (SLO: <10.000µs 📉 -62.4%) vs baseline: -0.3% Memory: ✅ 42.605MB (SLO: <43.500MB -2.1%) vs baseline: +5.2% ✅ ospathsplitdrive_noaspectTime: ✅ 0.740µs (SLO: <10.000µs 📉 -92.6%) vs baseline: -0.9% Memory: ✅ 42.487MB (SLO: <43.500MB -2.3%) vs baseline: +4.5% ✅ ospathsplitext_aspectTime: ✅ 4.591µs (SLO: <10.000µs 📉 -54.1%) vs baseline: -1.1% Memory: ✅ 42.546MB (SLO: <43.500MB -2.2%) vs baseline: +5.1% ✅ ospathsplitext_noaspectTime: ✅ 4.642µs (SLO: <10.000µs 📉 -53.6%) vs baseline: +0.5% Memory: ✅ 42.566MB (SLO: <43.500MB -2.1%) vs baseline: +5.1% 📈 telemetryaddmetric - 30/30✅ 1-count-metric-1-timesTime: ✅ 3.419µs (SLO: <20.000µs 📉 -82.9%) vs baseline: 📈 +13.4% Memory: ✅ 34.977MB (SLO: <35.500MB 🟡 -1.5%) vs baseline: +5.0% ✅ 1-count-metrics-100-timesTime: ✅ 199.934µs (SLO: <220.000µs -9.1%) vs baseline: -1.3% Memory: ✅ 34.996MB (SLO: <35.500MB 🟡 -1.4%) vs baseline: +5.4% ✅ 1-distribution-metric-1-timesTime: ✅ 3.357µs (SLO: <20.000µs 📉 -83.2%) vs baseline: -0.2% Memory: ✅ 34.878MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +5.0% ✅ 1-distribution-metrics-100-timesTime: ✅ 213.831µs (SLO: <230.000µs -7.0%) vs baseline: -1.8% Memory: ✅ 34.937MB (SLO: <35.500MB 🟡 -1.6%) vs baseline: +5.0% ✅ 1-gauge-metric-1-timesTime: ✅ 2.230µs (SLO: <20.000µs 📉 -88.8%) vs baseline: -0.7% Memory: ✅ 34.957MB (SLO: <35.500MB 🟡 -1.5%) vs baseline: +5.2% ✅ 1-gauge-metrics-100-timesTime: ✅ 137.721µs (SLO: <150.000µs -8.2%) vs baseline: -0.4% Memory: ✅ 34.819MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.4% ✅ 1-rate-metric-1-timesTime: ✅ 3.171µs (SLO: <20.000µs 📉 -84.1%) vs baseline: -0.4% Memory: ✅ 34.918MB (SLO: <35.500MB 🟡 -1.6%) vs baseline: +4.8% ✅ 1-rate-metrics-100-timesTime: ✅ 214.642µs (SLO: <250.000µs 📉 -14.1%) vs baseline: -1.8% Memory: ✅ 34.977MB (SLO: <35.500MB 🟡 -1.5%) vs baseline: +5.2% ✅ 100-count-metrics-100-timesTime: ✅ 20.058ms (SLO: <22.000ms -8.8%) vs baseline: +1.2% Memory: ✅ 34.977MB (SLO: <35.500MB 🟡 -1.5%) vs baseline: +5.0% ✅ 100-distribution-metrics-100-timesTime: ✅ 2.227ms (SLO: <2.550ms 📉 -12.7%) vs baseline: -2.0% Memory: ✅ 34.878MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +5.2% ✅ 100-gauge-metrics-100-timesTime: ✅ 1.425ms (SLO: <1.550ms -8.0%) vs baseline: +0.5% Memory: ✅ 34.937MB (SLO: <35.500MB 🟡 -1.6%) vs baseline: +4.9% ✅ 100-rate-metrics-100-timesTime: ✅ 2.192ms (SLO: <2.550ms 📉 -14.0%) vs baseline: +0.1% Memory: ✅ 34.977MB (SLO: <35.500MB 🟡 -1.5%) vs baseline: +5.1% ✅ flush-1-metricTime: ✅ 4.509µs (SLO: <20.000µs 📉 -77.5%) vs baseline: -1.0% Memory: ✅ 35.271MB (SLO: <35.500MB 🟡 -0.6%) vs baseline: +5.9% ✅ flush-100-metricsTime: ✅ 173.028µs (SLO: <250.000µs 📉 -30.8%) vs baseline: -0.4% Memory: ✅ 35.330MB (SLO: <35.500MB 🟡 -0.5%) vs baseline: +5.2% ✅ flush-1000-metricsTime: ✅ 2.178ms (SLO: <2.500ms 📉 -12.9%) vs baseline: -0.7% Memory: ✅ 36.137MB (SLO: <36.500MB 🟡 -1.0%) vs baseline: +5.4% 🟡 Near SLO Breach (16 suites)🟡 coreapiscenario - 10/10 (1 unstable)
|
ebf52bb to
5b60f24
Compare
|
This pull request has been automatically closed after a period of inactivity. |
Pull request was closed
## Description FastAPI 0.137 ([PR #15745](fastapi/fastapi#15745)) refactored `APIRouter.include_router` to use a lazy `_IncludedRouter` wrapper instead of flattening routes onto the parent router at registration time. This introduced two regressions in the ddtrace starlette/fastapi integration: 1. **Missing path prefix** — `scope["route"].path_format` now returns only the leaf-relative segment (e.g. `""` or `/{item_id}`) instead of the fully-composed template (e.g. `/v1/items`). Spans produced by nested `include_router` calls lose their prefix entirely, collapsing all `GET` requests into a single `GET ` bucket in APM. 2. **Path doubling** — `APIRoute.handle` in 0.137 falls back to `super().handle()` (starlette `Route.handle`) when no `effective_route_context` is present. When both the fastapi and starlette patches are active, `traced_handler` fires twice for the same route instance, doubling the accumulated path (e.g. `GET /file/file`). **Fix in `ddtrace/contrib/internal/starlette/patch.py` (`traced_handler`):** - **`effective_route_context` override**: FastAPI 0.137 sets `scope["fastapi"]["effective_route_context"].path_format` to the fully-composed route template before calling `APIRoute.handle`. When this key is present, use it directly as the resource name instead of relying on path accumulation from `instance.path`. - **Seen-routes guard**: Track route instances processed per request via `scope["datadog"]["_dd_seen_routes"]`. If `traced_handler` is entered for an instance already seen in this request, skip accumulation and pass through — preventing the double-counting introduced by the `super().handle()` fallback. The lockfile (`162f3ce`) is bumped to `fastapi==0.137.1` / `starlette==1.3.1` so the `latest` venv in CI exercises the affected versions. ## Testing - Added `test_nested_include_router_resource_names` — a self-contained test using a two-level nested `include_router` that asserts the full composed path appears in both `resource` and `http.route` (directly reproduces the customer issue in GH-18621). - Ran the full fastapi test suite against 6 venvs covering FastAPI 0.64, 0.86, 0.90 (Python 3.9–3.13) and the fixed 0.137.1 — all passed with no regressions. - `test_w_patch_starlette` (path doubling regression) and `test_subapp_w_starlette_patch_snapshot` (snapshot) also pass on 0.137.1. ## Risks - The `_dd_seen_routes` guard uses `id(instance)` to deduplicate route calls within a request. `id()` values can be reused after GC, but route objects are singletons created at app startup and live for the full application lifetime, so collision is not possible in practice. - The `effective_route_context` key is FastAPI-specific (`scope["fastapi"]`) and is guarded with `.get()` so it is a no-op on pure Starlette and older FastAPI versions. ## Design Decision: Seen-Routes Guard The conceptually cleaner fix for path doubling would be to skip patching `starlette.routing.Route.handle` entirely when the fastapi patch is active, letting the fastapi patch own `APIRoute.handle` exclusively. This was rejected because starlette apps mounted inside FastAPI go through `Route.handle` without going through `APIRoute.handle` — removing the starlette patch on `Route.handle` would break resource names for those sub-apps. Tracking seen route instances per request is the safer, more targeted approach. ## Additional Notes - The `_dd_seen_routes` guard is necessary independently of the `effective_route_context` fix: the former addresses double-firing on plain routes when both patches are active; the latter addresses missing prefixes on nested `include_router` routes. Both are required — verified by running each change in isolation. - Older FastAPI versions (0.64, 0.86, 0.90) do not set `scope["fastapi"]` or call `super().handle()` in `APIRoute.handle`, so neither change affects their behaviour. Co-authored-by: mohammad.islam <[email protected]>
Update structlog lockfiles and dependency package lockfiles.
This performs the following updates:
latest. This will update structlog and dependencies.latestversion of another package. This will update all such packages.