in golang/pkg/utils/utils.go [206:235]
func FromTraceParentHeader(header string) (*trace.SpanContext, bool) {
if len(header) != 55 || header[0] != '0' ||
header[1] != '0' ||
header[2] != '-' ||
header[35] != '-' ||
header[52] != '-' {
return nil, false
}
trace_id_str := header[3 : 3+32]
span_id_str := header[36 : 36+16]
options_str := header[53 : 53+2]
trace_id, err := hex.DecodeString(trace_id_str)
if err != nil || len(trace_id) != 16 {
return nil, false
}
span_id, err := hex.DecodeString(span_id_str)
if err != nil || len(span_id) != 8 {
return nil, false
}
options, err := hex.DecodeString(options_str)
if err != nil || len(options) != 1 {
return nil, false
}
sc := trace.SpanContext{
TraceOptions: trace.TraceOptions(options[0]),
}
copy(sc.TraceID[:], trace_id[:])
copy(sc.SpanID[:], span_id[:])
return &sc, true
}