opentelemetry-java/integration_tests/src/test/java/io/opentelemetry/JaegerExporterIntegrationTe...

112 lines
4.0 KiB
Java

/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.Network;
import org.testcontainers.containers.wait.strategy.HttpWaitStrategy;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;
import org.testcontainers.utility.MountableFile;
/**
* Integration test to verify that OpenTelemetry artefacts run in JRE 7.
*
* <p>An executable JAR with dependencies containing {@link SendTraceToJaeger} is built prior to
* executing the tests.
*
* <p>A Jaeger-all-in-one container is started, then an Alpine JRE 7 container is started with the
* executable JAR added to it and executed which will send a trace to the Jaeger instance. The test
* verifies that the trace is received by Jaeger.
*/
@Testcontainers
class JaegerExporterIntegrationTest {
private static final ObjectMapper objectMapper = new ObjectMapper();
private static final OkHttpClient client = new OkHttpClient();
private static final String ARCHIVE_NAME = System.getProperty("archive.name");
private static final String APP_NAME = "SendTraceToJaeger.jar";
private static final int QUERY_PORT = 16686;
private static final int COLLECTOR_PORT = 14250;
private static final String JAEGER_VERSION = "1.17";
private static final String SERVICE_NAME = "integration test";
private static final String JAEGER_HOSTNAME = "jaeger";
private static final String JAEGER_URL = "http://localhost";
private static final Network network = Network.SHARED;
@SuppressWarnings("rawtypes")
@Container
public static GenericContainer jaegerContainer =
new GenericContainer<>(
DockerImageName.parse("jaegertracing/all-in-one:" + JAEGER_VERSION + ":latest"))
.withNetwork(network)
.withNetworkAliases(JAEGER_HOSTNAME)
.withExposedPorts(COLLECTOR_PORT, QUERY_PORT)
.waitingFor(new HttpWaitStrategy().forPath("/"));
@SuppressWarnings("rawtypes")
@Container
public static GenericContainer jaegerExampleAppContainer =
new GenericContainer(DockerImageName.parse("adoptopenjdk/openjdk8:latest"))
.withNetwork(network)
.withCopyFileToContainer(MountableFile.forHostPath(ARCHIVE_NAME), "/app/" + APP_NAME)
.withCommand(
"java",
"-cp",
"/app/" + APP_NAME,
"io.opentelemetry.SendTraceToJaeger",
JAEGER_HOSTNAME,
Integer.toString(COLLECTOR_PORT))
.waitingFor(Wait.forLogMessage(".*Bye.*", 1))
.dependsOn(jaegerContainer);
@Test
void testJaegerExampleAppIntegration() {
Awaitility.await()
.atMost(30, TimeUnit.SECONDS)
.until(JaegerExporterIntegrationTest::assertJaegerHaveTrace);
}
private static Boolean assertJaegerHaveTrace() {
try {
String url =
String.format(
"%s/api/traces?service=%s",
String.format(JAEGER_URL + ":%d", jaegerContainer.getMappedPort(QUERY_PORT)),
SERVICE_NAME);
Request request =
new Request.Builder()
.url(url)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.build();
final JsonNode json;
try (Response response = client.newCall(request).execute()) {
json = objectMapper.readTree(response.body().byteStream());
}
return json.get("data").get(0).get("traceID") != null;
} catch (Exception e) {
return false;
}
}
}