Browse Source

Migrate "runtime-metrics" test from groovy to java (#8928)

Co-authored-by: Jean Bisutti <jean.bisutti@gmail.com>
jason plumb 1 year ago
parent
commit
23acd5b4fd

+ 0 - 37
instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/groovy/JmxRuntimeMetricsTest.groovy

@@ -1,37 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
-import spock.util.concurrent.PollingConditions
-
-class JmxRuntimeMetricsTest extends AgentInstrumentationSpecification {
-
-  def "test runtime metrics is enabled"() {
-    when:
-    def conditions = new PollingConditions(timeout: 10, initialDelay: 1.5, factor: 1.25)
-    // Force a gc to ensure gc metrics
-    System.gc()
-
-    then:
-    conditions.eventually {
-      assert getMetrics().any { it.name == "process.runtime.jvm.classes.loaded" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.classes.unloaded" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.classes.current_loaded" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.system.cpu.load_1m" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.system.cpu.utilization" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.cpu.utilization" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.gc.duration" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.memory.init" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.memory.usage" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.memory.committed" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.memory.limit" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.memory.usage_after_last_gc" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.threads.count" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.buffer.limit" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.buffer.count" }
-      assert getMetrics().any { it.name == "process.runtime.jvm.buffer.usage" }
-    }
-  }
-}

+ 8 - 21
instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java17/JfrRuntimeMetricsTest.java

@@ -5,31 +5,17 @@
 
 package io.opentelemetry.instrumentation.javaagent.runtimemetrics.java17;
 
-import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
-import static org.awaitility.Awaitility.await;
-
-import io.opentelemetry.instrumentation.testing.AgentTestRunner;
-import io.opentelemetry.sdk.metrics.data.MetricData;
-import io.opentelemetry.sdk.testing.assertj.MetricAssert;
-import java.util.Collection;
-import java.util.function.Consumer;
+import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
+import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
 import org.junit.jupiter.api.Assumptions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 class JfrRuntimeMetricsTest {
-  @SafeVarargs
-  private static void waitAndAssertMetrics(Consumer<MetricAssert>... assertions) {
-    await()
-        .untilAsserted(
-            () -> {
-              Collection<MetricData> metrics = AgentTestRunner.instance().getExportedMetrics();
-              assertThat(metrics).isNotEmpty();
-              for (Consumer<MetricAssert> assertion : assertions) {
-                assertThat(metrics).anySatisfy(metric -> assertion.accept(assertThat(metric)));
-              }
-            });
-  }
+
+  @RegisterExtension
+  static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
 
   @BeforeAll
   static void setUp() {
@@ -45,7 +31,8 @@ class JfrRuntimeMetricsTest {
     // This should generate some events
     System.gc();
 
-    waitAndAssertMetrics(
+    testing.waitAndAssertMetrics(
+        "io.opentelemetry.runtime-telemetry-java17",
         metric -> metric.hasName("process.runtime.jvm.cpu.longlock"),
         metric -> metric.hasName("process.runtime.jvm.cpu.limit"),
         metric -> metric.hasName("process.runtime.jvm.cpu.context_switch"));

+ 42 - 0
instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java17/JmxRuntimeMetricsTest.java

@@ -0,0 +1,42 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.instrumentation.javaagent.runtimemetrics.java17;
+
+import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
+import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+class JmxRuntimeMetricsTest {
+
+  @RegisterExtension
+  static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
+
+  @Test
+  void runtimeMetricsAreEnabled() {
+    // Force a gc to "ensure" gc metrics
+    System.gc();
+
+    testing.waitAndAssertMetrics(
+        "io.opentelemetry.runtime-telemetry-java8",
+        metric -> metric.hasName("process.runtime.jvm.classes.loaded"),
+        metric -> metric.hasName("process.runtime.jvm.classes.unloaded"),
+        metric -> metric.hasName("process.runtime.jvm.classes.current_loaded"),
+        metric -> metric.hasName("process.runtime.jvm.system.cpu.load_1m"),
+        metric -> metric.hasName("process.runtime.jvm.system.cpu.utilization"),
+        metric -> metric.hasName("process.runtime.jvm.cpu.utilization"),
+        metric -> metric.hasName("process.runtime.jvm.gc.duration"),
+        metric -> metric.hasName("process.runtime.jvm.memory.init"),
+        metric -> metric.hasName("process.runtime.jvm.memory.usage"),
+        metric -> metric.hasName("process.runtime.jvm.memory.committed"),
+        metric -> metric.hasName("process.runtime.jvm.memory.limit"),
+        metric -> metric.hasName("process.runtime.jvm.memory.usage_after_last_gc"),
+        metric -> metric.hasName("process.runtime.jvm.threads.count"),
+        metric -> metric.hasName("process.runtime.jvm.buffer.limit"),
+        metric -> metric.hasName("process.runtime.jvm.buffer.count"),
+        metric -> metric.hasName("process.runtime.jvm.buffer.usage"));
+  }
+}

+ 26 - 0
testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/InstrumentationExtension.java

@@ -18,12 +18,16 @@ import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier;
 import io.opentelemetry.sdk.OpenTelemetrySdk;
 import io.opentelemetry.sdk.logs.data.LogRecordData;
 import io.opentelemetry.sdk.metrics.data.MetricData;
+import io.opentelemetry.sdk.testing.assertj.MetricAssert;
+import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions;
 import io.opentelemetry.sdk.testing.assertj.TraceAssert;
 import io.opentelemetry.sdk.trace.data.SpanData;
 import java.time.Duration;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.List;
 import java.util.function.Consumer;
+import java.util.stream.Collectors;
 import org.assertj.core.api.ListAssert;
 import org.junit.jupiter.api.extension.AfterAllCallback;
 import org.junit.jupiter.api.extension.AfterEachCallback;
@@ -76,6 +80,12 @@ public abstract class InstrumentationExtension
     return testRunner.getExportedMetrics();
   }
 
+  private List<MetricData> instrumentationMetrics(String instrumentationName) {
+    return metrics().stream()
+        .filter(m -> m.getInstrumentationScopeInfo().getName().equals(instrumentationName))
+        .collect(Collectors.toList());
+  }
+
   /** Return a list of all captured logs. */
   public List<LogRecordData> logRecords() {
     return testRunner.getExportedLogRecords();
@@ -100,6 +110,22 @@ public abstract class InstrumentationExtension
                                     && data.getName().equals(metricName))));
   }
 
+  @SafeVarargs
+  public final void waitAndAssertMetrics(
+      String instrumentationName, Consumer<MetricAssert>... assertions) {
+    await()
+        .untilAsserted(
+            () -> {
+              Collection<MetricData> metrics = instrumentationMetrics(instrumentationName);
+              assertThat(metrics).isNotEmpty();
+              for (Consumer<MetricAssert> assertion : assertions) {
+                assertThat(metrics)
+                    .anySatisfy(
+                        metric -> assertion.accept(OpenTelemetryAssertions.assertThat(metric)));
+              }
+            });
+  }
+
   /**
    * Removes all captured telemetry data. After calling this method {@link #spans()} and {@link
    * #metrics()} will return empty lists until more telemetry data is captured.