【原因】

链路追踪用的是Jaeger,但每个请求没法看到具体的请求信息和响应信息,这让排查问题不方便,如图只能看到各个链路调用的信息。

2021060109184830.png

【改造】

基于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
}

【结果】

2021060109254464.png

如图,这样就出现了request-data和response-data,看到具体的请求和响应信息啦