必须使用 apache/skywalking-go v1.0+(如 v1.4.0),初始化置于 main() 开头并指定配置文件;HTTP/gRPC 需用 sw_http/sw_grpc 封装客户端和服务端;MQ 场景需手动注入/提取 trace 上下文;采样率默认 0.1,应设为 1 并确认后端地址与连通性;span 必须显式 defer End()。

Go服务里怎么装SkyWalking SDK?别用官方老版本
直接用 skywalking-go 官方 SDK(v0.12.x 之前)会卡在 context 透传和 gRPC 插件不兼容上,尤其跟 Java、Python 服务混调时 trace ID 对不上。必须切到 apache/skywalking-go 的 v1.0+(目前最新是 v1.4.0),它才真正支持 OpenTracing 兼容的上下文传播和跨语言 W3C TraceContext 标准。
- 用
go get -u github.com/apache/skywalking-go@v1.4.0拉取,不是skywalking-go(旧名已弃用) - 初始化必须放在
main()最开头,且sw.Init要传sw.WithConfigFile("skywalking.yaml"),不能只靠环境变量 - 如果用了
net/http或gin,得显式调用sw_http.NewServer包裹 handler,否则 HTTP 入口不会自动埋点
HTTP 和 gRPC 调用怎么保证 trace ID 不断?
Go 默认不透传 traceparent header,Java/Python 服务发来的请求进不来就断链。关键不是加 header,而是让 Go client 主动读写 W3C 标准字段。
- 对出向 HTTP 请求:用
sw_http.NewClient替代原生http.Client,它会自动从当前 span 注入traceparent - 对出向 gRPC:必须用
sw_grpc.NewClient+sw_grpc.NewServer,原生grpc.Dial和grpc.Server会丢 span context - 手动透传场景(比如转发第三方 webhook):从
sw.ContextFromIncomingRequest(r)取 span,再用sw.InjectSpanToOutgoingRequest(req, span)写 header
为什么 Java 服务能看到 trace,Go 里却查不到子 span?
常见原因是 Go 服务没启用采样或上报失败,不是埋点逻辑问题。SkyWalking agent 默认采样率是 1(全采),但 Go SDK 默认是 0.1,且不报错也不打日志,看起来像没数据。
- 检查
skywalking.yaml中agent.sample_rate是否设为1,低于 1 就可能漏掉低频接口 - 确认
agent.backend_grpc_host指向 SkyWalking OAP 的11800端口(不是 UI 的 8080),且 Go 服务能 telnet 通 - 启动时加
SW_AGENT_LOG_LEVEL=DEBUG,看日志里有没有reporter: send to backend success,没有就是网络或认证问题
微服务间有 MQ(Kafka/RabbitMQ)怎么串 trace?
Kafka 消息本身不带 trace 上下文,Go 消费者拿到消息后默认是新 trace,必须手动把 producer 侧注入的 context 提取出来并激活。
立即学习“go语言免费学习笔记(深入)”;
- Producer 发送前:用
sw_kafka.InjectSpanToMessage(msg, span)把traceparent写进msg.Headers(Kafka)或msg.Properties(RabbitMQ) - Consumer 收到后:用
sw_kafka.ExtractSpanFromMessage(msg)解析出 span,再用sw.ContinueSpan(ctx, extractedSpan)激活,否则后续 HTTP/gRPC 调用都是孤立 span - RabbitMQ 注意:必须用 AMQP 1.0 协议(
github.com/Azure/go-amqp),AMQP 0.9.1 的 properties 不支持 binary headers,无法存 trace 数据
defer span.End() 或提前 return 导致 span 不上报,OAP 就收不到完整链路。每个 handler 函数入口用 sw.CreateEntrySpan,出口务必 defer end,别依赖 GC。


















