86 lines
3.0 KiB
Java
86 lines
3.0 KiB
Java
/*
|
|
* Copyright The OpenTelemetry Authors
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
package io.opentelemetry.containers;
|
|
|
|
import java.nio.file.Path;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
import java.util.Optional;
|
|
|
|
import io.opentelemetry.agents.Agent;
|
|
import io.opentelemetry.agents.AgentResolver;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.testcontainers.containers.GenericContainer;
|
|
import org.testcontainers.containers.Network;
|
|
import org.testcontainers.containers.output.Slf4jLogConsumer;
|
|
import org.testcontainers.containers.wait.strategy.Wait;
|
|
import org.testcontainers.lifecycle.Startable;
|
|
import org.testcontainers.utility.DockerImageName;
|
|
import org.testcontainers.utility.MountableFile;
|
|
|
|
public class PetClinicRestContainer {
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(PetClinicRestContainer.class);
|
|
private static final int PETCLINIC_PORT = 9966;
|
|
private final AgentResolver agentResolver = new AgentResolver();
|
|
|
|
private final Network network;
|
|
private final Startable collector;
|
|
private final Agent agent;
|
|
|
|
public PetClinicRestContainer(Network network, Startable collector, Agent agent) {
|
|
this.network = network;
|
|
this.collector = collector;
|
|
this.agent = agent;
|
|
}
|
|
|
|
public GenericContainer<?> build() throws Exception {
|
|
|
|
Optional<Path> agentJar = agentResolver.resolve(this.agent);
|
|
|
|
GenericContainer<?> container = new GenericContainer<>(
|
|
DockerImageName.parse("ghcr.io/open-telemetry/opentelemetry-java-instrumentation/petclinic-rest-base:latest"))
|
|
.withNetwork(network)
|
|
.withNetworkAliases("petclinic")
|
|
.withLogConsumer(new Slf4jLogConsumer(logger))
|
|
.withExposedPorts(PETCLINIC_PORT)
|
|
.withFileSystemBind(".", "/results")
|
|
.waitingFor(Wait.forHttp("/petclinic/actuator/health").forPort(PETCLINIC_PORT))
|
|
.dependsOn(collector)
|
|
.withCommand(buildCommandline(agentJar));
|
|
|
|
agentJar.ifPresent(
|
|
agentPath -> container.withCopyFileToContainer(
|
|
MountableFile.forHostPath(agentPath),
|
|
"/app/" + agentPath.getFileName().toString())
|
|
);
|
|
return container;
|
|
}
|
|
|
|
@NotNull
|
|
private String[] buildCommandline(Optional<Path> agentJar) {
|
|
String jfrFile = "petclinic-" + this.agent.getName() + ".jfr";
|
|
List<String> result = new ArrayList<>(Arrays.asList(
|
|
"java",
|
|
"-XX:StartFlightRecording:dumponexit=true,disk=true,settings=profile,name=petclinic,filename=/results/"
|
|
+ jfrFile,
|
|
"-Dotel.traces.exporter=otlp",
|
|
"-Dotel.imr.export.interval=5000",
|
|
"-Dotel.exporter.otlp.insecure=true",
|
|
"-Dotel.exporter.otlp.endpoint=http://collector:4317",
|
|
"-Dotel.resource.attributes=service.name=petclinic-otel-overhead"
|
|
));
|
|
result.addAll(this.agent.getAdditionalJvmArgs());
|
|
agentJar.ifPresent(path -> result.add("-javaagent:/app/" + path.getFileName()));
|
|
|
|
result.add("-jar");
|
|
result.add("/app/spring-petclinic-rest.jar");
|
|
return result.toArray(new String[] {});
|
|
}
|
|
}
|