Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
db432ad
feat: update log context
Oct 22, 2025
9502acc
feat: update log context
Oct 22, 2025
d74e628
feat: update mcp
Oct 23, 2025
32b2ac1
feat: update mcp
Oct 23, 2025
e4c6b92
feat: add error log
Oct 23, 2025
c27bd61
feat: add error log
Oct 23, 2025
6769b4c
feat: add error log
Oct 23, 2025
01547e1
feat: update log
Oct 24, 2025
a19584f
feat: add chat_time
Oct 24, 2025
8dfa338
feat: add chat_time
Oct 24, 2025
a91e3e2
feat: add chat_time
Oct 24, 2025
5b962e2
feat: update log
Oct 24, 2025
69a6e9a
feat: update log
Oct 24, 2025
d325a31
feat: update log
Oct 24, 2025
f0e5f5c
feat: update log
Oct 24, 2025
7fc8c05
feat: update log
Oct 24, 2025
185ed93
feat: add arms
Oct 26, 2025
f641b70
feat: add arms
Oct 26, 2025
d5c59a0
fix: format
Oct 26, 2025
b144470
fix: format
Oct 26, 2025
33921b7
feat: add dockerfile
Oct 26, 2025
49a9079
feat: add dockerfile
Oct 26, 2025
27c49b6
feat: add arms config
Oct 26, 2025
60c5dd8
feat: update log
Oct 26, 2025
3096321
feat: add sleep time
Oct 26, 2025
204efef
feat: add sleep time
Oct 26, 2025
e2c9cbf
fix: conflict
Oct 28, 2025
33a41e8
feat: update log
Oct 28, 2025
cf23174
feat: delete dockerfile
Oct 28, 2025
18e2eda
feat: delete dockerfile
Oct 28, 2025
f9a18a5
feat: update dockerfile
Oct 28, 2025
399e200
fix: conflict
Oct 28, 2025
1d4f3d1
fix: conflict
Oct 28, 2025
92be50b
feat: replace ThreadPool to context
Oct 28, 2025
8a1fd64
feat: add timed log
Oct 28, 2025
7d7f731
fix: conflict
Oct 28, 2025
9fea59b
feat: add request log
Nov 3, 2025
4b72a63
feat: add request log
Nov 3, 2025
c3b9e83
fix: merge dev conflict
Nov 3, 2025
258ea92
feat: add source in request
Nov 3, 2025
cb6b4cf
fix: conflict
Nov 3, 2025
6509fdd
Merge branch 'dev' into feat/add-request-log
CarltonXiang Nov 3, 2025
76ce57e
feat: source
Nov 3, 2025
11d6ae3
Merge branch 'feat/add-request-log' of github.com:CarltonXiang/MemOS …
Nov 3, 2025
c3141b9
Merge branch 'dev' into feat/add-request-log
CaralHsi Nov 3, 2025
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
20 changes: 16 additions & 4 deletions src/memos/api/middleware/request_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,17 @@ class RequestContextMiddleware(BaseHTTPMiddleware):
3. Ensures the context is available throughout the request lifecycle
"""

def __init__(self, app, source: str | None = None):
"""
Initialize the middleware.

Args:
app: The ASGI application
source: Source identifier (e.g., 'product' or 'server') to distinguish request origin
"""
super().__init__(app)
self.source = source or "api"

async def dispatch(self, request: Request, call_next: Callable) -> Response:
# Extract or generate trace_id
trace_id = extract_trace_id_from_headers(request) or generate_trace_id()
Expand All @@ -178,6 +189,7 @@ async def dispatch(self, request: Request, call_next: Callable) -> Response:
env=env,
user_type=user_type,
user_name=user_name,
source=self.source,
)
set_request_context(context)

Expand All @@ -199,7 +211,7 @@ async def receive():
# Continue without restoring body, downstream handlers will handle it

logger.info(
f"Request started, method: {request.method}, path: {request.url.path}, "
f"Request started, source: {self.source}, method: {request.method}, path: {request.url.path}, "
f"request params: {params_log}, headers: {request.headers}"
)

Expand All @@ -209,16 +221,16 @@ async def receive():
end_time = time.time()
if response.status_code == 200:
logger.info(
f"Request completed: {request.url.path}, status: {response.status_code}, cost: {(end_time - start_time) * 1000:.2f}ms"
f"Request completed: source: {self.source}, path: {request.url.path}, status: {response.status_code}, cost: {(end_time - start_time) * 1000:.2f}ms"
)
else:
logger.error(
f"Request Failed: {request.url.path}, status: {response.status_code}, cost: {(end_time - start_time) * 1000:.2f}ms"
f"Request Failed: source: {self.source}, path: {request.url.path}, status: {response.status_code}, cost: {(end_time - start_time) * 1000:.2f}ms"
)
except Exception as e:
end_time = time.time()
logger.error(
f"Request Exception Error: {e}, cost: {(end_time - start_time) * 1000:.2f}ms"
f"Request Exception Error: source: {self.source}, path: {request.url.path}, error: {e}, cost: {(end_time - start_time) * 1000:.2f}ms"
)
raise e

Expand Down
2 changes: 1 addition & 1 deletion src/memos/api/product_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
version="1.0.1",
)

app.add_middleware(RequestContextMiddleware)
app.add_middleware(RequestContextMiddleware, source="product_api")
# Include routers
app.include_router(product_router)

Expand Down
2 changes: 1 addition & 1 deletion src/memos/api/server_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
version="1.0.1",
)

app.add_middleware(RequestContextMiddleware)
app.add_middleware(RequestContextMiddleware, source="server_api")
# Include routers
app.include_router(server_router)

Expand Down
15 changes: 15 additions & 0 deletions src/memos/context/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,14 @@ def __init__(
env: str | None = None,
user_type: str | None = None,
user_name: str | None = None,
source: str | None = None,
):
self.trace_id = trace_id or "trace-id"
self.api_path = api_path
self.env = env
self.user_type = user_type
self.user_name = user_name
self.source = source
self._data: dict[str, Any] = {}

def set(self, key: str, value: Any) -> None:
Expand All @@ -59,6 +61,7 @@ def __setattr__(self, name: str, value: Any) -> None:
"env",
"user_type",
"user_name",
"source",
):
super().__setattr__(name, value)
else:
Expand All @@ -80,6 +83,7 @@ def to_dict(self) -> dict[str, Any]:
"env": self.env,
"user_type": self.user_type,
"user_name": self.user_name,
"source": self.source,
"data": self._data.copy(),
}

Expand Down Expand Up @@ -146,6 +150,16 @@ def get_current_user_name() -> str | None:
return "memos"


def get_current_source() -> str | None:
"""
Get the current request's source (e.g., 'product_api' or 'server_api').
"""
context = _request_context.get()
if context:
return context.get("source")
return None


def get_current_context() -> RequestContext | None:
"""
Get the current request context.
Expand All @@ -161,6 +175,7 @@ def get_current_context() -> RequestContext | None:
env=context_dict.get("env"),
user_type=context_dict.get("user_type"),
user_name=context_dict.get("user_name"),
source=context_dict.get("source"),
)
ctx._data = context_dict.get("data", {}).copy()
return ctx
Expand Down
Loading