@Test
  protected void spanKindIsNotRequiredWhenEndpointsArePresent(TestInfo testInfo) throws Exception {
    String testSuffix = testSuffix(testInfo);
    String traceId = newTraceId();

    Endpoint kafka = suffixServiceName(TestObjects.KAFKA, testSuffix);
    Endpoint frontend = suffixServiceName(TestObjects.FRONTEND, testSuffix);
    Endpoint backend = suffixServiceName(TestObjects.BACKEND, testSuffix);
    Endpoint db = suffixServiceName(TestObjects.DB, testSuffix);

    List<Span> trace = List.of(
      Span.newBuilder().traceId(traceId).id("20").name("get")
        .timestamp(TODAY * 1000L).duration(350L * 1000L)
        .localEndpoint(kafka)
        .remoteEndpoint(frontend).build(),
      Span.newBuilder().traceId(traceId).parentId("20").id("21").name("get")
        .timestamp((TODAY + 50) * 1000L).duration(250L * 1000L)
        .localEndpoint(frontend)
        .remoteEndpoint(backend).build(),
      Span.newBuilder().traceId(traceId).parentId("21").id("22").name("get")
        .timestamp((TODAY + 150) * 1000L).duration(50L * 1000L)
        .localEndpoint(backend)
        .remoteEndpoint(db).build()
    );

    processDependencies(trace);

    assertThat(store().getDependencies(TODAY + 1000, 1000L).execute()).containsOnly(
      DependencyLink.newBuilder()
        .parent(kafka.serviceName())
        .child(frontend.serviceName())
        .callCount(1)
        .build(),
      DependencyLink.newBuilder()
        .parent(frontend.serviceName())
        .child(backend.serviceName())
        .callCount(1)
        .build(),
      DependencyLink.newBuilder()
        .parent(backend.serviceName())
        .child(db.serviceName())
        .callCount(1)
        .build()
    );
  }
This test shows that dependency links can be filtered at daily granularity. This allows the UI
to look for dependency intervals besides TODAY.
zipkin-tests/src/main/java/zipkin2/storage/ITDependencies.java