Browse Source

Add prometheus smoke test (#5417)

Lauri Tulmin 3 years ago
parent
commit
245ac1f7d2

+ 56 - 0
smoke-tests/src/test/groovy/io/opentelemetry/smoketest/PrometheusSmokeTest.groovy

@@ -0,0 +1,56 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.smoketest
+
+import io.opentelemetry.testing.internal.armeria.client.WebClient
+import java.time.Duration
+import spock.lang.IgnoreIf
+
+import static io.opentelemetry.smoketest.TestContainerManager.useWindowsContainers
+
+@IgnoreIf({ useWindowsContainers() })
+class PrometheusSmokeTest extends SmokeTest {
+  private static final int PROMETHEUS_PORT = 9090
+
+  protected String getTargetImage(String jdk) {
+    "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-spring-boot:jdk$jdk-20211213.1570880324"
+  }
+
+  @Override
+  protected Map<String, String> getExtraEnv() {
+    return Map.of("OTEL_METRICS_EXPORTER", "prometheus", "OTEL_EXPORTER_PROMETHEUS_PORT", PROMETHEUS_PORT.toString())
+  }
+
+  @Override
+  protected TargetWaitStrategy getWaitStrategy() {
+    return new TargetWaitStrategy.Log(Duration.ofMinutes(1), ".*Started SpringbootApplication in.*")
+  }
+
+  protected List<ResourceMapping> getExtraPorts() {
+    return [PROMETHEUS_PORT]
+  }
+
+  def "Should export metrics"(int jdk) {
+    setup:
+    startTarget(jdk)
+
+    when:
+    client().get("/greeting").aggregate().join()
+
+    then:
+    def prometheusClient = WebClient.of("h1c://localhost:${containerManager.getTargetMappedPort(9090)}")
+    def prometheusData = prometheusClient.get("/").aggregate().join().contentUtf8()
+
+    prometheusData.contains("runtime_jvm_memory_pool")
+
+    cleanup:
+    stopTarget()
+
+    where:
+    jdk << [8, 11, 17]
+  }
+
+}

+ 9 - 1
smoke-tests/src/test/groovy/io/opentelemetry/smoketest/SmokeTest.groovy

@@ -58,6 +58,14 @@ abstract class SmokeTest extends Specification {
     return []
   }
 
+  /**
+   * Subclasses can override this method to provide additional ports that should be exposed from the
+   * target container
+   */
+  protected List<ResourceMapping> getExtraPorts() {
+    return []
+  }
+
   def setupSpec() {
     containerManager.startEnvironmentOnce()
     telemetryRetriever = new TelemetryRetriever(containerManager.getBackendMappedPort())
@@ -69,7 +77,7 @@ abstract class SmokeTest extends Specification {
 
   def startTarget(String jdk, String serverVersion, boolean windows) {
     def targetImage = getTargetImage(jdk, serverVersion, windows)
-    return containerManager.startTarget(targetImage, agentPath, jvmArgsEnvVarName, extraEnv, extraResources, getWaitStrategy(), getCommand())
+    return containerManager.startTarget(targetImage, agentPath, jvmArgsEnvVarName, extraEnv, extraResources, extraPorts, getWaitStrategy(), getCommand())
   }
 
   protected abstract String getTargetImage(String jdk)

+ 8 - 1
smoke-tests/src/test/java/io/opentelemetry/smoketest/LinuxTestContainerManager.java

@@ -6,6 +6,7 @@
 package io.opentelemetry.smoketest;
 
 import java.time.Duration;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Consumer;
@@ -69,14 +70,20 @@ public class LinuxTestContainerManager extends AbstractTestContainerManager {
       String jvmArgsEnvVarName,
       Map<String, String> extraEnv,
       List<ResourceMapping> extraResources,
+      List<Integer> extraPorts,
       TargetWaitStrategy waitStrategy,
       String[] command) {
 
     Consumer<OutputFrame> output = new ToStringConsumer();
+    List<Integer> ports = new ArrayList<>();
+    ports.add(TARGET_PORT);
+    if (extraPorts != null) {
+      ports.addAll(extraPorts);
+    }
     target =
         new GenericContainer<>(DockerImageName.parse(targetImageName))
             .withStartupTimeout(Duration.ofMinutes(5))
-            .withExposedPorts(TARGET_PORT)
+            .withExposedPorts(ports.toArray(new Integer[0]))
             .withNetwork(network)
             .withLogConsumer(output)
             .withLogConsumer(new Slf4jLogConsumer(appLogger))

+ 1 - 0
smoke-tests/src/test/java/io/opentelemetry/smoketest/TestContainerManager.java

@@ -24,6 +24,7 @@ public interface TestContainerManager {
       String jvmArgsEnvVarName,
       Map<String, String> extraEnv,
       List<ResourceMapping> extraResources,
+      List<Integer> extraPorts,
       TargetWaitStrategy waitStrategy,
       String[] command);
 

+ 5 - 2
smoke-tests/src/test/java/io/opentelemetry/smoketest/windows/WindowsTestContainerManager.java

@@ -76,8 +76,6 @@ public class WindowsTestContainerManager extends AbstractTestContainerManager {
             .exec()
             .getId();
 
-    String backendSuffix = "-windows-20210611.927888723";
-
     String backendImageName =
         "ghcr.io/open-telemetry/opentelemetry-java-instrumentation/smoke-test-fake-backend-windows:20210918.1248928123";
     if (!imageExists(backendImageName)) {
@@ -134,8 +132,13 @@ public class WindowsTestContainerManager extends AbstractTestContainerManager {
       String jvmArgsEnvVarName,
       Map<String, String> extraEnv,
       List<ResourceMapping> extraResources,
+      List<Integer> extraPorts,
       TargetWaitStrategy waitStrategy,
       String[] cmd) {
+    if (extraPorts != null && !extraPorts.isEmpty()) {
+      throw new UnsupportedOperationException("extra ports not supported");
+    }
+
     stopTarget();
 
     if (!imageExists(targetImageName)) {