golang如何使用OpenTelemetry链路追踪_golang OpenTelemetry链路追踪使用方法
TracerProvider 必须在 main() 开头注册,否则 span 为 nil;需调用 otel.SetTracerProvider 和 otel.SetTextMapPropagator;HTTP 入口用 otelhttp.NewHandler,出向用 otelhttp.Transport;数据库用 otelsql.InjectDriver;避免高基数字段作 attribute。TracerProvider 必须在 main() 开头就注册,否则所有 span 都是空的Go 里 otel.Tracer() 调用不会报错,但如果你没提前注册 sdktrace.TracerProvider,它返回的 span 永远是 nil,日志里看不到 trace_id,HTTP 中间件也不生效——这是最典型的“静默失效”。必须在 main() 函数最开始、任何 handler 启动前完成注册,全局只做一次别放在 init() 里:单元测试并发初始化会 panic别在某个 HTTP handler 里临时 new 一个:会导致多个 provider 冲突,采样逻辑错乱注册后务必调用 otel.SetTracerProvider(tp) 和 otel.SetTextMapPropagator(propagation.TraceContext{}),缺一不可HTTP 入口必须用 otelhttp.NewHandler,手写 extract + StartSpan 是错的很多人自己解析 req.Header.Get("traceparent") 再调 tracer.Start(),结果 span 名字全是 HTTP GET、没有状态码、不带 net.peer.ip、跨 goroutine 传播失败——因为漏掉了 OpenTelemetry 对 HTTP server 语义的完整封装。otelhttp.NewHandler 会自动:提取 header、注入 context、记录 method/path 为 span name、捕获 response status、结束 span 时机精准到 writeHeader 完成Gin 用户不要用 gin.Use(...) 包裸 http.Handler;要用 ginotel.Middleware,否则路由名丢失(如 GET /api/order/:id 变成 GET /)自定义中间件里要起 child span,必须从 r.Context() 取 context,不能用 context.Background()下游 HTTP 调用必须用 otelhttp.Transport,http.DefaultClient 是断链元凶入向用了 otelhttp.NewHandler,但出向还用原始 http.Client,那整个链路只有一跳——下游服务收不到 traceparent,span 就断在第一个服务出口。 文心快码 文心快码(Comate)是百度推出的一款AI辅助编程工具
