Summary
pyproject.toml declares opentelemetry-instrumentation-fastapi and opentelemetry-instrumentation-httpx in the core dependencies without a version floor. FastAPI 0.137.0 (2026-06-14) introduced a routing change — include_router now yields a lazily-matching _IncludedRouter object with no .path — that makes opentelemetry-instrumentation-fastapi < 0.64b0 raise AttributeError: '_IncludedRouter' object has no attribute 'path' on CORS preflight OPTIONS requests to include_router-mounted routes → unhandled 500.
This took down a downstream consumer, policyengine-uk-chat, in production: every browser preflight 500'd and the app was unusable (PolicyEngine/policyengine-uk-chat#167). It affects any consumer that enables instrument_fastapi on FastAPI ≥0.137.
Upstream
Change
Pin the instrumentation floors to the fixed release in pyproject.toml (and refresh uv.lock):
opentelemetry-instrumentation-fastapi>=0.64b0
opentelemetry-instrumentation-httpx>=0.64b0 (same coordinated OTel release train — keep them aligned)
Possible follow-up (not in this change)
Per this repo's own guidance ("observability failures must fail open — do not break the observed operation"), the FastAPI adapter should arguably guard against an instrumentor raising per-request. The crash occurs inside OpenTelemetry's own ASGI middleware, so failing open there needs an adapter-level wrapper rather than the setup-time try/except we have around instrument_app() today. Worth a separate hardening task so a future instrumentor incompatibility degrades instead of 500-ing.
Summary
pyproject.tomldeclaresopentelemetry-instrumentation-fastapiandopentelemetry-instrumentation-httpxin the coredependencieswithout a version floor. FastAPI 0.137.0 (2026-06-14) introduced a routing change —include_routernow yields a lazily-matching_IncludedRouterobject with no.path— that makesopentelemetry-instrumentation-fastapi< 0.64b0 raiseAttributeError: '_IncludedRouter' object has no attribute 'path'on CORS preflightOPTIONSrequests toinclude_router-mounted routes → unhandled 500.This took down a downstream consumer,
policyengine-uk-chat, in production: every browser preflight 500'd and the app was unusable (PolicyEngine/policyengine-uk-chat#167). It affects any consumer that enablesinstrument_fastapion FastAPI ≥0.137.Upstream
opentelemetry-instrumentation-fastapi0.64b0 on 2026-06-24.Change
Pin the instrumentation floors to the fixed release in
pyproject.toml(and refreshuv.lock):opentelemetry-instrumentation-fastapi>=0.64b0opentelemetry-instrumentation-httpx>=0.64b0(same coordinated OTel release train — keep them aligned)Possible follow-up (not in this change)
Per this repo's own guidance ("observability failures must fail open — do not break the observed operation"), the FastAPI adapter should arguably guard against an instrumentor raising per-request. The crash occurs inside OpenTelemetry's own ASGI middleware, so failing open there needs an adapter-level wrapper rather than the setup-time
try/exceptwe have aroundinstrument_app()today. Worth a separate hardening task so a future instrumentor incompatibility degrades instead of 500-ing.