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