trace_utils.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import time
  2. import uuid
  3. # core/utils/trace_utils.py
  4. import uuid
  5. import contextvars
  6. # 定义全局上下文变量,用于存储当前 trace_id
  7. trace_id = contextvars.ContextVar("trace_id", default=None)
  8. def generate_trace_id() -> str:
  9. """生成唯一 trace_id"""
  10. return f"{uuid.uuid4().hex[:8]}-{int(time.time() * 1000)}"
  11. def get_current_trace_id() -> str:
  12. """获取当前上下文的 trace_id"""
  13. return trace_id.get()
  14. def set_current_trace_id(trace_id: str) -> None:
  15. """设置当前上下文的 trace_id"""
  16. trace_id.set(trace_id)
  17. class TraceContext:
  18. """上下文管理器:自动创建和清理 trace_id"""
  19. def __init__(self, trace_id: str = None):
  20. self.trace_id = trace_id or generate_trace_id()
  21. self.token = None # 用于退出时恢复上下文
  22. def __enter__(self) -> str:
  23. # 保存当前上下文状态(token),并设置新的 trace_id
  24. self.token = trace_id.set(self.trace_id)
  25. return self.trace_id
  26. def __exit__(self, exc_type, exc_val, exc_tb):
  27. # 退出时恢复之前的上下文(避免影响其他协程/线程)
  28. if self.token:
  29. trace_id.reset(self.token)