Kitex 提供了对 opentracing 的支持,也支持用户自定义链路跟踪。
client 侧,默认使用 opentracing GlobalTracer
import "github.com/kitex-contrib/opentracing"
...
client, err := echo.NewClient("echo", opentracing.DefaultClientOption())
if err != nil {
log.Fatal(err)
}
server 侧,默认使用 opentracing GlobalTracer
import "github.com/kitex-contrib/opentracing"
...
svr, err := echo.NewServer(opentracing.DefaultServerOption())
if err := svr.Run(); err != nil {
log.Println("server stopped with error:", err)
} else {
log.Println("server stopped")
}
client 侧
import (
...
ko "github.com/kitex-contrib/opentracing"
"github.com/opentracing/opentracing-go"
"github.com/cloudwego/kitex/pkg/endpoint"
"github.com/cloudwego/kitex/pkg/rpcinfo"
...
)
...
myTracer := opentracing.GlobalTracer()
operationNameFunc := func(ctx context.Context) string {
endpoint := rpcinfo.GetRPCInfo(ctx).To()
return endpoint.ServiceName() + "::" + endpoint.Method()
}
...
client, err := echo.NewClient("echo", ko.ClientOption(myTracer, operationNameFunc))
if err != nil {
log.Fatal(err)
}
server 侧
import (
...
ko "github.com/kitex-contrib/opentracing"
"github.com/opentracing/opentracing-go"
"github.com/cloudwego/kitex/pkg/endpoint"
"github.com/cloudwego/kitex/pkg/rpcinfo"
...
)
...
myTracer := opentracing.GlobalTracer()
operationNameFunc := func(ctx context.Context) string {
endpoint := rpcinfo.GetRPCInfo(ctx).To()
return endpoint.ServiceName() + "::" + endpoint.Method()
}
...
svr, err := echo.NewServer(ko.ClientOption(myTracer, operationNameFunc))
if err := svr.Run(); err != nil {
log.Println("server stopped with error:", err)
} else {
log.Println("server stopped")
}
tracer 的定义如下:
type Tracer interface {
Start(ctx context.Context) context.Context
Finish(ctx context.Context)
}
示例:
client 侧
import "github.com/cloudwego/kitex/client"
...
type myTracer struct {}
func (m *myTracer) Start(ctx context.Context) context.Context {
_, ctx = opentracing.StartSpanFromContextWithTracer(ctx, o.tracer, "RPC call")
return ctx
}
func (m *myTracer) Finish(ctx context.Context) {
span := opentracing.SpanFromContext(ctx)
span.Finish()
}
...
client, err := echo.NewClient("echo", client.WithTracer(&myTracer{}))
if err != nil {
log.Fatal(err)
}
server 侧
import "github.com/cloudwego/kitex/server"
...
type myTracer struct {}
func (m *myTracer) Start(ctx context.Context) context.Context {
_, ctx = opentracing.StartSpanFromContextWithTracer(ctx, o.tracer, "RPC handle")
return ctx
}
func (m *myTracer) Finish(ctx context.Context) {
span := opentracing.SpanFromContext(ctx)
span.Finish()
}
...
svr, err := echo.NewServer(server.WithTracer(&myTracer{}))
if err := svr.Run(); err != nil {
log.Println("server stopped with error:", err)
} else {
log.Println("server stopped")
}