in propagators/gcp/src/main/java/com/google/cloud/opentelemetry/propagators/XCloudTraceContextPropagator.java [85:130]
public <C> Context extract(Context context, C carrier, TextMapGetter<C> getter) {
if (context == null || getter == null) {
return context;
}
// Ignore the scenario where another propagator already filled out a field.
if (Span.fromContext(context).getSpanContext().isRemote()) {
return context;
}
String value = getter.get(carrier, FIELD);
if (value == null) {
return context;
}
Matcher matcher = VALUE_PATTERN.matcher(value);
if (!matcher.matches()) {
LOGGER.fine(() -> "Found x-cloud-trace-context header with invalid format: " + value);
return context;
}
String traceId = matcher.group("traceid");
if (!TraceId.isValid(traceId)) {
LOGGER.warning(
() ->
"Found x-cloud-trace-context header with invalid trace: "
+ traceId
+ ", header: "
+ value);
return context;
}
String spanId = SpanId.fromLong(java.lang.Long.parseUnsignedLong(matcher.group("spanid")));
if (!SpanId.isValid(spanId)) {
LOGGER.warning(
() ->
"Found x-cloud-trace-context header with invalid span: "
+ spanId
+ ", header: "
+ value);
return context;
}
boolean sampled = "1".equals(matcher.group("sampled"));
SpanContext parent =
SpanContext.createFromRemoteParent(
traceId,
spanId,
sampled ? TraceFlags.getSampled() : TraceFlags.getDefault(),
TraceState.getDefault());
return context.with(Span.wrap(parent));
}