github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/helper/grpc-middleware/logging/client_interceptors.go (about) 1 package logging 2 3 import ( 4 "context" 5 "path" 6 "time" 7 8 "github.com/hashicorp/go-hclog" 9 "google.golang.org/grpc" 10 "google.golang.org/grpc/status" 11 ) 12 13 // UnaryClientInterceptor returns a new unary client interceptor that logs the execution of gRPC calls. 14 func UnaryClientInterceptor(logger hclog.Logger, opts ...Option) grpc.UnaryClientInterceptor { 15 o := evaluateClientOpt(opts) 16 return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { 17 startTime := time.Now() 18 err := invoker(ctx, method, req, reply, cc, opts...) 19 emitClientLog(logger, o, method, startTime, err, "finished client unary call") 20 return err 21 } 22 } 23 24 // StreamClientInterceptor returns a new streaming client interceptor that logs the execution of gRPC calls. 25 func StreamClientInterceptor(logger hclog.Logger, opts ...Option) grpc.StreamClientInterceptor { 26 o := evaluateClientOpt(opts) 27 return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { 28 startTime := time.Now() 29 clientStream, err := streamer(ctx, desc, cc, method, opts...) 30 emitClientLog(logger, o, method, startTime, err, "finished client streaming call") 31 return clientStream, err 32 } 33 } 34 35 func emitClientLog(logger hclog.Logger, o *options, fullMethodString string, startTime time.Time, err error, msg string) { 36 code := status.Code(err) 37 logLevel := o.levelFunc(code) 38 reqDuration := time.Now().Sub(startTime) 39 service := path.Dir(fullMethodString)[1:] 40 method := path.Base(fullMethodString) 41 logger.Log(logLevel, msg, "grpc.code", code, "duration", reqDuration, "grpc.service", service, "grpc.method", method) 42 }