forked from phoenix-oss/llama-stack-mirror
fix: FastAPI built-in paths bypass custom routing (Docs) and update r… (#1841)
## What does this PR do? This PR improves the server's request routing logic by ensuring built-in FastAPI paths such as `/docs`, `/redoc`, `/openapi.json`, `/favicon.ico`, and `/static` bypass the custom `TracingMiddleware`. This prevents unnecessary tracing logic for documentation and static file requests, ensuring better performance and cleaner logs. Additionally, it adds proper metadata (`title`, `description`, and `version`) to the FastAPI application initialization and updates the requirements document accordingly. [//]: # (Closes #1822 ) --- ## Test Plan - Ran the server locally with `uvicorn` using the provided `run.yaml` config - Verified that: - FastAPI docs (`/docs`, `/redoc`) load correctly without triggering the custom tracing middleware - All other routes still go through the middleware and trace logic - Application metadata appears as expected in the OpenAPI docs To reproduce: 1. Start the server with `python server.py --template <template-name>` 2. Navigate to `/docs` and `/redoc` 3. Confirm that no extra trace headers are added for those routes 4. Confirm other API endpoints behave as expected and include `x-trace-id` in the response headers [//]: # (## Documentation) --- Froze the requirements file to include many of the other libraries that have been added in the past few releases to make install easier. --------- Co-authored-by: Sébastien Han <seb@redhat.com>
This commit is contained in:
parent
cf158f2cb9
commit
86c6f1f112
1 changed files with 22 additions and 2 deletions
|
@ -229,15 +229,30 @@ class TracingMiddleware:
|
||||||
def __init__(self, app, impls):
|
def __init__(self, app, impls):
|
||||||
self.app = app
|
self.app = app
|
||||||
self.impls = impls
|
self.impls = impls
|
||||||
|
# FastAPI built-in paths that should bypass custom routing
|
||||||
|
self.fastapi_paths = ("/docs", "/redoc", "/openapi.json", "/favicon.ico", "/static")
|
||||||
|
|
||||||
async def __call__(self, scope, receive, send):
|
async def __call__(self, scope, receive, send):
|
||||||
if scope.get("type") == "lifespan":
|
if scope.get("type") == "lifespan":
|
||||||
return await self.app(scope, receive, send)
|
return await self.app(scope, receive, send)
|
||||||
|
|
||||||
path = scope.get("path", "")
|
path = scope.get("path", "")
|
||||||
|
|
||||||
|
# Check if the path is a FastAPI built-in path
|
||||||
|
if path.startswith(self.fastapi_paths):
|
||||||
|
# Pass through to FastAPI's built-in handlers
|
||||||
|
logger.debug(f"Bypassing custom routing for FastAPI built-in path: {path}")
|
||||||
|
return await self.app(scope, receive, send)
|
||||||
|
|
||||||
if not hasattr(self, "endpoint_impls"):
|
if not hasattr(self, "endpoint_impls"):
|
||||||
self.endpoint_impls = initialize_endpoint_impls(self.impls)
|
self.endpoint_impls = initialize_endpoint_impls(self.impls)
|
||||||
_, _, trace_path = find_matching_endpoint(scope.get("method", "GET"), path, self.endpoint_impls)
|
|
||||||
|
try:
|
||||||
|
_, _, trace_path = find_matching_endpoint(scope.get("method", "GET"), path, self.endpoint_impls)
|
||||||
|
except ValueError:
|
||||||
|
# If no matching endpoint is found, pass through to FastAPI
|
||||||
|
logger.debug(f"No matching endpoint found for path: {path}, falling back to FastAPI")
|
||||||
|
return await self.app(scope, receive, send)
|
||||||
|
|
||||||
trace_context = await start_trace(trace_path, {"__location__": "server", "raw_path": path})
|
trace_context = await start_trace(trace_path, {"__location__": "server", "raw_path": path})
|
||||||
|
|
||||||
|
@ -388,7 +403,12 @@ def main(args: Optional[argparse.Namespace] = None):
|
||||||
safe_config = redact_sensitive_fields(config.model_dump())
|
safe_config = redact_sensitive_fields(config.model_dump())
|
||||||
logger.info(yaml.dump(safe_config, indent=2))
|
logger.info(yaml.dump(safe_config, indent=2))
|
||||||
|
|
||||||
app = FastAPI(lifespan=lifespan)
|
app = FastAPI(
|
||||||
|
lifespan=lifespan,
|
||||||
|
docs_url="/docs",
|
||||||
|
redoc_url="/redoc",
|
||||||
|
openapi_url="/openapi.json",
|
||||||
|
)
|
||||||
if not os.environ.get("LLAMA_STACK_DISABLE_VERSION_CHECK"):
|
if not os.environ.get("LLAMA_STACK_DISABLE_VERSION_CHECK"):
|
||||||
app.add_middleware(ClientVersionMiddleware)
|
app.add_middleware(ClientVersionMiddleware)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue