Skip to content

Commit

Permalink
Remove the use of a FactoryBean when auto-configuring VirtualThreadMe…
Browse files Browse the repository at this point in the history
…trics

See gh-43956

Signed-off-by: Dmytro Nosan <[email protected]>
  • Loading branch information
nosan committed Jan 24, 2025
1 parent ec94e07 commit a5f7656
Showing 1 changed file with 12 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@

package org.springframework.boot.actuate.autoconfigure.metrics;

import java.io.Closeable;

import io.micrometer.core.instrument.MeterRegistry;
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;
Expand All @@ -32,8 +31,6 @@
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
Expand All @@ -53,10 +50,17 @@
@AutoConfiguration(after = { MetricsAutoConfiguration.class, CompositeMeterRegistryAutoConfiguration.class })
@ConditionalOnClass(MeterRegistry.class)
@ConditionalOnBean(MeterRegistry.class)
public class JvmMetricsAutoConfiguration {
public class JvmMetricsAutoConfiguration implements BeanClassLoaderAware {

private static final String VIRTUAL_THREAD_METRICS_CLASS = "io.micrometer.java21.instrument.binder.jdk.VirtualThreadMetrics";

private ClassLoader beanClassLoader;

@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.beanClassLoader = classLoader;
}

@Bean
@ConditionalOnMissingBean
public JvmGcMetrics jvmGcMetrics() {
Expand Down Expand Up @@ -103,47 +107,9 @@ public JvmCompilationMetrics jvmCompilationMetrics() {
@ConditionalOnClass(name = VIRTUAL_THREAD_METRICS_CLASS)
@ConditionalOnMissingBean(type = VIRTUAL_THREAD_METRICS_CLASS)
@ImportRuntimeHints(VirtualThreadMetricsRuntimeHintsRegistrar.class)
VirtualThreadMetricsFactoryBean virtualThreadMetrics() {
return new VirtualThreadMetricsFactoryBean();
}

static final class VirtualThreadMetricsFactoryBean
implements FactoryBean<Object>, BeanClassLoaderAware, DisposableBean {

private ClassLoader classLoader;

private Class<?> instanceType;

private Object instance;

@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}

@Override
public Object getObject() {
if (this.instance == null) {
this.instance = BeanUtils.instantiateClass(getObjectType());
}
return this.instance;
}

@Override
public Class<?> getObjectType() {
if (this.instanceType == null) {
this.instanceType = ClassUtils.resolveClassName(VIRTUAL_THREAD_METRICS_CLASS, this.classLoader);
}
return this.instanceType;
}

@Override
public void destroy() throws Exception {
if (this.instance instanceof Closeable closeable) {
closeable.close();
}
}

MeterBinder virtualThreadMetrics() {
Class<?> clazz = ClassUtils.resolveClassName(VIRTUAL_THREAD_METRICS_CLASS, this.beanClassLoader);
return (MeterBinder) BeanUtils.instantiateClass(clazz);
}

static final class VirtualThreadMetricsRuntimeHintsRegistrar implements RuntimeHintsRegistrar {
Expand Down

0 comments on commit a5f7656

Please sign in to comment.