kratos 无法使用 java agent 接入 skywalking,因其是 go 项目,不运行于 jvm,无字节码与类加载机制;必须使用 skywalking-go 探针手动初始化、配置 oap 地址,并为 http/grpc server/client 显式注入拦截器。

Kratos 不能直接用 Java Agent 接入 SkyWalking —— 它是 Go 项目,Java 字节码增强对它完全无效。你得用官方支持的 Go 探针 skywalking-go,手动初始化、注入上下文、适配 HTTP/gRPC 拦截器。否则服务跑起来后 UI 里根本看不到任何 Trace 数据。
为什么 Kratos 无法复用 SpringBoot 那套 Java Agent 方式
Kratos 是基于 Go 编写的微服务框架,运行在 Go runtime 上,不经过 JVM。而 skywalking-agent.jar 依赖 Java 的 java.lang.instrument 和字节码重写(如 Byte Buddy),对 Go 二进制文件完全无感知。试图在 go run 或 ./app 启动时加 -javaagent: 参数会直接报错或静默失效。
- 常见错误现象:
flag provided but not defined: -javaagent或进程启动后 SkyWalking UI 中零服务注册、零 Trace - 根本原因:Go 没有类加载机制、没有字节码、不支持运行时类增强
- 替代路径只有一条:用 Go 原生 SDK 主动集成,而非“零侵入”
接入步骤:用 skywalking-go 初始化 + HTTP/gRPC Middleware
必须显式调用 tracer.Start() 并配置好 OAP 地址;Kratos 的 http.Server 和 grpc.Server 需分别注入拦截器,否则中间件链路断裂。
- 安装探针:
go get github.com/apache/skywalking-go/tracer - 在
main.go初始化(注意放在app.Run()前):func main() { tracer.Start( tracer.WithServiceName("user-service"), tracer.WithCollectorAddress("oap-svc:11800"), // gRPC 地址,非 HTTP tracer.WithReportStrategy(tracer.GRPCReportStrategy), ) defer tracer.Close() app := wire.NewApp(...) app.Run() } - Kratos HTTP Server 注入:
http.Middleware中添加sw_http.NewServerInterceptor(),确保它在路由匹配前执行 - Kratos gRPC Server 注入:传入
grpc.UnaryInterceptor(sw_grpc.NewServerInterceptor())和grpc.StreamInterceptor(...)
容易漏掉的关键配置点
即使代码写了初始化和拦截器,以下三项任一缺失都会导致链路断开或数据不全:
-
SW_AGENT_NAME环境变量未设置或与WithServiceName不一致 → UI 中服务名显示为unknown - OAP 地址用了 HTTP 端口(如
8080)而非 gRPC 端口(默认11800)→ 连接拒绝,日志中出现connection refused - HTTP 拦截器没包裹 Kratos 的
engine或router,而是放在了某个 handler 内部 → 只能捕获到该 handler 的 Span,丢失请求入口和响应阶段 - gRPC 客户端未启用
sw_grpc.NewClientInterceptor()→ 下游调用无父 Span,形成孤立链路
Go 生态的链路追踪不是“配个 agent 就完事”,它要求你理解 Span 生命周期、Context 传递时机和中间件挂载顺序。Kratos 的优雅在于结构清晰,代价是你得亲手把 tracer 插进每个关键节点——少一步,链路就断在那。











