extract method
Implementation
@override
api.Context extract(
api.Context context, dynamic carrier, api.TextMapGetter getter) {
final traceParentHeader = getter.get(carrier, _traceParentHeaderKey);
if (traceParentHeader == null) {
// Carrier did not contain a trace header. Do nothing.
return context;
}
final parentHeaderMatch =
traceParentHeaderRegEx.firstMatch(traceParentHeader);
if (parentHeaderMatch == null) {
// Encountered a malformed or unknown trace header. Do nothing.
return context;
}
final parentHeaderFields = Map<String, String>.fromIterable(
parentHeaderMatch.groupNames,
key: (element) => element.toString(),
value: (element) => parentHeaderMatch.namedGroup(element)!);
final traceIdHeader = parentHeaderFields[_traceIdFieldKey];
final traceId = (traceIdHeader != null)
? api.TraceId.fromString(traceIdHeader)
: api.TraceId.invalid();
final parentIdHeader = parentHeaderFields[_parentIdFieldKey];
final parentId = (parentIdHeader != null)
? api.SpanId.fromString(parentIdHeader)
: api.SpanId.invalid();
final traceFlagsHeader = parentHeaderFields[_traceFlagsFieldKey];
final traceFlags = (traceFlagsHeader != null)
? int.parse(traceFlagsHeader, radix: 16)
: api.TraceFlags.none;
final traceStateHeader = getter.get(carrier, _traceStateHeaderKey);
final traceState = (traceStateHeader != null)
? api.TraceState.fromString(traceStateHeader)
: api.TraceState.empty();
return api.contextWithSpan(
context,
NonRecordingSpan(
api.SpanContext.remote(traceId, parentId, traceFlags, traceState)));
}