jvmMetrics = new HashSet<>();
+
+ // metrics.add(new MetricToAssert("http.server.request.duration", "Duration of HTTP server requests.", "s", HISTOGRAM)); // just because we generate load with HTTP
+ jvmMetrics.add(new MetricToAssert("jvm.memory.committed", "Measure of memory committed.", "By", LONG_SUM));
+ jvmMetrics.add(new MetricToAssert("jvm.memory.used", "Measure of memory used.", "By", LONG_SUM));
+ // Not on native
+ jvmMetrics.add(new MetricToAssert("jvm.memory.limit", "Measure of max obtainable memory.", "By", LONG_SUM));
+ jvmMetrics.add(new MetricToAssert("jvm.memory.used_after_last_gc",
+ "Measure of memory used, as measured after the most recent garbage collection event on this pool.",
+ "By", LONG_SUM));
+ // not on native
+ jvmMetrics.add(new MetricToAssert("jvm.gc.duration", "Duration of JVM garbage collection actions.", "s", HISTOGRAM));
+ jvmMetrics.add(new MetricToAssert("jvm.class.count", "Number of classes currently loaded.", "{class}", LONG_SUM));
+ jvmMetrics
+ .add(new MetricToAssert("jvm.class.loaded", "Number of classes loaded since JVM start.", "{class}", LONG_SUM));
+ jvmMetrics.add(
+ new MetricToAssert("jvm.class.unloaded", "Number of classes unloaded since JVM start.", "{class}", LONG_SUM));
+ jvmMetrics.add(new MetricToAssert("jvm.cpu.count", "Number of processors available to the Java virtual machine.",
+ "{cpu}", LONG_SUM));
+ // jvm.system.cpu.utilization instead, on native
+ jvmMetrics.add(
+ new MetricToAssert("jvm.cpu.time", "CPU time used by the process as reported by the JVM.", "s", DOUBLE_SUM));
+ jvmMetrics.add(new MetricToAssert("jvm.cpu.recent_utilization",
+ "Recent CPU utilization for the process as reported by the JVM.", "1", DOUBLE_GAUGE));
+ jvmMetrics.add(new MetricToAssert("jvm.thread.count", "Number of executing platform threads.", "{thread}", LONG_SUM));
+
+ // not supported on Semeru
+ if (!JdkUtil.isSemeru()) {
+ jvmMetrics.add(new MetricToAssert("jvm.cpu.limit", "", "1", LONG_SUM));
+ jvmMetrics.add(new MetricToAssert("jvm.cpu.longlock", "Long lock times", "s", HISTOGRAM));
+ jvmMetrics.add(new MetricToAssert("jvm.cpu.context_switch", "", "Hz", DOUBLE_SUM));
+
+ // not on native
+ jvmMetrics.add(new MetricToAssert("jvm.network.io", "Network read/write bytes.", "By", HISTOGRAM));
+ jvmMetrics.add(new MetricToAssert("jvm.network.time", "Network read/write duration.", "s", HISTOGRAM));
+ }
+
+ return jvmMetrics;
}
private Double getLastReading(MetricToAssert metricToAssert) {
diff --git a/test-framework/common/src/main/java/io/quarkus/test/common/JdkUtil.java b/test-framework/common/src/main/java/io/quarkus/test/common/JdkUtil.java
new file mode 100644
index 0000000000000..63da16c2a01d7
--- /dev/null
+++ b/test-framework/common/src/main/java/io/quarkus/test/common/JdkUtil.java
@@ -0,0 +1,10 @@
+package io.quarkus.test.common;
+
+import java.util.Locale;
+
+public class JdkUtil {
+
+ public static boolean isSemeru() {
+ return System.getProperty("java.runtime.name", "").toLowerCase(Locale.ROOT).contains("semeru");
+ }
+}
diff --git a/test-framework/junit5-internal/src/main/java/io/quarkus/test/DisabledOnSemeru.java b/test-framework/junit5-internal/src/main/java/io/quarkus/test/DisabledOnSemeru.java
new file mode 100644
index 0000000000000..5d7ace03ad397
--- /dev/null
+++ b/test-framework/junit5-internal/src/main/java/io/quarkus/test/DisabledOnSemeru.java
@@ -0,0 +1,25 @@
+package io.quarkus.test;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.junit.jupiter.api.extension.ExtendWith;
+
+/**
+ * Used to signal that a test class or method should be disabled if Semeru is used as the JVM runtime.
+ *
+ * We cannot test for Semeru exactly but we check the java.vendor is IBM Corporation.
+ */
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@ExtendWith(DisabledOnSemeruCondition.class)
+public @interface DisabledOnSemeru {
+
+ int versionGreaterThanOrEqualTo() default 0;
+
+ int versionLessThanOrEqualTo() default 0;
+
+ String reason() default "";
+}
diff --git a/test-framework/junit5-internal/src/main/java/io/quarkus/test/DisabledOnSemeruCondition.java b/test-framework/junit5-internal/src/main/java/io/quarkus/test/DisabledOnSemeruCondition.java
new file mode 100644
index 0000000000000..ab4c6bdf2bc76
--- /dev/null
+++ b/test-framework/junit5-internal/src/main/java/io/quarkus/test/DisabledOnSemeruCondition.java
@@ -0,0 +1,46 @@
+package io.quarkus.test;
+
+import static org.junit.platform.commons.util.AnnotationUtils.findAnnotation;
+
+import java.lang.reflect.AnnotatedElement;
+import java.util.Optional;
+
+import org.junit.jupiter.api.extension.ConditionEvaluationResult;
+import org.junit.jupiter.api.extension.ExecutionCondition;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+import io.quarkus.test.common.JdkUtil;
+
+public class DisabledOnSemeruCondition implements ExecutionCondition {
+
+ @Override
+ public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
+ Optional element = context.getElement();
+ Optional optional = findAnnotation(element, DisabledOnSemeru.class);
+ if (optional.isEmpty()) {
+ return ConditionEvaluationResult.enabled("@DisabledOnSemeru was not found");
+ }
+ if (!JdkUtil.isSemeru()) {
+ return ConditionEvaluationResult.enabled("JVM is not identified as Semeru");
+ }
+
+ DisabledOnSemeru disabledOnSemeru = optional.get();
+ if (disabledOnSemeru.versionGreaterThanOrEqualTo() > 0 || disabledOnSemeru.versionLessThanOrEqualTo() > 0) {
+ if (disabledOnSemeru.versionGreaterThanOrEqualTo() > 0) {
+ if (Runtime.version().feature() < disabledOnSemeru.versionGreaterThanOrEqualTo()) {
+ return ConditionEvaluationResult.disabled(
+ "JVM identified as Semeru and JVM version < " + disabledOnSemeru.versionGreaterThanOrEqualTo());
+ }
+ }
+ if (disabledOnSemeru.versionLessThanOrEqualTo() > 0) {
+ if (Runtime.version().feature() > disabledOnSemeru.versionLessThanOrEqualTo()) {
+ return ConditionEvaluationResult.disabled(
+ "JVM identified as Semeru and JVM version > " + disabledOnSemeru.versionLessThanOrEqualTo());
+ }
+ }
+ return ConditionEvaluationResult.enabled("JVM is identified as Semeru but version matches");
+ }
+
+ return ConditionEvaluationResult.disabled("JVM is identified as Semeru");
+ }
+}
diff --git a/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisabledOnSemeru.java b/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisabledOnSemeru.java
new file mode 100644
index 0000000000000..4296e30474bd6
--- /dev/null
+++ b/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisabledOnSemeru.java
@@ -0,0 +1,25 @@
+package io.quarkus.test.junit;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.junit.jupiter.api.extension.ExtendWith;
+
+/**
+ * Used to signal that a test class or method should be disabled if Semeru is used as the JVM runtime.
+ *
+ * We cannot test for Semeru exactly but we check the java.vendor is IBM Corporation.
+ */
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@ExtendWith(DisabledOnSemeruCondition.class)
+public @interface DisabledOnSemeru {
+
+ int versionGreaterThanOrEqualTo() default 0;
+
+ int versionLessThanOrEqualTo() default 0;
+
+ String reason() default "";
+}
diff --git a/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisabledOnSemeruCondition.java b/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisabledOnSemeruCondition.java
new file mode 100644
index 0000000000000..46f114a7ce725
--- /dev/null
+++ b/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisabledOnSemeruCondition.java
@@ -0,0 +1,46 @@
+package io.quarkus.test.junit;
+
+import static org.junit.platform.commons.util.AnnotationUtils.findAnnotation;
+
+import java.lang.reflect.AnnotatedElement;
+import java.util.Optional;
+
+import org.junit.jupiter.api.extension.ConditionEvaluationResult;
+import org.junit.jupiter.api.extension.ExecutionCondition;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+import io.quarkus.test.common.JdkUtil;
+
+public class DisabledOnSemeruCondition implements ExecutionCondition {
+
+ @Override
+ public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
+ Optional element = context.getElement();
+ Optional optional = findAnnotation(element, DisabledOnSemeru.class);
+ if (optional.isEmpty()) {
+ return ConditionEvaluationResult.enabled("@DisabledOnSemeru was not found");
+ }
+ if (!JdkUtil.isSemeru()) {
+ return ConditionEvaluationResult.enabled("JVM is not identified as Semeru");
+ }
+
+ DisabledOnSemeru disabledOnSemeru = optional.get();
+ if (disabledOnSemeru.versionGreaterThanOrEqualTo() > 0 || disabledOnSemeru.versionLessThanOrEqualTo() > 0) {
+ if (disabledOnSemeru.versionGreaterThanOrEqualTo() > 0) {
+ if (Runtime.version().feature() < disabledOnSemeru.versionGreaterThanOrEqualTo()) {
+ return ConditionEvaluationResult.disabled(
+ "JVM identified as Semeru and JVM version < " + disabledOnSemeru.versionGreaterThanOrEqualTo());
+ }
+ }
+ if (disabledOnSemeru.versionLessThanOrEqualTo() > 0) {
+ if (Runtime.version().feature() > disabledOnSemeru.versionLessThanOrEqualTo()) {
+ return ConditionEvaluationResult.disabled(
+ "JVM identified as Semeru and JVM version > " + disabledOnSemeru.versionLessThanOrEqualTo());
+ }
+ }
+ return ConditionEvaluationResult.enabled("JVM is identified as Semeru but version matches");
+ }
+
+ return ConditionEvaluationResult.disabled("JVM is identified as Semeru");
+ }
+}