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

Co-authored-by: Jean Bisutti <jean.bisutti@gmail.com>
This commit is contained in:
jason plumb 2023-07-18 02:55:15 -07:00 committed by GitHub
parent 002588b10c
commit 23acd5b4fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 76 additions and 58 deletions

View File

@ -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" }
}
}
}

View File

@ -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"));

View File

@ -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"));
}
}

View File

@ -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.