【原因】
链路追踪用的是Jaeger,但每个请求没法看到具体的请求信息和响应信息,这让排查问题不方便,如图只能看到各个链路调用的信息。
【改造】
基于go-zero,在main.go文件添加一个拦截器(中间件)
s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
vmallGoods.RegisterVMallGoodsServer(grpcServer, srv)
})
defer s.Stop()
//加入下面这行
s.AddUnaryInterceptors(InjectSpanInfoInterceptor)
这里定义了一个InjectSpanInfoInterceptor方法,下面就实现这个方法:
func InjectSpanInfoInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
reqDataStr, _ := json.Marshal(req)
serverSpan := opentracing.SpanFromContext(ctx)
defer func () {
if err := recover(); err != nil {
serverSpan.SetTag("error", true)
serverSpan.LogKV("error-msg", err)
}
}()
methodName := info.FullMethod
//先把span获取出来
if serverSpan == nil {
serverSpan = opentracing.StartSpan(methodName)
} else {
serverSpan.SetOperationName(methodName)
}
defer serverSpan.Finish()
ctx = opentracing.ContextWithSpan(ctx, serverSpan)
//记录请求数据,LogRequestData是常量,可根据自己喜好定义字符串
serverSpan.LogKV(LogRequestData, string(reqDataStr))
//执行后续代码
resp, err = handler(ctx, req)
//记录响应数据,LogResponseData是常量,可根据自己喜好定义字符串
respStr, _ := json.Marshal(resp)
serverSpan.LogKV(LogResponseData, string(respStr))
return resp,err
}
【结果】
如图,这样就出现了request-data和response-data,看到具体的请求和响应信息啦