Skip to content

Commit 185ed93

Browse files
author
harvey_xiang
committed
feat: add arms
1 parent acf65f4 commit 185ed93

File tree

5 files changed

+70
-12
lines changed

5 files changed

+70
-12
lines changed

src/memos/api/exceptions.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22

3+
from fastapi.exceptions import HTTPException, RequestValidationError
34
from fastapi.requests import Request
45
from fastapi.responses import JSONResponse
56

@@ -10,9 +11,24 @@
1011
class APIExceptionHandler:
1112
"""Centralized exception handling for MemOS APIs."""
1213

14+
@staticmethod
15+
async def validation_error_handler(request: Request, exc: RequestValidationError):
16+
"""Handle request validation errors."""
17+
logger.error(f"Validation error: {exc.errors()}")
18+
return JSONResponse(
19+
status_code=422,
20+
content={
21+
"code": 422,
22+
"message": "Parameter validation error",
23+
"detail": exc.errors(),
24+
"data": None,
25+
},
26+
)
27+
1328
@staticmethod
1429
async def value_error_handler(request: Request, exc: ValueError):
1530
"""Handle ValueError exceptions globally."""
31+
logger.error(f"ValueError: {exc}")
1632
return JSONResponse(
1733
status_code=400,
1834
content={"code": 400, "message": str(exc), "data": None},
@@ -21,8 +37,17 @@ async def value_error_handler(request: Request, exc: ValueError):
2137
@staticmethod
2238
async def global_exception_handler(request: Request, exc: Exception):
2339
"""Handle all unhandled exceptions globally."""
24-
logger.exception("Unhandled error:")
40+
logger.error(f"Exception: {exc}")
2541
return JSONResponse(
2642
status_code=500,
2743
content={"code": 500, "message": str(exc), "data": None},
2844
)
45+
46+
@staticmethod
47+
async def http_error_handler(request: Request, exc: HTTPException):
48+
"""Handle HTTP exceptions globally."""
49+
logger.error(f"HTTP error {exc.status_code}: {exc.detail}")
50+
return JSONResponse(
51+
status_code=exc.status_code,
52+
content={"code": exc.status_code, "message": str(exc.detail), "data": None},
53+
)

src/memos/api/middleware/request_context.py

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
Request context middleware for automatic trace_id injection.
33
"""
44

5+
import os
6+
import time
7+
58
from collections.abc import Callable
69

710
from starlette.middleware.base import BaseHTTPMiddleware
@@ -15,6 +18,10 @@
1518

1619
logger = memos.log.get_logger(__name__)
1720

21+
print("ARMS_APP_NAME", os.environ["ARMS_APP_NAME"])
22+
print("ARMS_REGION_ID", os.environ["ARMS_REGION_ID"])
23+
print("ARMS_LICENSE_KEY", os.environ["ARMS_LICENSE_KEY"])
24+
1825

1926
def extract_trace_id_from_headers(request: Request) -> str | None:
2027
"""Extract trace_id from various possible headers with priority: g-trace-id > x-trace-id > trace-id."""
@@ -38,6 +45,8 @@ async def dispatch(self, request: Request, call_next: Callable) -> Response:
3845
# Extract or generate trace_id
3946
trace_id = extract_trace_id_from_headers(request) or generate_trace_id()
4047

48+
start_time = time.time()
49+
4150
# Create and set request context
4251
context = RequestContext(trace_id=trace_id, api_path=request.url.path)
4352
set_request_context(context)
@@ -49,15 +58,28 @@ async def dispatch(self, request: Request, call_next: Callable) -> Response:
4958
if request.query_params:
5059
params_log["query_params"] = dict(request.query_params)
5160

52-
logger.info(f"Request started: {request.method} {request.url.path}, {params_log}")
61+
logger.info(f"Request started, params: {params_log}, headers: {request.headers}")
5362

5463
# Process the request
55-
response = await call_next(request)
56-
57-
# Log request completion with output
58-
logger.info(f"Request completed: {request.url.path}, status: {response.status_code}")
59-
60-
# Add trace_id to response headers for debugging
61-
response.headers["x-trace-id"] = trace_id
64+
try:
65+
response = await call_next(request)
66+
end_time = time.time()
67+
logger.info(f"response is: {response.body}")
68+
69+
# 记录请求状态
70+
if response.status_code == 200:
71+
logger.info(
72+
f"Request completed: {request.url.path}, status: {response.status_code}, cost: {(end_time - start_time) * 1000:.2f}ms"
73+
)
74+
else:
75+
logger.error(
76+
f"Request Failed: {request.url.path}, status: {response.status_code}, cost: {(end_time - start_time) * 1000:.2f}ms"
77+
)
78+
except Exception as e:
79+
end_time = time.time()
80+
logger.error(
81+
f"Request Exception Error: {e}, cost: {(end_time - start_time) * 1000:.2f}ms"
82+
)
83+
raise e
6284

6385
return response

src/memos/api/routers/server_router.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ def search_memories(search_req: APISearchRequest):
237237
}
238238
)
239239

240+
logger.info(f"search_memories response is: {memories_result}")
241+
240242
return SearchResponse(
241243
message="Search completed successfully",
242244
data=memories_result,
@@ -285,6 +287,9 @@ def add_memories(add_req: APIADDRequest):
285287
}
286288
for memory_id, memory in zip(mem_id_list, flattened_memories, strict=False)
287289
]
290+
291+
logger.info(f"add_memories response is: {response_data}")
292+
288293
return MemoryResponse(
289294
message="Memory added successfully",
290295
data=response_data,

src/memos/api/server_api.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22

3-
from fastapi import FastAPI
3+
from fastapi import FastAPI, HTTPException
4+
from fastapi.exceptions import RequestValidationError
45

56
from memos.api.exceptions import APIExceptionHandler
67
from memos.api.middleware.request_context import RequestContextMiddleware
@@ -21,8 +22,13 @@
2122
# Include routers
2223
app.include_router(server_router)
2324

24-
# Exception handlers
25+
# Request validation failed
26+
app.exception_handler(RequestValidationError)(APIExceptionHandler.validation_error_handler)
27+
# Invalid business code parameters
2528
app.exception_handler(ValueError)(APIExceptionHandler.value_error_handler)
29+
# Business layer manual exception
30+
app.exception_handler(HTTPException)(APIExceptionHandler.http_error_handler)
31+
# Fallback for unknown errors
2632
app.exception_handler(Exception)(APIExceptionHandler.global_exception_handler)
2733

2834

src/memos/log.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ def close(self):
160160
},
161161
"handlers": {
162162
"console": {
163-
"level": selected_log_level,
163+
"level": "DEBUG",
164164
"class": "logging.StreamHandler",
165165
"stream": stdout,
166166
"formatter": "no_datetime",

0 commit comments

Comments
 (0)