Trace 与日志关联:让一次请求只有一条排障路径
背景 同一次故障分散在网关、服务和消息消费者里,靠时间搜索日志很容易混入其他请求。需要统一的关联字段与传播协议。 核心判断 从当前有效 span 提取 trace_id 和 span_id,再构造结构化日志。 请求 ID 保留入口语义,版本与服务名帮助定位发布差异。 跨消息边界显式注入和提取追踪上下文。 最小示例 下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。 logger := slog.With("trace_id", traceID, "span_id", spanID); logger.Error("payment failed", "order_id", orderID) 边界与误区 示例中的 ID 来自业务上下文,不是任意字符串。未采样请求也可以有 trace ID,但追踪后端不一定留存该 trace,日志必须仍能独立排障。 验证方式 发送一个跨服务并经过队列的请求,检查各段日志的关联一致性;再覆盖无父级上下文、未采样请求与消费者重试。 小结 日志统一输出 trace_id、span_id、request_id 和版本,异步消息显式传递上下文。