in server/plugin/tracing/pzipkin/buildin.go [93:163]
func (zp *Zipkin) ClientBegin(operationName string, itf interface{}) interface{} {
var (
span opentracing.Span
)
switch r := itf.(type) {
case *http.Request:
ctx := r.Context()
parentSpan, ok := ctx.Value(tracing.CtxTraceSpan).(opentracing.Span)
if !ok {
return nil
}
span = ZipkinTracer().StartSpan(operationName, opentracing.ChildOf(parentSpan.Context()))
ext.SpanKindRPCClient.Set(span)
ext.HTTPMethod.Set(span, r.Method)
ext.HTTPUrl.Set(span, util.ParseRequestURL(r))
span.SetTag("protocol", "HTTP")
span.SetTag(zipkincore.HTTP_PATH, r.URL.Path)
span.SetTag(zipkincore.HTTP_HOST, r.URL.Host)
carrier := opentracing.HTTPHeadersCarrier(r.Header)
if err := ZipkinTracer().Inject(
span.Context(),
opentracing.HTTPHeaders,
carrier,
); err != nil {
log.Error("tracer inject request failed", err)
}
case *tracing.Request:
ctx := r.Ctx
parentSpan, ok := ctx.Value(tracing.CtxTraceSpan).(opentracing.Span)
if !ok {
return nil
}
u, _ := url.Parse(r.Endpoint + r.URL)
span = ZipkinTracer().StartSpan(operationName, opentracing.ChildOf(parentSpan.Context()))
ext.SpanKindRPCClient.Set(span)
ext.HTTPMethod.Set(span, r.Method)
ext.HTTPUrl.Set(span, u.String())
span.SetTag("protocol", "gRPC")
span.SetTag(zipkincore.HTTP_PATH, u.Path)
span.SetTag(zipkincore.HTTP_HOST, u.Host)
carrier := opentracing.HTTPHeadersCarrier{}
if err := ZipkinTracer().Inject(
span.Context(),
opentracing.HTTPHeaders,
carrier,
); err != nil {
log.Error("tracer inject request failed", err)
}
// inject context
err := carrier.ForeachKey(func(key, val string) error {
ctx = util.SetContext(ctx, util.CtxKey(key), val)
return nil
})
if err != nil {
log.Error("", err)
}
default:
return nil
}
return span
}