func NewUnaryClientInterceptor()

in module/apmgrpc/client.go [43:92]


func NewUnaryClientInterceptor(o ...ClientOption) grpc.UnaryClientInterceptor {
	opts := clientOptions{}
	for _, o := range o {
		o(&opts)
	}
	return func(
		ctx context.Context,
		method string,
		req, resp interface{},
		cc *grpc.ClientConn,
		invoker grpc.UnaryInvoker,
		opts ...grpc.CallOption,
	) error {
		var peer peer.Peer     // maybe set after call if span != nil
		var header metadata.MD // maybe set after call if span != nil
		span, ctx := startSpan(ctx, method)
		if span != nil {
			defer span.End()
			opts = append(opts, grpc.Peer(&peer), grpc.Header(&header))
		}
		err := invoker(ctx, method, req, resp, cc, opts...)
		if span != nil {
			setSpanOutcome(span, err)
			url := url.URL{Scheme: "http", Path: method}
			if _, ok := peer.AuthInfo.(credentials.TLSInfo); ok {
				url.Scheme = "https"
			}
			if peer.Addr != nil {
				url.Host = peer.Addr.String()
			}
			span.Context.SetHTTPRequest(&http.Request{
				URL:        &url,
				Method:     "POST", // method is always POST
				ProtoMajor: 2,
				ProtoMinor: 0,
				Header:     http.Header(header),
			})
			if url.Host != "" {
				span.Context.SetDestinationService(apm.DestinationServiceSpanContext{
					Name:     url.Host,
					Resource: url.Host,
				})
			}
			span.Context.SetServiceTarget(apm.ServiceTargetSpanContext{
				Name: url.Host,
			})
		}
		return err
	}
}