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
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
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