@Override public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof Span)) return false;
    Span that = (Span) o;
    return traceId.equals(that.traceId)
      && Objects.equals(parentId, that.parentId)
      && id.equals(that.id)
      && Objects.equals(kind, that.kind)
      && Objects.equals(name, that.name)
      && timestamp == that.timestamp
      && duration == that.duration
      && Objects.equals(localEndpoint, that.localEndpoint)
      && Objects.equals(remoteEndpoint, that.remoteEndpoint)
      && annotations.equals(that.annotations)
      && tags.equals(that.tags)
      && flags == that.flags;
  }
Inspired by {@code okio.Buffer.writeLong}
zipkin/src/main/java/zipkin2/Span.java