Skip to content

Commit 926a8b1

Browse files
authored
feat: Fix inconsistent trace_id in scheduler dequeue logs (#619)
Co-authored-by: [email protected] <>
1 parent 98fa2b5 commit 926a8b1

File tree

2 files changed

+51
-32
lines changed

2 files changed

+51
-32
lines changed

src/memos/context/context.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,16 @@ def to_dict(self) -> dict[str, Any]:
8888
}
8989

9090

91-
def set_request_context(context: RequestContext) -> None:
91+
def set_request_context(context: RequestContext | None) -> None:
9292
"""
9393
Set the current request context.
9494
9595
This is typically called by the API dependency injection system.
9696
"""
97-
_request_context.set(context.to_dict())
97+
if context:
98+
_request_context.set(context.to_dict())
99+
else:
100+
_request_context.set(None)
98101

99102

100103
def get_current_trace_id() -> str | None:

src/memos/mem_scheduler/base_scheduler.py

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@
1111
from sqlalchemy.engine import Engine
1212

1313
from memos.configs.mem_scheduler import AuthConfig, BaseSchedulerConfig
14-
from memos.context.context import ContextThread
14+
from memos.context.context import (
15+
ContextThread,
16+
RequestContext,
17+
get_current_context,
18+
set_request_context,
19+
)
1520
from memos.llms.base import BaseLLM
1621
from memos.log import get_logger
1722
from memos.mem_cube.base import BaseMemCube
@@ -775,35 +780,46 @@ def _message_consumer(self) -> None:
775780
if messages:
776781
now = time.time()
777782
for msg in messages:
778-
enqueue_ts_obj = getattr(msg, "timestamp", None)
779-
enqueue_epoch = None
780-
if isinstance(enqueue_ts_obj, int | float):
781-
enqueue_epoch = float(enqueue_ts_obj)
782-
elif hasattr(enqueue_ts_obj, "timestamp"):
783-
dt = enqueue_ts_obj
784-
if dt.tzinfo is None:
785-
dt = dt.replace(tzinfo=timezone.utc)
786-
enqueue_epoch = dt.timestamp()
787-
788-
queue_wait_ms = None
789-
if enqueue_epoch is not None:
790-
queue_wait_ms = max(0.0, now - enqueue_epoch) * 1000
791-
792-
# Avoid pydantic field enforcement by using object.__setattr__
793-
object.__setattr__(msg, "_dequeue_ts", now)
794-
emit_monitor_event(
795-
"dequeue",
796-
msg,
797-
{
798-
"enqueue_ts": to_iso(enqueue_ts_obj),
799-
"dequeue_ts": datetime.fromtimestamp(
800-
now, tz=timezone.utc
801-
).isoformat(),
802-
"queue_wait_ms": queue_wait_ms,
803-
},
804-
)
805-
806-
self.metrics.task_dequeued(user_id=msg.user_id, task_type=msg.label)
783+
prev_context = get_current_context()
784+
try:
785+
# Set context for this message
786+
msg_context = RequestContext(
787+
trace_id=msg.trace_id,
788+
user_name=msg.user_name,
789+
)
790+
set_request_context(msg_context)
791+
792+
enqueue_ts_obj = getattr(msg, "timestamp", None)
793+
enqueue_epoch = None
794+
if isinstance(enqueue_ts_obj, int | float):
795+
enqueue_epoch = float(enqueue_ts_obj)
796+
elif hasattr(enqueue_ts_obj, "timestamp"):
797+
dt = enqueue_ts_obj
798+
if dt.tzinfo is None:
799+
dt = dt.replace(tzinfo=timezone.utc)
800+
enqueue_epoch = dt.timestamp()
801+
802+
queue_wait_ms = None
803+
if enqueue_epoch is not None:
804+
queue_wait_ms = max(0.0, now - enqueue_epoch) * 1000
805+
806+
# Avoid pydantic field enforcement by using object.__setattr__
807+
object.__setattr__(msg, "_dequeue_ts", now)
808+
emit_monitor_event(
809+
"dequeue",
810+
msg,
811+
{
812+
"enqueue_ts": to_iso(enqueue_ts_obj),
813+
"dequeue_ts": datetime.fromtimestamp(
814+
now, tz=timezone.utc
815+
).isoformat(),
816+
"queue_wait_ms": queue_wait_ms,
817+
},
818+
)
819+
self.metrics.task_dequeued(user_id=msg.user_id, task_type=msg.label)
820+
finally:
821+
# Restore the prior context of the consumer thread
822+
set_request_context(prev_context)
807823
try:
808824
import contextlib
809825

0 commit comments

Comments
 (0)