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  }