public Context extract()

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));
  }