...

Source file src/github.com/grpc-ecosystem/go-grpc-middleware/logging/kit/client_interceptors.go

Documentation: github.com/grpc-ecosystem/go-grpc-middleware/logging/kit

     1  package kit
     2  
     3  import (
     4  	"path"
     5  	"time"
     6  
     7  	"context"
     8  
     9  	"github.com/go-kit/log"
    10  	"google.golang.org/grpc"
    11  )
    12  
    13  // UnaryClientInterceptor returns a new unary client interceptor that optionally logs the execution of external gRPC calls.
    14  func UnaryClientInterceptor(logger log.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  		fields := newClientLoggerFields(ctx, method)
    18  		startTime := time.Now()
    19  		err := invoker(ctx, method, req, reply, cc, opts...)
    20  		logFinalClientLine(o, log.With(logger, fields...), startTime, err, "finished client unary call")
    21  		return err
    22  	}
    23  }
    24  
    25  // StreamClientInterceptor returns a new streaming client interceptor that optionally logs the execution of external gRPC calls.
    26  func StreamClientInterceptor(logger log.Logger, opts ...Option) grpc.StreamClientInterceptor {
    27  	o := evaluateClientOpt(opts)
    28  	return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
    29  		fields := newClientLoggerFields(ctx, method)
    30  		startTime := time.Now()
    31  		clientStream, err := streamer(ctx, desc, cc, method, opts...)
    32  		logFinalClientLine(o, log.With(logger, fields...), startTime, err, "finished client streaming call")
    33  		return clientStream, err
    34  	}
    35  }
    36  
    37  func logFinalClientLine(o *options, logger log.Logger, startTime time.Time, err error, msg string) {
    38  	code := o.codeFunc(err)
    39  	logger = o.levelFunc(code, logger)
    40  	args := []interface{}{"msg", msg, "error", err, "grpc.code", code.String()}
    41  	args = append(args, o.durationFunc(time.Since(startTime))...)
    42  	logger.Log(args...)
    43  }
    44  
    45  func newClientLoggerFields(ctx context.Context, fullMethodString string) []interface{} {
    46  	service := path.Dir(fullMethodString)[1:]
    47  	method := path.Base(fullMethodString)
    48  	return []interface{}{
    49  		"system", "grpc",
    50  		"span.kind", "client",
    51  		"grpc.service", service,
    52  		"grpc.method", method,
    53  	}
    54  }
    55  

View as plain text