in geronimo-opentracing-common/src/main/java/org/apache/geronimo/microprofile/opentracing/common/impl/GeronimoTracer.java [106:154]
public <C> SpanContext extract(final Format<C> format, final C carrier) {
if (JaxRsHeaderTextMap.class.isInstance(carrier)) {
final MultivaluedMap<String, ?> map = JaxRsHeaderTextMap.class.cast(carrier).getMap();
final String traceid = (String) map.getFirst(traceIdHeader);
final String spanid = (String) map.getFirst(spanIdHeader);
final String parentspanid = (String) map.getFirst(parentSpanIdHeader);
if (traceid != null && spanid != null) {
return newContext(traceid, parentspanid, spanid, map.keySet().stream().filter(it -> it.startsWith(baggageHeaderPrefix))
.collect(toMap(identity(), k -> String.valueOf(map.getFirst(k)))));
}
return null;
}
if (ServletHeaderTextMap.class.isInstance(carrier)) {
final HttpServletRequest req = ServletHeaderTextMap.class.cast(carrier).getRequest();
final String traceid = req.getHeader(traceIdHeader);
final String spanid = req.getHeader(spanIdHeader);
final String parentspanid = req.getHeader(parentSpanIdHeader);
if (traceid != null && spanid != null) {
return newContext(traceid, parentspanid, spanid, list(req.getHeaderNames()).stream()
.filter(it -> it.startsWith(baggageHeaderPrefix))
.collect(toMap(identity(), k -> String.valueOf(req.getHeader(k)))));
}
return null;
}
if (!TextMap.class.isInstance(carrier)) {
throw new IllegalArgumentException("Only TextMap are supported");
}
final Iterator<Map.Entry<String, String>> textMap = TextMap.class.cast(carrier).iterator();
String traceId = null;
String spanId = null;
String parentSpanId = null;
final Map<String, String> baggages = new HashMap<>();
while (textMap.hasNext()) {
final Map.Entry<String, String> next = textMap.next();
if (next.getKey().startsWith(baggageHeaderPrefix)) {
baggages.put(next.getKey(), next.getValue());
} else if (spanIdHeader.equals(next.getKey())) {
spanId = next.getValue();
} else if (traceIdHeader.equals(next.getKey())) {
traceId = next.getValue();
} else if (parentSpanIdHeader.equals(next.getKey())) {
parentSpanId = next.getValue();
}
}
if (traceId != null && spanId != null) {
return newContext(traceId, parentSpanId, spanId, baggages);
}
return null;
}