system.currenttimemillis()仅提供毫秒级时间戳,需配合traceid、上下文传递与埋点逻辑才能实现链路追踪;推荐使用sleuth+zipkin或opentelemetry等成熟框架。

System.currentTimeMillis() 本身只是一个获取当前时间毫秒数的底层 API,它不包含任何链路追踪能力。要实现请求链路追踪,不能直接靠它,而是需要把它作为基础时间戳,配合其他机制(如唯一 traceId、上下文传递、埋点逻辑)来构建完整的链路追踪能力。
用 currentTimeMillis 记录关键时间点
在请求入口和出口处调用 System.currentTimeMillis(),可以记录请求开始和结束时间,用于计算耗时、定位慢请求:
- 入口处:long startTime = System.currentTimeMillis();
- 出口/响应前:long duration = System.currentTimeMillis() - startTime;
- 结合 traceId 打印日志:[trace-abc123] request took 142ms
必须搭配唯一 traceId 才能串联链路
单靠时间戳无法区分不同请求,所有日志都会混在一起。必须为每次请求生成全局唯一的 traceId(比如 UUID 或 Snowflake ID),并贯穿整个调用链:
- Web 层拦截器或 Filter 中生成 traceId,并存入 ThreadLocal
- 通过 MDC(Mapped Diagnostic Context)注入到 logback/log4j 日志中
- 跨线程(如线程池、异步任务)需手动传递 traceId,避免丢失
跨服务调用需透传 trace 上下文
HTTP 调用时,把 traceId 和 startTime(可选)通过请求头(如 X-Trace-ID、X-Start-Time)传递给下游服务:
- 下游服务收到后,复用该 traceId,继续记录自己的耗时和子 span
- startTime 可用于对齐各服务本地时间(需注意时钟漂移,生产环境建议用 NTP 同步)
- RPC 框架(如 Dubbo、gRPC)有类似 Opentracing / OpenTelemetry 的插件支持自动透传
推荐用标准方案替代手写 currentTimeMillis 埋点
虽然你能用 currentTimeMillis + traceId 实现简易追踪,但实际项目中更推荐使用成熟框架:
- Spring Cloud Sleuth + Zipkin:自动注入 traceId、spanId,记录时间、服务名、HTTP 状态等
- OpenTelemetry SDK:现代可观测性标准,支持多语言、自动 instrument(包括 HTTP、DB、缓存等)
- 这些框架底层确实会调用 currentTimeMillis(或更精确的 System.nanoTime),但封装了上下文传播、采样、上报等复杂逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











