static Object createKey(String id, boolean shared, @Nullable Endpoint endpoint) {
    if (!shared) return id;
    return new SharedKey(id, endpoint);
  }
Processing is taking a span and placing it at the most appropriate place in the trace tree.
For example, if this is a {@link Span.Kind#SERVER} span, it would be a different node, and a
child of its {@link Span.Kind#CLIENT} even if they share the same span ID.

<p>Processing is defensive of typical problems in span reporting, such as depth-first. For
example, depth-first reporting implies you can see spans missing their parent. Hence, the
result of processing all spans can be a virtual root node.
zipkin/src/main/java/zipkin2/internal/SpanNode.java