|
|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2012-2023 the original author or authors. |
|
|
|
|
* Copyright 2012-2025 the original author or authors. |
|
|
|
|
* |
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
|
@ -16,6 +16,7 @@
@@ -16,6 +16,7 @@
|
|
|
|
|
|
|
|
|
|
package org.springframework.boot.actuate.autoconfigure.metrics; |
|
|
|
|
|
|
|
|
|
import io.micrometer.core.instrument.binder.MeterBinder; |
|
|
|
|
import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; |
|
|
|
|
import io.micrometer.core.instrument.binder.jvm.JvmCompilationMetrics; |
|
|
|
|
import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; |
|
|
|
|
@ -24,7 +25,14 @@ import io.micrometer.core.instrument.binder.jvm.JvmInfoMetrics;
@@ -24,7 +25,14 @@ import io.micrometer.core.instrument.binder.jvm.JvmInfoMetrics;
|
|
|
|
|
import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; |
|
|
|
|
import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; |
|
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.condition.EnabledForJreRange; |
|
|
|
|
import org.junit.jupiter.api.condition.JRE; |
|
|
|
|
|
|
|
|
|
import org.springframework.aot.hint.MemberCategory; |
|
|
|
|
import org.springframework.aot.hint.RuntimeHints; |
|
|
|
|
import org.springframework.aot.hint.TypeReference; |
|
|
|
|
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; |
|
|
|
|
import org.springframework.beans.BeanUtils; |
|
|
|
|
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun; |
|
|
|
|
import org.springframework.boot.autoconfigure.AutoConfigurations; |
|
|
|
|
import org.springframework.boot.test.context.assertj.AssertableApplicationContext; |
|
|
|
|
@ -32,6 +40,7 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -32,6 +40,7 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
|
|
|
|
import org.springframework.boot.test.context.runner.ContextConsumer; |
|
|
|
|
import org.springframework.context.annotation.Bean; |
|
|
|
|
import org.springframework.context.annotation.Configuration; |
|
|
|
|
import org.springframework.util.ClassUtils; |
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
|
|
|
|
|
|
@ -95,6 +104,36 @@ class JvmMetricsAutoConfigurationTests {
@@ -95,6 +104,36 @@ class JvmMetricsAutoConfigurationTests {
|
|
|
|
|
.run(assertMetricsBeans().andThen((context) -> assertThat(context).hasBean("customJvmCompilationMetrics"))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
@EnabledForJreRange(min = JRE.JAVA_21) |
|
|
|
|
void autoConfiguresJvmMetricsWithVirtualThreadsMetrics() { |
|
|
|
|
this.contextRunner.run(assertMetricsBeans() |
|
|
|
|
.andThen((context) -> assertThat(context).hasSingleBean(getVirtualThreadMetricsClass()))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
@EnabledForJreRange(min = JRE.JAVA_21) |
|
|
|
|
void allowCustomVirtualThreadMetricsToBeUsed() { |
|
|
|
|
Class<MeterBinder> virtualThreadMetricsClass = getVirtualThreadMetricsClass(); |
|
|
|
|
this.contextRunner |
|
|
|
|
.withBean("customVirtualThreadMetrics", virtualThreadMetricsClass, |
|
|
|
|
() -> BeanUtils.instantiateClass(virtualThreadMetricsClass)) |
|
|
|
|
.run(assertMetricsBeans() |
|
|
|
|
.andThen((context) -> assertThat(context).hasSingleBean(getVirtualThreadMetricsClass()) |
|
|
|
|
.hasBean("customVirtualThreadMetrics"))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
@EnabledForJreRange(min = JRE.JAVA_21) |
|
|
|
|
void shouldRegisterVirtualThreadMetricsRuntimeHints() { |
|
|
|
|
RuntimeHints hints = new RuntimeHints(); |
|
|
|
|
new JvmMetricsAutoConfiguration.VirtualThreadMetricsRuntimeHintsRegistrar().registerHints(hints, |
|
|
|
|
getClass().getClassLoader()); |
|
|
|
|
assertThat(RuntimeHintsPredicates.reflection() |
|
|
|
|
.onType(TypeReference.of(getVirtualThreadMetricsClass())) |
|
|
|
|
.withMemberCategories(MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS)).accepts(hints); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private ContextConsumer<AssertableApplicationContext> assertMetricsBeans() { |
|
|
|
|
return (context) -> assertThat(context).hasSingleBean(JvmGcMetrics.class) |
|
|
|
|
.hasSingleBean(JvmHeapPressureMetrics.class) |
|
|
|
|
@ -105,6 +144,12 @@ class JvmMetricsAutoConfigurationTests {
@@ -105,6 +144,12 @@ class JvmMetricsAutoConfigurationTests {
|
|
|
|
|
.hasSingleBean(JvmCompilationMetrics.class); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
|
private static Class<MeterBinder> getVirtualThreadMetricsClass() { |
|
|
|
|
return (Class<MeterBinder>) ClassUtils |
|
|
|
|
.resolveClassName("io.micrometer.java21.instrument.binder.jdk.VirtualThreadMetrics", null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Configuration(proxyBeanMethods = false) |
|
|
|
|
static class CustomJvmGcMetricsConfiguration { |
|
|
|
|
|
|
|
|
|
|