77 "encoding/hex"
88 "encoding/json"
99 "errors"
10+ "strings"
1011
1112 "go.opentelemetry.io/collector/pdata/pcommon"
1213 "go.opentelemetry.io/collector/pdata/ptrace"
@@ -65,7 +66,10 @@ func ToTraces(rawSeg []byte, recorder telemetry.Recorder) (ptrace.Traces, int, e
6566 // TraceID of the root segment in because embedded subsegments
6667 // do not have that information, but it's needed after we flatten
6768 // the embedded subsegment to generate independent child spans.
68- _ , err = segToSpans (seg , seg .TraceID , nil , spans )
69+ // Sometimes, subsegments are sent separately in an async workflow,
70+ // check segment type to determine the proper span kind.
71+ isSubsegment := seg .ParentID != nil && seg .Type != nil && strings .EqualFold (* seg .Type , "subsegment" )
72+ _ , err = segToSpans (seg , seg .TraceID , nil , isSubsegment , spans )
6973 if err != nil {
7074 recorder .RecordSegmentsRejected (count )
7175 return ptrace.Traces {}, count , err
@@ -74,18 +78,18 @@ func ToTraces(rawSeg []byte, recorder telemetry.Recorder) (ptrace.Traces, int, e
7478 return traceData , count , nil
7579}
7680
77- func segToSpans (seg awsxray.Segment , traceID , parentID * string , spans ptrace.SpanSlice ) (ptrace.Span , error ) {
81+ func segToSpans (seg awsxray.Segment , traceID , parentID * string , isSubsegment bool , spans ptrace.SpanSlice ) (ptrace.Span , error ) {
7882 span := spans .AppendEmpty ()
7983
80- err := populateSpan (& seg , traceID , parentID , span )
84+ err := populateSpan (& seg , traceID , parentID , isSubsegment , span )
8185 if err != nil {
8286 return ptrace.Span {}, err
8387 }
8488
8589 var populatedChildSpan ptrace.Span
8690 for _ , s := range seg .Subsegments {
8791 populatedChildSpan , err = segToSpans (s ,
88- traceID , seg .ID ,
92+ traceID , seg .ID , true
8993 spans )
9094 if err != nil {
9195 return ptrace.Span {}, err
@@ -109,7 +113,7 @@ func segToSpans(seg awsxray.Segment, traceID, parentID *string, spans ptrace.Spa
109113 return span , nil
110114}
111115
112- func populateSpan (seg * awsxray.Segment , traceID , parentID * string , span ptrace.Span ) error {
116+ func populateSpan (seg * awsxray.Segment , traceID , parentID * string , isSubsegment bool , span ptrace.Span ) error {
113117 attrs := span .Attributes ()
114118 attrs .Clear ()
115119 attrs .EnsureCapacity (initAttrCapacity )
@@ -156,11 +160,11 @@ func populateSpan(seg *awsxray.Segment, traceID, parentID *string, span ptrace.S
156160
157161 span .SetTraceID (traceIDBytes )
158162 span .SetSpanID (spanIDBytes )
159-
163+ if ! isSubsegment {
164+ span .SetKind (ptrace .SpanKindServer )
165+ }
160166 if parentIDBytes != [8 ]byte {} {
161167 span .SetParentSpanID (parentIDBytes )
162- } else {
163- span .SetKind (ptrace .SpanKindServer )
164168 }
165169
166170 addStartTime (seg .StartTime , span )
0 commit comments