Search in sources :

Example 1 with Wait

use of org.testcontainers.containers.wait.strategy.Wait in project zipkin by openzipkin.

the class CassandraStorageExtension method poolInFlight.

// Use metrics to wait for in-flight requests to settle per
// https://groups.google.com/a/lists.datastax.com/g/java-driver-user/c/5um_yGNynow/m/cInH5I5jBgAJ
static boolean poolInFlight(CqlSession session) {
    Collection<Node> nodes = session.getMetadata().getNodes().values();
    Optional<Metrics> metrics = session.getMetrics();
    for (Node node : nodes) {
        int inFlight = metrics.flatMap(m -> m.getNodeMetric(node, DefaultNodeMetric.IN_FLIGHT)).map(m -> ((Gauge<Integer>) m).getValue()).orElse(0);
        if (inFlight > 0)
            return true;
    }
    return false;
}
Also used : Node(com.datastax.oss.driver.api.core.metadata.Node) Metrics(com.datastax.oss.driver.api.core.metrics.Metrics) DefaultNodeMetric(com.datastax.oss.driver.api.core.metrics.DefaultNodeMetric) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) LoggerFactory(org.slf4j.LoggerFactory) ExtensionContext(org.junit.jupiter.api.extension.ExtensionContext) ArrayList(java.util.ArrayList) Slf4jLogConsumer(org.testcontainers.containers.output.Slf4jLogConsumer) CqlSession(com.datastax.oss.driver.api.core.CqlSession) Assumptions.assumeTrue(org.junit.jupiter.api.Assumptions.assumeTrue) SEARCH_TABLES(zipkin2.storage.cassandra.ITCassandraStorage.SEARCH_TABLES) TABLE_SPAN(zipkin2.storage.cassandra.Schema.TABLE_SPAN) GenericContainer(org.testcontainers.containers.GenericContainer) InvalidQueryException(com.datastax.oss.driver.api.core.servererrors.InvalidQueryException) Call.propagateIfFatal(zipkin2.Call.propagateIfFatal) DockerImageName.parse(org.testcontainers.utility.DockerImageName.parse) Wait(org.testcontainers.containers.wait.strategy.Wait) TABLE_DEPENDENCY(zipkin2.storage.cassandra.Schema.TABLE_DEPENDENCY) Logger(org.slf4j.Logger) Collection(java.util.Collection) TestAbortedException(org.opentest4j.TestAbortedException) List(java.util.List) BeforeAllCallback(org.junit.jupiter.api.extension.BeforeAllCallback) AfterAllCallback(org.junit.jupiter.api.extension.AfterAllCallback) Optional(java.util.Optional) Gauge(com.codahale.metrics.Gauge) Metrics(com.datastax.oss.driver.api.core.metrics.Metrics) Node(com.datastax.oss.driver.api.core.metadata.Node) Gauge(com.codahale.metrics.Gauge)

Example 2 with Wait

use of org.testcontainers.containers.wait.strategy.Wait in project zipkin by openzipkin.

the class ServerIntegratedBenchmark method runBenchmark.

