Skip to content

Commit 9ea42e4

Browse files
CarltonXiangharvey_xiangCaralHsi
authored
Feat/add request log (#442)
* feat: update log context * feat: update log context * feat: update mcp * feat: update mcp * feat: add error log * feat: add error log * feat: add error log * feat: update log * feat: add chat_time * feat: add chat_time * feat: add chat_time * feat: update log * feat: update log * feat: update log * feat: update log * feat: update log * feat: add arms * fix: format * fix: format * feat: add dockerfile * feat: add dockerfile * feat: add arms config * feat: update log * feat: add sleep time * feat: add sleep time * feat: update log * feat: delete dockerfile * feat: delete dockerfile * feat: update dockerfile * fix: conflict * feat: replace ThreadPool to context * feat: add timed log * feat: add request log * feat: add request log * feat: add source in request * feat: source --------- Co-authored-by: harvey_xiang <[email protected]> Co-authored-by: CaralHsi <[email protected]>
1 parent e79a9ab commit 9ea42e4

File tree

4 files changed

+33
-6
lines changed

4 files changed

+33
-6
lines changed

src/memos/api/middleware/request_context.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,17 @@ class RequestContextMiddleware(BaseHTTPMiddleware):
162162
3. Ensures the context is available throughout the request lifecycle
163163
"""
164164

165+
def __init__(self, app, source: str | None = None):
166+
"""
167+
Initialize the middleware.
168+
169+
Args:
170+
app: The ASGI application
171+
source: Source identifier (e.g., 'product' or 'server') to distinguish request origin
172+
"""
173+
super().__init__(app)
174+
self.source = source or "api"
175+
165176
async def dispatch(self, request: Request, call_next: Callable) -> Response:
166177
# Extract or generate trace_id
167178
trace_id = extract_trace_id_from_headers(request) or generate_trace_id()
@@ -178,6 +189,7 @@ async def dispatch(self, request: Request, call_next: Callable) -> Response:
178189
env=env,
179190
user_type=user_type,
180191
user_name=user_name,
192+
source=self.source,
181193
)
182194
set_request_context(context)
183195

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

201213
logger.info(
202-
f"Request started, method: {request.method}, path: {request.url.path}, "
214+
f"Request started, source: {self.source}, method: {request.method}, path: {request.url.path}, "
203215
f"request params: {params_log}, headers: {request.headers}"
204216
)
205217

@@ -209,16 +221,16 @@ async def receive():
209221
end_time = time.time()
210222
if response.status_code == 200:
211223
logger.info(
212-
f"Request completed: {request.url.path}, status: {response.status_code}, cost: {(end_time - start_time) * 1000:.2f}ms"
224+
f"Request completed: source: {self.source}, path: {request.url.path}, status: {response.status_code}, cost: {(end_time - start_time) * 1000:.2f}ms"
213225
)
214226
else:
215227
logger.error(
216-
f"Request Failed: {request.url.path}, status: {response.status_code}, cost: {(end_time - start_time) * 1000:.2f}ms"
228+
f"Request Failed: source: {self.source}, path: {request.url.path}, status: {response.status_code}, cost: {(end_time - start_time) * 1000:.2f}ms"
217229
)
218230
except Exception as e:
219231
end_time = time.time()
220232
logger.error(
221-
f"Request Exception Error: {e}, cost: {(end_time - start_time) * 1000:.2f}ms"
233+
f"Request Exception Error: source: {self.source}, path: {request.url.path}, error: {e}, cost: {(end_time - start_time) * 1000:.2f}ms"
222234
)
223235
raise e
224236

src/memos/api/product_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
version="1.0.1",
1818
)
1919

20-
app.add_middleware(RequestContextMiddleware)
20+
app.add_middleware(RequestContextMiddleware, source="product_api")
2121
# Include routers
2222
app.include_router(product_router)
2323

src/memos/api/server_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
version="1.0.1",
1919
)
2020

21-
app.add_middleware(RequestContextMiddleware)
21+
app.add_middleware(RequestContextMiddleware, source="server_api")
2222
# Include routers
2323
app.include_router(server_router)
2424

src/memos/context/context.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ def __init__(
3636
env: str | None = None,
3737
user_type: str | None = None,
3838
user_name: str | None = None,
39+
source: str | None = None,
3940
):
4041
self.trace_id = trace_id or "trace-id"
4142
self.api_path = api_path
4243
self.env = env
4344
self.user_type = user_type
4445
self.user_name = user_name
46+
self.source = source
4547
self._data: dict[str, Any] = {}
4648

4749
def set(self, key: str, value: Any) -> None:
@@ -59,6 +61,7 @@ def __setattr__(self, name: str, value: Any) -> None:
5961
"env",
6062
"user_type",
6163
"user_name",
64+
"source",
6265
):
6366
super().__setattr__(name, value)
6467
else:
@@ -80,6 +83,7 @@ def to_dict(self) -> dict[str, Any]:
8083
"env": self.env,
8184
"user_type": self.user_type,
8285
"user_name": self.user_name,
86+
"source": self.source,
8387
"data": self._data.copy(),
8488
}
8589

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

148152

153+
def get_current_source() -> str | None:
154+
"""
155+
Get the current request's source (e.g., 'product_api' or 'server_api').
156+
"""
157+
context = _request_context.get()
158+
if context:
159+
return context.get("source")
160+
return None
161+
162+
149163
def get_current_context() -> RequestContext | None:
150164
"""
151165
Get the current request context.
@@ -161,6 +175,7 @@ def get_current_context() -> RequestContext | None:
161175
env=context_dict.get("env"),
162176
user_type=context_dict.get("user_type"),
163177
user_name=context_dict.get("user_name"),
178+
source=context_dict.get("source"),
164179
)
165180
ctx._data = context_dict.get("data", {}).copy()
166181
return ctx

0 commit comments

Comments
 (0)