[spring-projects/spring-boot]PrometheusMetricsExportAutoConfiguration 和自定义配置 -- 循环 dep

2024-05-14 642 views
2

描述错误 在我的 Spring Boot 项目中,我有一个自定义指标配置,a) 在构造函数中添加DiskSpaceMetric b) 创建一个MeterRegistryCustomizer<MeterRegistry>bean

a) 产生循环依赖错误 b) 产生 NPE,由同一个循环引起

注入MeterRegistry等待配置,配置又等待MeterRegistry完成初始化。我不知道如何通过我能做的任何事情来解决这个问题,所以千分尺本身似乎存在问题。

鉴于在本地添加@Lazy有帮助,但在生产服务器上没有,这似乎是竞争条件。

环境

  • 操作系统:Linux
  • Java版本:11
  • 弹簧启动2.6.1

重现

@Configuration
public class MetricsConfig {

    public MetricsConfig(final MeterRegistry aMeterRegistry) {}//@Lazy on parameter _sometimes_ helps

    @Bean
    public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
        return tRegistry -> tRegistry.config();
    }
}

构造函数主动原因

Description:

The dependencies of some of the beans in the application context form a cycle:

   webMvcMetricsFilter defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.class]
┌─────┐
|  prometheusMeterRegistry defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfiguration.class]
↑     ↓
|  metricsConfig defined in file [/foo/bar/MetricsConfig.class]
└─────┘

构造函数被删除,metricsCommonTags原因(基本上是同一问题)

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:163) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:577) ~[spring-context-5.3.13.jar:5.3.13]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:302) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1290) ~[spring-boot-2.6.1.jar:2.6.1]
    at foo.MyApplication.main(MyApplication.java:12) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.6.1.jar:2.6.1]
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:142) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:473) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:206) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:182) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:160) ~[spring-boot-2.6.1.jar:2.6.1]
    ... 13 common frames omitted
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webMvcMetricsFilter' defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.class]: Unsatisfied dependency expressed through method 'webMvcMetricsFilter' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'prometheusMeterRegistry' defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfiguration.class]: Initialization of bean failed; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:212) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:203) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:97) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.servlet.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:86) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:260) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:234) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:53) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5219) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na]
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na]
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:432) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:927) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486) ~[tomcat-embed-core-9.0.55.jar:9.0.55]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[spring-boot-2.6.1.jar:2.6.1]
    ... 18 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'prometheusMeterRegistry' defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfiguration.class]: Initialization of bean failed; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:628) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.13.jar:5.3.13]
    ... 58 common frames omitted
Caused by: java.lang.NullPointerException: null
    at java.base/java.util.Objects.requireNonNull(Objects.java:221) ~[na:na]
    at io.micrometer.core.instrument.ImmutableTag.<init>(ImmutableTag.java:35) ~[micrometer-core-1.8.0.jar:1.8.0]
    at io.micrometer.core.instrument.Tag.of(Tag.java:29) ~[micrometer-core-1.8.0.jar:1.8.0]
    at io.micrometer.core.instrument.Tags.of(Tags.java:254) ~[micrometer-core-1.8.0.jar:1.8.0]
    at io.micrometer.core.instrument.MeterRegistry$Config.commonTags(MeterRegistry.java:748) ~[micrometer-core-1.8.0.jar:1.8.0]
    at foo.bar.MetricsConfig.lambda$1(MetricsConfig.java:46) ~[classes/:na]
    at org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryConfigurer.lambda$customize$0(MeterRegistryConfigurer.java:78) ~[spring-boot-actuator-autoconfigure-2.6.1.jar:2.6.1]
    at org.springframework.boot.util.LambdaSafe$Callbacks.lambda$null$0(LambdaSafe.java:287) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.util.LambdaSafe$LambdaSafeCallback.invoke(LambdaSafe.java:159) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.util.LambdaSafe$Callbacks.lambda$invoke$1(LambdaSafe.java:286) ~[spring-boot-2.6.1.jar:2.6.1]
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) ~[na:na]
    at org.springframework.boot.util.LambdaSafe$Callbacks.invoke(LambdaSafe.java:286) ~[spring-boot-2.6.1.jar:2.6.1]
    at org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryConfigurer.customize(MeterRegistryConfigurer.java:78) ~[spring-boot-actuator-autoconfigure-2.6.1.jar:2.6.1]
    at org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryConfigurer.configure(MeterRegistryConfigurer.java:63) ~[spring-boot-actuator-autoconfigure-2.6.1.jar:2.6.1]
    at org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryPostProcessor.postProcessAfterInitialization(MeterRegistryPostProcessor.java:64) ~[spring-boot-actuator-autoconfigure-2.6.1.jar:2.6.1]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:455) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808) ~[spring-beans-5.3.13.jar:5.3.13]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.13.jar:5.3.13]
    ... 68 common frames omitted

它似乎与

21134 22926

回答

4

感谢您的报告,但MeterRegistry在配置类中分配 可能是触发它的原因。我不认为这是一个错误,而是上述安排的结果。

您是否尝试过以下方法?

@Configuration
public class MetricsConfig {

    @Bean
    public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags(MeterRegistry meterRegistry) {
        return tRegistry -> tRegistry.config();
    }
}

我也不认为您链接的两个问题是相关的。

3

好吧,这让我回到了与构造函数相同的问题:

The dependencies of some of the beans in the application context form a cycle:

   webMvcMetricsFilter defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/web/servlet/WebMvcMetricsAutoConfiguration.class]
┌─────┐
|  prometheusMeterRegistry defined in class path resource [org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfiguration.class]
↑     ↓
|  metricsCommonTags defined in class path resource [foo/bar/MetricsConfig.class]
└─────┘

