tracinginterceptor.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package clientinterceptors
  2. import (
  3. "context"
  4. "github.com/tal-tech/go-zero/core/trace"
  5. "google.golang.org/grpc"
  6. "google.golang.org/grpc/metadata"
  7. )
  8. // UnaryTracingInterceptor is an interceptor that handles tracing.
  9. func UnaryTracingInterceptor(ctx context.Context, method string, req, reply interface{},
  10. cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
  11. ctx, span := trace.StartClientSpan(ctx, cc.Target(), method)
  12. defer span.Finish()
  13. var pairs []string
  14. span.Visit(func(key, val string) bool {
  15. pairs = append(pairs, key, val)
  16. return true
  17. })
  18. ctx = metadata.AppendToOutgoingContext(ctx, pairs...)
  19. return invoker(ctx, method, req, reply, cc, opts...)
  20. }
  21. // StreamTracingInterceptor is an interceptor that handles tracing for stream requests.
  22. func StreamTracingInterceptor(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn,
  23. method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
  24. ctx, span := trace.StartClientSpan(ctx, cc.Target(), method)
  25. defer span.Finish()
  26. var pairs []string
  27. span.Visit(func(key, val string) bool {
  28. pairs = append(pairs, key, val)
  29. return true
  30. })
  31. ctx = metadata.AppendToOutgoingContext(ctx, pairs...)
  32. return streamer(ctx, desc, cc, method, opts...)
  33. }