in plugins/core/reporter/grpc/grpc.go [130:198]
func (r *gRPCReporter) SendTracing(spans []reporter.ReportedSpan) {
spanSize := len(spans)
if spanSize < 1 {
return
}
rootSpan := spans[spanSize-1]
rootCtx := rootSpan.Context()
segmentObject := &agentv3.SegmentObject{
TraceId: rootCtx.GetTraceID(),
TraceSegmentId: rootCtx.GetSegmentID(),
Spans: make([]*agentv3.SpanObject, spanSize),
Service: r.entity.ServiceName,
ServiceInstance: r.entity.ServiceInstanceName,
}
for i, s := range spans {
spanCtx := s.Context()
segmentObject.Spans[i] = &agentv3.SpanObject{
SpanId: spanCtx.GetSpanID(),
ParentSpanId: spanCtx.GetParentSpanID(),
StartTime: s.StartTime(),
EndTime: s.EndTime(),
OperationName: s.OperationName(),
Peer: s.Peer(),
SpanType: s.SpanType(),
SpanLayer: s.SpanLayer(),
ComponentId: s.ComponentID(),
IsError: s.IsError(),
Tags: s.Tags(),
Logs: s.Logs(),
}
srr := make([]*agentv3.SegmentReference, 0)
if i == (spanSize-1) && spanCtx.GetParentSpanID() > -1 {
srr = append(srr, &agentv3.SegmentReference{
RefType: agentv3.RefType_CrossThread,
TraceId: spanCtx.GetTraceID(),
ParentTraceSegmentId: spanCtx.GetParentSegmentID(),
ParentSpanId: spanCtx.GetParentSpanID(),
ParentService: r.entity.ServiceName,
ParentServiceInstance: r.entity.ServiceInstanceName,
})
}
if len(s.Refs()) > 0 {
for _, tc := range s.Refs() {
srr = append(srr, &agentv3.SegmentReference{
RefType: agentv3.RefType_CrossProcess,
TraceId: spanCtx.GetTraceID(),
ParentTraceSegmentId: tc.GetParentSegmentID(),
ParentSpanId: tc.GetParentSpanID(),
ParentService: tc.GetParentService(),
ParentServiceInstance: tc.GetParentServiceInstance(),
ParentEndpoint: tc.GetParentEndpoint(),
NetworkAddressUsedAtPeer: tc.GetAddressUsedAtClient(),
})
}
}
segmentObject.Spans[i].Refs = srr
}
defer func() {
// recover the panic caused by close tracingSendCh
if err := recover(); err != nil {
r.logger.Errorf("reporter segment err %v", err)
}
}()
select {
case r.tracingSendCh <- segmentObject:
default:
r.logger.Errorf("reach max tracing send buffer")
}
}