From b9c6781a70d8047316b575cb0036a4a08c1a30ac Mon Sep 17 00:00:00 2001 From: Michael Weirauch Date: Thu, 31 May 2018 22:18:54 +0200 Subject: [PATCH] Fix Jetty metrics instrumentation The factory is being asked to create a server before our configuration has a chance to kick in. Relates to #593. --- .../web/jetty/JettyMetricsConfiguration.java | 20 ++----- .../web/jetty/JettyMetricsPostProcessor.java | 57 +++++++++++++++++++ 2 files changed, 62 insertions(+), 15 deletions(-) create mode 100644 micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/web/jetty/JettyMetricsPostProcessor.java diff --git a/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/web/jetty/JettyMetricsConfiguration.java b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/web/jetty/JettyMetricsConfiguration.java index b2ce6ee093..a56c7cf264 100644 --- a/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/web/jetty/JettyMetricsConfiguration.java +++ b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/web/jetty/JettyMetricsConfiguration.java @@ -16,33 +16,23 @@ package io.micrometer.spring.autoconfigure.web.jetty; import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.core.instrument.binder.jetty.InstrumentedQueuedThreadPool; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; -import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import java.util.Collections; - /** * @author Manabu Matsuzaki * @author Jon Schneider + * @author Michael Weirauch */ @Configuration @ConditionalOnClass(name = "org.eclipse.jetty.server.Server") @ConditionalOnMissingClass("org.apache.catalina.startup.Tomcat") public class JettyMetricsConfiguration { - private final MeterRegistry registry; - - public JettyMetricsConfiguration(MeterRegistry registry) { - this.registry = registry; - } - @Autowired(required = false) - public void instrumentJettyThreadPool(JettyEmbeddedServletContainerFactory jettyContainerFactory) { - if (jettyContainerFactory != null) { - jettyContainerFactory.setThreadPool(new InstrumentedQueuedThreadPool(registry, Collections.emptyList())); - } + @Bean + JettyMetricsPostProcessor jettyMetricsPostProcessor(MeterRegistry registry) { + return new JettyMetricsPostProcessor(registry); } } diff --git a/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/web/jetty/JettyMetricsPostProcessor.java b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/web/jetty/JettyMetricsPostProcessor.java new file mode 100644 index 0000000000..bca1d73c49 --- /dev/null +++ b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/web/jetty/JettyMetricsPostProcessor.java @@ -0,0 +1,57 @@ +/** + * Copyright 2017 Pivotal Software, Inc. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.spring.autoconfigure.web.jetty; + +import java.util.Collections; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory; +import org.springframework.core.Ordered; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.binder.jetty.InstrumentedQueuedThreadPool; + +/** + * @author Michael Weirauch + */ +public class JettyMetricsPostProcessor implements BeanPostProcessor, Ordered { + private final MeterRegistry registry; + + JettyMetricsPostProcessor(MeterRegistry registry) { + this.registry = registry; + } + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) + throws BeansException { + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) { + if (bean instanceof JettyEmbeddedServletContainerFactory) { + ((JettyEmbeddedServletContainerFactory) bean).setThreadPool( + new InstrumentedQueuedThreadPool(registry, Collections.emptyList())); + } + return bean; + } + + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } +}