@Test void dataMissingEndpointGoesOnFirstSpan() {
    V1Span v1 =
        V1Span.newBuilder()
            .traceId(1)
            .id(2)
            .name("missing")
            .addAnnotation(1472470996199000L, "foo", FRONTEND)
            .addAnnotation(1472470996238000L, "bar", FRONTEND)
            .addAnnotation(1472470996250000L, "baz", BACKEND)
            .addAnnotation(1472470996350000L, "qux", BACKEND)
            .addAnnotation(1472470996403000L, "missing", null)
            .addBinaryAnnotation("foo", "bar", FRONTEND)
            .addBinaryAnnotation("baz", "qux", BACKEND)
            .addBinaryAnnotation("missing", "", null)
            .build();

    Span.Builder newBuilder = Span.newBuilder().traceId("1").id("2").name("missing");

    Span first =
        newBuilder
            .clone()
            .localEndpoint(FRONTEND)
            .addAnnotation(1472470996199000L, "foo")
            .addAnnotation(1472470996238000L, "bar")
            .addAnnotation(1472470996403000L, "missing")
            .putTag("foo", "bar")
            .putTag("missing", "")
            .build();

    Span second =
        newBuilder
            .clone()
            .localEndpoint(BACKEND)
            .addAnnotation(1472470996250000L, "baz")
            .addAnnotation(1472470996350000L, "qux")
            .putTag("baz", "qux")
            .build();

    assertThat(v1SpanConverter.convert(v1)).containsExactly(first, second);
  }
shared v1 IDs for messaging spans isn't supported, but shouldn't break
zipkin/src/test/java/zipkin2/v1/SpanConverterTest.java