Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions src/dstack/_internal/server/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from typing import Awaitable, Callable, List

import sentry_sdk
from fastapi import FastAPI, Request, status
from fastapi import FastAPI, Request, Response, status
from fastapi.datastructures import URL
from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse
from fastapi.staticfiles import StaticFiles
Expand Down Expand Up @@ -215,10 +215,14 @@ async def os_error_handler(request, exc: OSError):
@app.middleware("http")
async def log_request(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
response: Response = await call_next(request)
process_time = time.time() - start_time
logger.debug(
"Processed request %s %s in %s", request.method, request.url, f"{process_time:0.6f}s"
"Processed request %s %s in %s. Status: %s",
request.method,
request.url,
f"{process_time:0.6f}s",
response.status_code,
)
return response

Expand Down
22 changes: 19 additions & 3 deletions src/dstack/api/server/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,16 @@ def _request(
else:
raise ClientError(f"Failed to connect to dstack server {self._base_url}")

if 400 <= resp.status_code < 600:
logger.debug(
"Error requesting %s. Status: %s. Headers: %s. Body: %s",
resp.request.url,
resp.status_code,
resp.headers,
resp.content,
)

if raise_for_status:
if resp.status_code == 500:
raise ClientError("Unexpected dstack server error")
if resp.status_code == 400: # raise ServerClientError
detail: List[Dict] = resp.json()["detail"]
if len(detail) == 1 and detail[0]["code"] in _server_client_errors:
Expand All @@ -145,7 +152,16 @@ def _request(
if resp.status_code == 422:
formatted_error = pprint.pformat(resp.json())
raise ClientError(f"Server validation error: \n{formatted_error}")
resp.raise_for_status()
if resp.status_code == 403:
raise ClientError(
f"Access to {resp.request.url} is denied. Please check your access token"
)
if 400 <= resp.status_code < 600:
raise ClientError(
f"Unexpected error: status code {resp.status_code}"
f" when requesting {resp.request.url}."
" Check server logs or run with DSTACK_CLI_LOG_LEVEL=DEBUG to see more details"
)
return resp


Expand Down