标准答案
- 日志使用结构化字段记录 request ID、trace ID、路由、状态、耗时和版本。
- AsyncLocalStorage 只承载最小上下文,不能把整个请求对象和 Secret 放进去。
- HTTP/RPC 使用标准 Trace Context,消息头保存必要信息,消费时创建新的处理 Span。
- 批量、重试、Worker 和 child_process 要记录尝试 ID,避免不同操作混在一条链路。
题目解析
请求入口接收或生成 trace/request ID,AsyncLocalStorage 只保存最小的关联字段;HTTP/RPC 通过标准 Trace Context 传播,消息则把事件和生产 Span 关联后在消费端创建新的处理 Span。
批量、重试、Worker 和 child_process 都可能脱离原始调用链,需要记录操作 ID、事件 ID 和尝试 ID。授权上下文不能因为 trace ID 被传播就自动信任。
结构化日志至少要包含路由、状态、耗时、版本和关联 ID,并对租户、用户和 payload 做脱敏。可观测链路的目标是解释因果,不是保存所有请求内容。
常见误区
- 误区:把 request 对象放入长期上下文。改正:只保存不可变的最小字段,并在任务结束时释放引用。
- 误区:异步消息丢失原始事件关联。改正:传播 trace context、事件 ID 和尝试 ID,消费时建立新的 Span。
- 误区:日志只打印字符串没有结构化维度。改正:使用结构化字段,支持按路由、实例、版本和请求关联检索。