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