From 277a1caa603aca65620bcaa01be2bf82268a48d2 Mon Sep 17 00:00:00 2001 From: artembilan Date: Thu, 10 Nov 2022 10:55:32 -0500 Subject: [PATCH] Add Spring Integration observationPatterns prop Spring Integration can instrument its component with an `Observation` according to the `@EnableIntegrationManagement.observationPatterns` value * Expose `spring.integration.management.observation-patterns` configuration property * Propagate this property into an `@EnableIntegrationManagement` in the `IntegrationAutoConfiguration.IntegrationManagementConfiguration` * Verify that property has an effect via `IntegrationAutoConfigurationTests.integrationManagementInstrumentedWithObservation()` --- .../integration/IntegrationAutoConfiguration.java | 3 ++- .../integration/IntegrationProperties.java | 14 ++++++++++++++ .../IntegrationAutoConfigurationTests.java | 14 ++++++++++++++ .../spring-boot-dependencies/build.gradle | 2 +- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfiguration.java index 5477ff84bcdb..c5f7832186dd 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfiguration.java @@ -209,7 +209,8 @@ protected static class IntegrationManagementConfiguration { @Configuration(proxyBeanMethods = false) @EnableIntegrationManagement( - defaultLoggingEnabled = "${spring.integration.management.default-logging-enabled:true}") + defaultLoggingEnabled = "${spring.integration.management.default-logging-enabled:true}", + observationPatterns = "${spring.integration.management.observation-patterns:}") protected static class EnableIntegrationManagementConfiguration { } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationProperties.java index 65ace115b14c..464142b043ef 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/integration/IntegrationProperties.java @@ -416,6 +416,12 @@ public static class Management { */ private boolean defaultLoggingEnabled = true; + /** + * Comma-separated simple patterns to match integration components for observation + * instrumentation. + */ + private List observationPatterns = new ArrayList<>(); + public boolean isDefaultLoggingEnabled() { return this.defaultLoggingEnabled; } @@ -424,6 +430,14 @@ public void setDefaultLoggingEnabled(boolean defaultLoggingEnabled) { this.defaultLoggingEnabled = defaultLoggingEnabled; } + public List getObservationPatterns() { + return this.observationPatterns; + } + + public void setObservationPatterns(List observationPatterns) { + this.observationPatterns = observationPatterns; + } + } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfigurationTests.java index 10eacb6ac681..125c2de84d5e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/integration/IntegrationAutoConfigurationTests.java @@ -24,6 +24,7 @@ import javax.management.MBeanServer; import javax.sql.DataSource; +import io.micrometer.observation.ObservationRegistry; import io.rsocket.transport.ClientTransport; import io.rsocket.transport.netty.client.TcpClientTransport; import org.assertj.core.api.InstanceOfAssertFactories; @@ -62,6 +63,8 @@ import org.springframework.integration.core.MessageSource; import org.springframework.integration.endpoint.MessageProcessorMessageSource; import org.springframework.integration.gateway.RequestReplyExchanger; +import org.springframework.integration.handler.BridgeHandler; +import org.springframework.integration.handler.LoggingHandler; import org.springframework.integration.handler.MessageProcessor; import org.springframework.integration.rsocket.ClientRSocketConnector; import org.springframework.integration.rsocket.IntegrationRSocketEndpoint; @@ -491,6 +494,17 @@ void integrationManagementLoggingCanBeDisabled() { } + @Test + void integrationManagementInstrumentedWithObservation() { + this.contextRunner.withPropertyValues("spring.integration.management.observation-patterns=testHandler") + .withBean("testHandler", LoggingHandler.class, () -> new LoggingHandler("warn")) + .withBean(ObservationRegistry.class, ObservationRegistry::create) + .withBean(BridgeHandler.class, BridgeHandler::new).run((context) -> { + assertThat(context).getBean("testHandler").extracting("observationRegistry").isNotNull(); + assertThat(context).getBean(BridgeHandler.class).extracting("observationRegistry").isNull(); + }); + } + @Configuration(proxyBeanMethods = false) static class CustomMBeanExporter { diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle index 356aad13abfb..a469aeab37e9 100644 --- a/spring-boot-project/spring-boot-dependencies/build.gradle +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -1379,7 +1379,7 @@ bom { ] } } - library("Spring Integration", "6.0.0-RC2") { + library("Spring Integration", "6.0.0-SNAPSHOT") { group("org.springframework.integration") { imports = [ "spring-integration-bom"