应使用 go.opentelemetry.io/otel避免已归档的 opentracing-go 和 go-opencensus初始化 TracerProvider 后必须显式调用 Shutdown() 防止 trace 丢失导出器开发用 JaegerUDP 6831生产用 OTLP务必设置 service.nameHTTP 自动透传用 otelhttp.NewHandler数据库需用 otelsql.RegisterDriver 全链路拦截禁用高基数字段异步 goroutine 必须传递上游 context。新项目直接用 go.opentelemetry.io/otel别碰 opentracing-go 或 go-opencensus——它们已归档或停止维护上下文传播不可靠跟现代服务网格如 Istio、Jaeger v1.50、AWS X-Ray 都不兼容。怎么初始化 TracerProvider 并确保数据不丢必须显式调用 Shutdown()否则进程退出时未 flush 的 trace 会丢失。常见漏写位置是 main() 函数末尾或 HTTP server 的 GracefulShutdown 钩子里。导出器选型本地开发用 jaegerUDP 端口 6831生产推荐 otlphttp 或 otlpgrpc 配合 OpenTelemetry Collector采样器默认是 ParentBased(AlwaysSample)高流量服务建议配 TraceIDRatioBased(0.01) 避免打爆后端resource.WithAttributes(semconv.ServiceNameKey.String(my-service)) 必须设否则 Jaeger UI 里看不到服务名别在 init() 里初始化 tracer——它依赖 context 和网络应放在 main() 启动阶段HTTP 请求怎么自动透传 traceparent 而不手写 header用 otelhttp.NewHandler() 包裹 handler它自动完成 inbound context extract span create outbound inject。自己手动 req.Header.Set(traceparent, ...) 会漏 tracestate多 vendor 场景下链路断裂。net/http 直接用http.Handle(/api, otelhttp.NewHandler(http.HandlerFunc(handler), api))Gin/Echo 不支持 otelhttp.NewHandler得写中间件且必须显式传 propagation.TraceContext{}否则默认不解析 traceparent若下游是 Java Spring Cloud得换 propagation.B3{} 并确保 header 是 X-B3-TraceId否则链路在跨语言边界断开健康检查路径如 /healthz建议跳过埋点避免污染 trace 数据可用 otelhttp.WithFilter() 过滤数据库查询为什么 span 总是断掉或 duration 不准只 wrap sql.DB比如用 otelsql.Open不够——它覆盖不了 sql.Tx 内部的 Stmt.Exec、预编译语句、Rows.Scan 等底层操作span 断裂或耗时统计失真。 Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西