@Test @Order(1) void registersInEureka() throws IOException {
    // The zipkin server may start before Eureka processes the registration
    await().untilAsserted( // wait for registration
      () -> {
        try (Response response = getEurekaZipkinApp()) {
          assertThat(response.code()).isEqualTo(200);
        }
      });

    String json = getEurekaZipkinAppAsString();

    // Make sure the health status is OK
    assertThat(readString(json, "$.application.instance[0].status"))
      .isEqualTo("UP");

    int zipkinPort = zipkin.activePort().localAddress().getPort();

    // Note: Netflix/Eureka says use hostname, which can conflict on laptops.
    // Armeria adopts the spring-cloud-netflix convention shown here.
    assertThat(readString(json, "$.application.instance[0].instanceId"))
      .isEqualTo("localhost:zipkin:" + zipkinPort);

    // Make sure the vip address does not include the port!
    assertThat(readString(json, "$.application.instance[0].vipAddress"))
      .isEqualTo("localhost");

    // Make sure URLs are fully resolved. Notably, the status page URL defaults to the /info
    // endpoint, as that's the one chosen in spring-cloud-netflix.
    assertThat(readString(json, "$.application.instance[0].homePageUrl"))
      .isEqualTo("http://localhost:" + zipkinPort + "/zipkin");
    assertThat(readString(json, "$.application.instance[0].statusPageUrl"))
      .isEqualTo("http://localhost:" + zipkinPort + "/info");
    assertThat(readString(json, "$.application.instance[0].healthCheckUrl"))
      .isEqualTo("http://localhost:" + zipkinPort + "/health");
  }
Path under the Eureka v2 endpoint for the app named "zipkin".
Note that Eureka always coerces app names to uppercase.
zipkin-server/src/test/java/zipkin2/server/internal/eureka/BaseITZipkinEureka.java