void runBenchmark(@Nullable GenericContainer<?> storage, GenericContainer<?> zipkin) throws Exception {
    GenericContainer<?> backend = new GenericContainer<>(parse("ghcr.io/openzipkin/brave-example:armeria")).withNetwork(Network.SHARED).withNetworkAliases("backend").withCommand("backend").withExposedPorts(9000).waitingFor(Wait.forHealthcheck());
    GenericContainer<?> frontend = new GenericContainer<>(parse("ghcr.io/openzipkin/brave-example:armeria")).withNetwork(Network.SHARED).withNetworkAliases("frontend").withCommand("frontend").withExposedPorts(8081).waitingFor(Wait.forHealthcheck());
    containers.add(frontend);
    // Use a quay.io mirror to prevent build outages due to Docker Hub pull quotas
    // Use same version as in docker/examples/docker-compose-prometheus.yml
    GenericContainer<?> prometheus = new GenericContainer<>(parse("quay.io/prometheus/prometheus:v2.23.0")).withNetwork(Network.SHARED).withNetworkAliases("prometheus").withExposedPorts(9090).withCopyFileToContainer(MountableFile.forClasspathResource("prometheus.yml"), "/etc/prometheus/prometheus.yml");
    containers.add(prometheus);
    // Use a quay.io mirror to prevent build outages due to Docker Hub pull quotas
    // Use same version as in docker/examples/docker-compose-prometheus.yml
    GenericContainer<?> grafana = new GenericContainer<>(parse("quay.io/app-sre/grafana:7.3.4")).withNetwork(Network.SHARED).withNetworkAliases("grafana").withExposedPorts(3000).withEnv("GF_AUTH_ANONYMOUS_ENABLED", "true").withEnv("GF_AUTH_ANONYMOUS_ORG_ROLE", "Admin");
    containers.add(grafana);
    // This is an arbitrary small image that has curl installed
    // Use a quay.io mirror to prevent build outages due to Docker Hub pull quotas
    // Use same version as in docker/examples/docker-compose-prometheus.yml
    GenericContainer<?> grafanaDashboards = new GenericContainer<>(parse("quay.io/rackspace/curl:7.70.0")).withNetwork(Network.SHARED).withWorkingDirectory("/tmp").withLogConsumer(new Slf4jLogConsumer(LOG)).withCreateContainerCmdModifier(it -> it.withEntrypoint("/tmp/create.sh")).withCopyFileToContainer(MountableFile.forClasspathResource("create-datasource-and-dashboard.sh", 555), "/tmp/create.sh");
    containers.add(grafanaDashboards);
    // Use a quay.io mirror to prevent build outages due to Docker Hub pull quotas
    GenericContainer<?> wrk = new GenericContainer<>(parse("quay.io/dim/wrk:stable")).withNetwork(Network.SHARED).withCreateContainerCmdModifier(it -> it.withEntrypoint("wrk")).withCommand("-t4 -c128 -d100s http://frontend:8081 --latency");
    containers.add(wrk);
    grafanaDashboards.dependsOn(grafana);
    wrk.dependsOn(frontend, backend, prometheus, grafanaDashboards, zipkin);
    if (storage != null)
        wrk.dependsOn(storage);
    Startables.deepStart(Stream.of(wrk)).join();
    System.out.println("Benchmark started.");
    if (zipkin != null)
        printContainerMapping(zipkin);
    if (storage != null)
        printContainerMapping(storage);
    printContainerMapping(backend);
    printContainerMapping(frontend);
    printContainerMapping(prometheus);
    printContainerMapping(grafana);
    while (wrk.isRunning()) {
        Thread.sleep(1000);
    }
    // Wait for prometheus to do a final scrape.
    Thread.sleep(5000);
    System.out.println("Benchmark complete, wrk output:");
    System.out.println(wrk.getLogs().replace("\n\n", "\n"));
    WebClient prometheusClient = WebClient.of("h1c://" + prometheus.getContainerIpAddress() + ":" + prometheus.getFirstMappedPort());
    System.out.println(String.format("Messages received: %s", prometheusValue(prometheusClient, "sum(zipkin_collector_messages_total)")));
    System.out.println(String.format("Spans received: %s", prometheusValue(prometheusClient, "sum(zipkin_collector_spans_total)")));
    System.out.println(String.format("Spans dropped: %s", prometheusValue(prometheusClient, "sum(zipkin_collector_spans_dropped_total)")));
    System.out.println("Memory quantiles:");
    printQuartiles(prometheusClient, "jvm_memory_used_bytes{area=\"heap\"}");
    printQuartiles(prometheusClient, "jvm_memory_used_bytes{area=\"nonheap\"}");
    System.out.println(String.format("Total GC time (s): %s", prometheusValue(prometheusClient, "sum(jvm_gc_pause_seconds_sum)")));
    System.out.println(String.format("Number of GCs: %s", prometheusValue(prometheusClient, "sum(jvm_gc_pause_seconds_count)")));
    System.out.println("POST Spans latency (s)");
    printHistogram(prometheusClient, "http_server_requests_seconds_bucket{" + "method=\"POST\",status=\"202\",uri=\"/api/v2/spans\"}");
    if (WAIT_AFTER_BENCHMARK) {
        System.out.println("Keeping containers running until explicit termination. " + "Feel free to poke around in grafana.");
        Thread.sleep(Long.MAX_VALUE);
    }
}
Also used : BeforeEach(org.junit.jupiter.api.BeforeEach) Arrays(java.util.Arrays) LoggerFactory(org.slf4j.LoggerFactory) SimpleImmutableEntry(java.util.AbstractMap.SimpleImmutableEntry) Disabled(org.junit.jupiter.api.Disabled) Network(org.testcontainers.containers.Network) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) Slf4jLogConsumer(org.testcontainers.containers.output.Slf4jLogConsumer) WebClient(com.linecorp.armeria.client.WebClient) Map(java.util.Map) GenericContainer(org.testcontainers.containers.GenericContainer) Path(java.nio.file.Path) Nullable(javax.annotation.Nullable) DockerImageName.parse(org.testcontainers.utility.DockerImageName.parse) Wait(org.testcontainers.containers.wait.strategy.Wait) QueryStringEncoder(io.netty.handler.codec.http.QueryStringEncoder) Logger(org.slf4j.Logger) Files(java.nio.file.Files) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Startables(org.testcontainers.lifecycle.Startables) Collectors(java.util.stream.Collectors) File(java.io.File) Test(org.junit.jupiter.api.Test) List(java.util.List) AfterEach(org.junit.jupiter.api.AfterEach) Stream(java.util.stream.Stream) Paths(java.nio.file.Paths) MountableFile(org.testcontainers.utility.MountableFile) Slf4jLogConsumer(org.testcontainers.containers.output.Slf4jLogConsumer) GenericContainer(org.testcontainers.containers.GenericContainer) WebClient(com.linecorp.armeria.client.WebClient)

Aggregations

ArrayList (java.util.ArrayList)2 List (java.util.List)2 Logger (org.slf4j.Logger)2 LoggerFactory (org.slf4j.LoggerFactory)2 GenericContainer (org.testcontainers.containers.GenericContainer)2 Slf4jLogConsumer (org.testcontainers.containers.output.Slf4jLogConsumer)2 Wait (org.testcontainers.containers.wait.strategy.Wait)2 DockerImageName.parse (org.testcontainers.utility.DockerImageName.parse)2 Gauge (com.codahale.metrics.Gauge)1 CqlSession (com.datastax.oss.driver.api.core.CqlSession)1 Node (com.datastax.oss.driver.api.core.metadata.Node)1 DefaultNodeMetric (com.datastax.oss.driver.api.core.metrics.DefaultNodeMetric)1 Metrics (com.datastax.oss.driver.api.core.metrics.Metrics)1 InvalidQueryException (com.datastax.oss.driver.api.core.servererrors.InvalidQueryException)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 WebClient (com.linecorp.armeria.client.WebClient)1 QueryStringEncoder (io.netty.handler.codec.http.QueryStringEncoder)1 File (java.io.File)1 Files (java.nio.file.Files)1 Path (java.nio.file.Path)1