in plugins/core/tracing.go [83:125]
func (t *Tracer) CreateExitSpan(operationName, peer string, injector interface{}, opts ...interface{}) (s interface{}, err error) {
ctx, tracingSpan, noop := t.createNoop(operationName)
if noop {
return tracingSpan, nil
}
defer func() {
saveSpanToActiveIfNotError(ctx, s, err)
}()
// if parent span is exit span, then use parent span as result
if tracingSpan != nil && tracingSpan.IsExit() && reflect.ValueOf(tracingSpan).Type() != snapshotType {
return tracingSpan, nil
}
span, noop, err := t.createSpan0(ctx, tracingSpan, opts, withSpanType(SpanTypeExit), withOperationName(operationName), withPeer(peer))
if err != nil {
return nil, err
}
if noop {
return span, nil
}
spanContext := &SpanContext{}
reportedSpan, ok := span.(SegmentSpan)
if !ok {
return nil, errors.New(fmt.Sprintf("span type is wrong: %T", span))
}
firstSpan := reportedSpan.GetSegmentContext().FirstSpan
spanContext.Sample = 1
spanContext.TraceID = reportedSpan.GetSegmentContext().TraceID
spanContext.ParentSegmentID = reportedSpan.GetSegmentContext().SegmentID
spanContext.ParentSpanID = reportedSpan.GetSegmentContext().SpanID
spanContext.ParentService = t.ServiceEntity.ServiceName
spanContext.ParentServiceInstance = t.ServiceEntity.ServiceInstanceName
spanContext.ParentEndpoint = firstSpan.GetOperationName()
spanContext.AddressUsedAtClient = peer
spanContext.CorrelationContext = reportedSpan.GetSegmentContext().CorrelationContext
err = spanContext.Encode(injector.(tracing.InjectorWrapper).Fun())
if err != nil {
return nil, err
}
return span, nil
}