Bean 定义遵循此处给出的示例,顺便说一句: https://docs.spring.io/spring-boot/docs/2.4.12/reference/html/production-ready-features.html

我列出的问题似乎涉及初始化的顺序,至少在这里需要PrometheusMetricsExportAutoConfiguration在自定义配置之前完成。为什么它要等待我的自定义配置,我真的不明白。由于很明显我的自定义配置需要PrometheusMetricsExportAutoConfiguration完成,因此初始化的顺序应该相当明显。

1

抱歉,在查看文本中的代码(而不是在 IDE 中)时,我经常会忽略某些内容。这个圆圈是合乎逻辑的,因为您正在尝试自定义某些内容并同时注入它。框架不可能解决这个循环。

为什么需要在注册表定制器中注入注册表?

9

因为我a)需要再添加MeterBinder b)自定义注册表的常用标签

从我所看到的一切来看,我这样做的方式是规范的方式。也许我太愚钝了,但是还有什么办法可以实现这一点呢?

“尝试定制一些东西并同时注入它。”但如果我注入它,它仍然为空:

       @Bean
    public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
        return tRegistry -> tRegistry.config(); //NPE since tRegistry is null
    }

假设我暂时忽略了构造函数,那么它MeterRegistry仍然不可用,因为显然需要PrometheusMetricsExportAutoConfiguration等待此配置完成。 (而且,顺便说一句,我总是认为,注入需要注入的实例已经实例化。)

鉴于添加@Lazy 有时有效,显然该框架能够以某种方式解决该循环:

public MetricsConfig(@Lazy final MeterRegistry aMeterRegistry) {}
6

从我所看到的一切来看,我这样做的方式是规范的方式。

注入MeterRegistry一个MeterRegistryCustomizer?你在哪里见过这个?

但如果我不注入它,它仍然为空:

我不明白这怎么会发生。如果您需要我们的支持,请分享一个小样本,我们可以自己运行该样本来重现您所描述的内容。您可以通过将 zip 附加到此问题或共享 GitHub 存储库的链接来完成此操作。谢谢。

4

我当时的印象是我们在这里谈论的目的是相互矛盾的。 IMO 这是一个竞争条件。我提供的类实际上是重现该问题的最小可能示例。

但让我们简单一点:我应该如何 a) 添加一个自定义MeterBinder b) 创建一个MeterRegistryCustomizer<MeterRegistry>像这样的

// https://docs.spring.io/spring-boot/docs/2.4.12/reference/html/production-ready-features.html#production-ready-metrics-getting-started
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
    return registry -> registry.config().commonTags("region", "us-east-1");
}

?如果我做错了,需要有一个正确的方法——如果这种方法有效,我就会关闭这个问题。如果您不能提供不同的方式,我将其视为确认这实际上是一个错误。

0

上面的代码在不同的地方进行了测试,所以它可以工作。我之所以要求提供样品,是因为有些东西你没有展示,而我不热衷于在这里进行乒乓对话。如果您分享一个示例,我非常乐意查看。

8

我不知道我“没有展示”什么,也不知道为什么这个很小但完整的课程不能满足您的任何需求。但你也不能展示不同的方式,所以显然没有其他方式,我们在这里面临一个错误。

6

请珍惜我们的时间。我们已经讨论过注入MeterRegistry永远不会起作用,因此您显示的配置类不会为“但如果我不注入它,它仍然为空”制作示例。如果您需要支持,请分享我们可以运行的示例(我们可以自己运行的实际项目,而不是文本代码)。

2

如果您希望我们查看此问题,请提供所需的信息。如果在接下来的 7 天内未提供信息,此问题将被关闭。

4

我提供了我所拥有的一切。我已经解释过,同一段代码有时有效,有时无效。 @snicoll 告诉我两次,它应该可以工作,两次,它不能工作——确切地说,是一段未更改的代码。

由于我系统上的 Springboot 和 GitHub 上的 @snicoll 似乎对其有时的工作方式有相同的看法,所以很明显,一切都已提供。

至少,我不知道我还能做些什么来帮助你明确地做出同样的结论@snicoll已经隐含地表达了:耸肩:

4

请不要曲解我的话。我已经说过参考文档中的示例有效。正如我们在这里多次建立的那样,这些都不会在任何地方注入 MeterRegistry。你是的,所以有很大的不同(这也是你首先得到一个周期的原因)。

如果您不想花时间分享一个小样本,我们就没有理由花时间在这上面,所以我现在就结束这个。如果您分享一个演示您正在尝试执行的操作的示例,我们可以重新考虑。

5

@jivkoto 你不应该将 a 注入MeterRegistryMeterBinder.后者作为初始化前者的一部分被调用,因此注入尝试创建一个循环。

绑定器的bindTo方法将使用 a 调用MeterRegistry,因此不需要注入,应该将其删除:

@Bean
MeterBinder queueSize() {
    return (registry) -> Gauge.builder("queueSize", ___some_supplier_here___).register(registry);
}
0

@wilkinsona不知道你如何看待我的评论,因为我在发现我不应该通过之后立即将其删除,MeterRegistry因为它将由 提供MeterBinder,正如你所描述的那样。

无论如何,让我们添加一些值来评论一下开头所描述的初始问题的情况。那家伙不应该有构造函数@Autowire aMeterRegistry

public MetricsConfig(final MeterRegistry aMeterRegistry)

它无法构建,MetricsConfig因为MeterRegistry尚未准备好。而且它无法准备好,因为MetricsConfig类生成MeterRegistryCustomizer<MeterRegistry>MeterRegistry配置的一部分。大概他还需要使用MeterRegistry一些米。解决方案是将其从构造函数中删除,并且仅@Autowired在相关@Bean方法上删除。

@wilkinsona 非常感谢。你的评论是正确的。