context.Context 是链路追踪的基石,因其需显式传递追踪上下文,跨 goroutine、HTTP、gRPC 时若未持续传递则 traceID 丢失,导致 span 断裂。
为什么 context.Context 是链路追踪的基石
Go 的链路追踪不是靠框架自动注入,而是靠 context.Context 显式传递追踪上下文。没有它,span 就断了——哪怕用了 OpenTelemetry 或 Jaeger SDK,跨 goroutine、HTTP、gRPC 时都会丢失 traceID。
关键点在于:你必须在每次调用前把带 trace 信息的 context 传下去,不能只在入口解析一次就丢掉。
- HTTP handler 中用
r.Context()拿原始 context,再用tracer.Start()创建 span,并用ctx, span := tracer.Start(r.Context(), "http_handler")续上链路 - 调用下游服务时,必须把当前
ctx传给 HTTP client 或 gRPC client,比如http.NewRequestWithContext(ctx, ...) - goroutine 启动前,用
ctx = context.WithValue(ctx, key, val)或更安全的context.WithCancel(ctx)派生,避免 context 泄漏
OpenTelemetry Go SDK 初始化常见错误
初始化错一步,整个服务上报的 trace 全是孤立 span,查不到上下游依赖。最常踩的坑是 exporter 配置没生效或 SDK 没注册。
检查这三点: