diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/groovy/JmxRuntimeMetricsTest.groovy b/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/groovy/JmxRuntimeMetricsTest.groovy deleted file mode 100644 index 16ea3d90efe1..000000000000 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/groovy/JmxRuntimeMetricsTest.groovy +++ /dev/null @@ -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" } - } - } -} diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java17/JfrRuntimeMetricsTest.java b/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java17/JfrRuntimeMetricsTest.java index 59c5366dd14a..1a2b729b68ee 100644 --- a/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java17/JfrRuntimeMetricsTest.java +++ b/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... assertions) { - await() - .untilAsserted( - () -> { - Collection metrics = AgentTestRunner.instance().getExportedMetrics(); - assertThat(metrics).isNotEmpty(); - for (Consumer 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 @@ void shouldHaveDefaultMetrics() { // 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")); diff --git a/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java17/JmxRuntimeMetricsTest.java b/instrumentation/runtime-telemetry/runtime-telemetry-java17/javaagent/src/test/java/io/opentelemetry/instrumentation/javaagent/runtimemetrics/java17/JmxRuntimeMetricsTest.java new file mode 100644 index 000000000000..3a6355e1edc4 --- /dev/null +++ b/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")); + } +} diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/InstrumentationExtension.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/InstrumentationExtension.java index 5900b842397f..a83f7642adce 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/InstrumentationExtension.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/InstrumentationExtension.java @@ -18,12 +18,16 @@ 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 List metrics() { return testRunner.getExportedMetrics(); } + private List 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 logRecords() { return testRunner.getExportedLogRecords(); @@ -100,6 +110,22 @@ public void waitAndAssertMetrics( && data.getName().equals(metricName)))); } + @SafeVarargs + public final void waitAndAssertMetrics( + String instrumentationName, Consumer... assertions) { + await() + .untilAsserted( + () -> { + Collection metrics = instrumentationMetrics(instrumentationName); + assertThat(metrics).isNotEmpty(); + for (Consumer 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.