From ebd894a4b122b3d4aa0153ef645d5d44498a9da3 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Mon, 9 Nov 2020 11:59:50 -0500 Subject: [PATCH 1/2] Auto-configure metrics before Spring Integration Related to https://github.com/spring-projects/spring-integration/issues/3420 After fixing https://github.com/spring-projects/spring-integration/issues/3376 to make sure that Spring Integration has a dependency on the `MeterRegistry` for the proper lifecycle on shutdown, it turns out that Spring Integration metrics features must be configured *after* the `MeterRegistry` is provided properly by Spring Boot Note: we start observing the wrong order problem when we also have an `IntegrationGraphEndpointAutoConfiguration` which is ordered alphabetically (therefore before `MetricsAutoConfiguration`) and pushes an `IntegrationAutoConfiguration` up - before `MetricsAutoConfiguration` * Add `@AutoConfigureBefore(IntegrationAutoConfiguration.class)` to the `CompositeMeterRegistryAutoConfiguration` to ensure that `MeterRegistry` bean is provided before `@EnableIntegrationManagement` logic **Back-port to `master` moving `@AutoConfigureBefore(IntegrationAutoConfiguration.class)` onto the `MeterRegistryAutoConfiguration` already** --- ...mpositeMeterRegistryAutoConfiguration.java | 6 +- ...egrationMetricsAutoConfigurationTests.java | 63 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfigurationTests.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/CompositeMeterRegistryAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/CompositeMeterRegistryAutoConfiguration.java index f9452356de92..b5498e4c5277 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/CompositeMeterRegistryAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/CompositeMeterRegistryAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -18,8 +18,10 @@ import io.micrometer.core.instrument.composite.CompositeMeterRegistry; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -28,11 +30,13 @@ * {@link CompositeMeterRegistry}. * * @author Andy Wilkinson + * @author Artem Bilan * @since 2.0.0 */ @Configuration(proxyBeanMethods = false) @Import({ NoOpMeterRegistryConfiguration.class, CompositeMeterRegistryConfiguration.class }) @ConditionalOnClass(CompositeMeterRegistry.class) +@AutoConfigureBefore(IntegrationAutoConfiguration.class) public class CompositeMeterRegistryAutoConfiguration { } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfigurationTests.java new file mode 100644 index 000000000000..489f9378a60c --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfigurationTests.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012-2020 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. + * You may obtain a copy of the License at + * + * https://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 org.springframework.boot.actuate.autoconfigure.metrics.integration; + + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.actuate.autoconfigure.integration.IntegrationGraphEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.metrics.amqp.RabbitMetricsAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import io.micrometer.core.instrument.Gauge; +import io.micrometer.core.instrument.MeterRegistry; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link RabbitMetricsAutoConfiguration}. + * + * @author Artem Bilan + * + * @since 2.3.6 + */ +class IntegrationMetricsAutoConfigurationTests { + + private final ApplicationContextRunner contextRunner = + new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of( + IntegrationAutoConfiguration.class, + IntegrationGraphEndpointAutoConfiguration.class)) + .with(MetricsRun.simple()) + .withPropertyValues("management.metrics.tags.someTag=someValue"); + + @Test + void integrationMetersAreInstrumented() { + this.contextRunner.run((context) -> { + MeterRegistry registry = context.getBean(MeterRegistry.class); + Gauge gauge = + registry.get("spring.integration.channels") + .tag("someTag", "someValue") + .gauge(); + assertThat(gauge).isNotNull().extracting(Gauge::value).isEqualTo(2.0); + }); + } + +} From 7f789a8560abd03c20ba6562bb67f8f95cf23d3a Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Tue, 10 Nov 2020 15:51:28 -0500 Subject: [PATCH 2/2] * Add `IntegrationMetricsAutoConfiguration` with appropriate auto-configuration order between Actuator metrics and Spring Integration * bump SI version to the latest SNAPSHOT which includes the fix for dependency injection for the `IntegrationManagementConfigurer` --- ...mpositeMeterRegistryAutoConfiguration.java | 6 +-- .../IntegrationMetricsAutoConfiguration.java | 43 +++++++++++++++++++ .../metrics/integration/package-info.java | 20 +++++++++ .../main/resources/META-INF/spring.factories | 1 + ...egrationMetricsAutoConfigurationTests.java | 1 - .../spring-boot-dependencies/build.gradle | 2 +- 6 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfiguration.java create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/package-info.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/CompositeMeterRegistryAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/CompositeMeterRegistryAutoConfiguration.java index b5498e4c5277..f9452356de92 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/CompositeMeterRegistryAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/CompositeMeterRegistryAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2019 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. @@ -18,10 +18,8 @@ import io.micrometer.core.instrument.composite.CompositeMeterRegistry; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -30,13 +28,11 @@ * {@link CompositeMeterRegistry}. * * @author Andy Wilkinson - * @author Artem Bilan * @since 2.0.0 */ @Configuration(proxyBeanMethods = false) @Import({ NoOpMeterRegistryConfiguration.class, CompositeMeterRegistryConfiguration.class }) @ConditionalOnClass(CompositeMeterRegistry.class) -@AutoConfigureBefore(IntegrationAutoConfiguration.class) public class CompositeMeterRegistryAutoConfiguration { } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfiguration.java new file mode 100644 index 000000000000..5d25c8fb34d2 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfiguration.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2020 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. + * You may obtain a copy of the License at + * + * https://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 org.springframework.boot.actuate.autoconfigure.metrics.integration; + +import io.micrometer.core.instrument.MeterRegistry; + +import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration; +import org.springframework.context.annotation.Configuration; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for Spring Integration's metrics. + * Orders auto-configuration classes to ensure that the {@link MeterRegistry} bean has + * been defined before Spring Integration's Micrometer support queries the bean factory + * for it. + * + * @author Andy Wilkinson + * @since 2.3.6 + */ +@AutoConfigureAfter({ MetricsAutoConfiguration.class, CompositeMeterRegistryAutoConfiguration.class }) +@AutoConfigureBefore(IntegrationAutoConfiguration.class) +@Configuration(proxyBeanMethods = false) +public class IntegrationMetricsAutoConfiguration { + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/package-info.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/package-info.java new file mode 100644 index 000000000000..bf42f0611736 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2019 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. + * You may obtain a copy of the License at + * + * https://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. + */ + +/** + * Auto-configuration for Spring Integration metrics. + */ +package org.springframework.boot.actuate.autoconfigure.metrics.integration; diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/spring.factories index d9832a774b60..5509735108a0 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/resources/META-INF/spring.factories @@ -68,6 +68,7 @@ org.springframework.boot.actuate.autoconfigure.metrics.export.stackdriver.Stackd org.springframework.boot.actuate.autoconfigure.metrics.export.statsd.StatsdMetricsExportAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.export.wavefront.WavefrontMetricsExportAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.jdbc.DataSourcePoolMetricsAutoConfiguration,\ +org.springframework.boot.actuate.autoconfigure.metrics.integration.IntegrationMetricsAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.jersey.JerseyServerMetricsAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa.HibernateMetricsAutoConfiguration,\ org.springframework.boot.actuate.autoconfigure.metrics.r2dbc.ConnectionPoolMetricsAutoConfiguration,\ diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfigurationTests.java index 489f9378a60c..8696040287c7 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/integration/IntegrationMetricsAutoConfigurationTests.java @@ -35,7 +35,6 @@ * Tests for {@link RabbitMetricsAutoConfiguration}. * * @author Artem Bilan - * * @since 2.3.6 */ class IntegrationMetricsAutoConfigurationTests { diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle index 7e3e78e7d2c4..d6d22c508c2e 100644 --- a/spring-boot-project/spring-boot-dependencies/build.gradle +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -1683,7 +1683,7 @@ bom { ] } } - library("Spring Integration", "5.3.3.RELEASE") { + library("Spring Integration", "5.3.4.BUILD-SNAPSHOT") { group("org.springframework.integration") { imports = [ "spring-integration-bom"