func()

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
}