From 03cf4fbb10d72bb061cb7e7e651e68f6de027dee Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 17 Apr 2018 15:40:39 +0200 Subject: [PATCH] Polish "Add actuator endpoint for exposing the Spring Integration graph" Closes gh-12331 --- .../asciidoc/endpoints/integrationgraph.adoc | 13 +++-- ...grationGraphEndpointAutoConfiguration.java | 14 +++++- ...rationGraphEndpointDocumentationTests.java | 3 +- ...onGraphEndpointAutoConfigurationTests.java | 50 ++++++++++--------- .../integration/IntegrationGraphEndpoint.java | 21 ++++---- .../actuate/integration/package-info.java | 2 +- .../IntegrationGraphEndpointTests.java | 7 +-- ...ationGraphEndpointWebIntegrationTests.java | 2 +- .../IntegrationAutoConfiguration.java | 8 --- .../IntegrationAutoConfigurationTests.java | 3 -- .../asciidoc/production-ready-features.adoc | 4 +- 11 files changed, 64 insertions(+), 63 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/integrationgraph.adoc b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/integrationgraph.adoc index fd5d8f4a8a..8d0e3a19cc 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/integrationgraph.adoc +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/asciidoc/endpoints/integrationgraph.adoc @@ -1,7 +1,8 @@ [[integrationgraph]] = Spring Integration graph (`integrationgraph`) -The `integrationgraph` endpoint exposes a graph containing all Spring Integration components. +The `integrationgraph` endpoint exposes a graph containing all Spring Integration +components. @@ -22,16 +23,18 @@ include::{snippets}integrationgraph/graph/http-response.adoc[] [[integrationgraph-retrieving-response-structure]] === Response Structure -The response contains all Spring Integration components used within the application, as well as the links between them. -More information about the structure can be found in the https://docs.spring.io/spring-integration/reference/html/system-management-chapter.html#integration-graph[subchapter] for the integration graph in the reference documentation of Spring Integration. +The response contains all Spring Integration components used within the application, as +well as the links between them. More information about the structure can be found in the +https://docs.spring.io/spring-integration/reference/html/system-management-chapter.html#integration-graph[reference +documentation]. [[integrationgraph-rebuilding]] == Rebuilding the Spring Integration graph -To rebuild the exposed graph, make a `POST` request to -`/actuator/integrationgraph`, as shown in the following curl-based example: +To rebuild the exposed graph, make a `POST` request to `/actuator/integrationgraph`, as +shown in the following curl-based example: include::{snippets}integrationgraph/rebuild/curl-request.adoc[] diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/integration/IntegrationGraphEndpointAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/integration/IntegrationGraphEndpointAutoConfiguration.java index 4bf6ea4560..ddc838a6bc 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/integration/IntegrationGraphEndpointAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/integration/IntegrationGraphEndpointAutoConfiguration.java @@ -18,26 +18,31 @@ package org.springframework.boot.actuate.autoconfigure.integration; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.integration.IntegrationGraphEndpoint; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.integration.support.channel.HeaderChannelRegistry; import org.springframework.integration.support.management.graph.IntegrationGraphServer; /** * {@link EnableAutoConfiguration Auto-configuration} for the {@link IntegrationGraphEndpoint}. * * @author Tim Ysewyn + * @author Stephane Nicoll * @since 2.1.0 */ @Configuration @ConditionalOnClass(IntegrationGraphServer.class) +@ConditionalOnBean(HeaderChannelRegistry.class) +@AutoConfigureAfter(IntegrationAutoConfiguration.class) public class IntegrationGraphEndpointAutoConfiguration { @Bean - @ConditionalOnBean(IntegrationGraphServer.class) @ConditionalOnMissingBean @ConditionalOnEnabledEndpoint public IntegrationGraphEndpoint integrationGraphEndpoint( @@ -45,5 +50,12 @@ public class IntegrationGraphEndpointAutoConfiguration { return new IntegrationGraphEndpoint(integrationGraphServer); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnEnabledEndpoint(endpoint = IntegrationGraphEndpoint.class) + public IntegrationGraphServer integrationGraphServer() { + return new IntegrationGraphServer(); + } + } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/IntegrationGraphEndpointDocumentationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/IntegrationGraphEndpointDocumentationTests.java index 0ccc5dd153..1e16977b79 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/IntegrationGraphEndpointDocumentationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/documentation/IntegrationGraphEndpointDocumentationTests.java @@ -45,7 +45,8 @@ public class IntegrationGraphEndpointDocumentationTests extends MockMvcEndpointD @Test public void rebuild() throws Exception { - this.mockMvc.perform(post("/actuator/integrationgraph")).andExpect(status().isNoContent()) + this.mockMvc.perform(post("/actuator/integrationgraph")).andExpect(status() + .isNoContent()) .andDo(MockMvcRestDocumentation.document("integrationgraph/rebuild")); } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integration/IntegrationGraphEndpointAutoConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integration/IntegrationGraphEndpointAutoConfigurationTests.java index 7ba5a60c1b..53f5575d19 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integration/IntegrationGraphEndpointAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/integration/IntegrationGraphEndpointAutoConfigurationTests.java @@ -20,9 +20,9 @@ import org.junit.Test; import org.springframework.boot.actuate.integration.IntegrationGraphEndpoint; import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration; +import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.integration.support.management.graph.IntegrationGraphServer; import static org.assertj.core.api.Assertions.assertThat; @@ -31,38 +31,40 @@ import static org.assertj.core.api.Assertions.assertThat; * Tests for {@link IntegrationGraphEndpointAutoConfiguration}. * * @author Tim Ysewyn + * @author Stephane Nicoll */ public class IntegrationGraphEndpointAutoConfigurationTests { - private final ApplicationContextRunner contextRunnerWithoutIntegrationGraph = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(IntegrationGraphEndpointAutoConfiguration.class)); - - private final ApplicationContextRunner contextRunnerWithIntegrationGraph = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(IntegrationGraphEndpointAutoConfiguration.class)) - .withUserConfiguration(TestConfiguration.class); + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(JmxAutoConfiguration.class, + IntegrationAutoConfiguration.class, + IntegrationGraphEndpointAutoConfiguration.class)); @Test - public void runShouldNotHaveEndpointBean() { - this.contextRunnerWithoutIntegrationGraph.run((context) -> assertThat(context).doesNotHaveBean(IntegrationGraphEndpoint.class)); - this.contextRunnerWithoutIntegrationGraph.withPropertyValues("management.endpoint.integrationgraph.enabled:true") - .run((context) -> assertThat(context).doesNotHaveBean(IntegrationGraphEndpoint.class)); - this.contextRunnerWithIntegrationGraph.run((context) -> assertThat(context).doesNotHaveBean(IntegrationGraphEndpoint.class)); + public void runShouldHaveEndpointBean() { + this.contextRunner.run((context) -> assertThat(context) + .hasSingleBean(IntegrationGraphEndpoint.class)); } @Test - public void runWhenEnabledPropertyIsTrueShouldHaveEndpointBean() { - this.contextRunnerWithIntegrationGraph.withPropertyValues("management.endpoint.integrationgraph.enabled:true") - .run((context) -> assertThat(context).hasSingleBean(IntegrationGraphEndpoint.class)); + public void runWhenEnabledPropertyIsFalseShouldNotHaveEndpointBean() { + this.contextRunner + .withPropertyValues("management.endpoint.integrationgraph.enabled:false") + .run((context) -> { + assertThat(context).doesNotHaveBean(IntegrationGraphEndpoint.class); + assertThat(context).doesNotHaveBean(IntegrationGraphServer.class); + }); } - @Configuration - public static class TestConfiguration { - - @Bean - public IntegrationGraphServer integrationGraphServer() { - return new IntegrationGraphServer(); - } - + @Test + public void runWhenSpringIntegrationIsNotEnabledShouldNotHaveEndpointBean() { + ApplicationContextRunner noSiRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of( + IntegrationGraphEndpointAutoConfiguration.class)); + noSiRunner.run((context) -> { + assertThat(context).doesNotHaveBean(IntegrationGraphEndpoint.class); + assertThat(context).doesNotHaveBean(IntegrationGraphServer.class); + }); } } diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpoint.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpoint.java index 7eb8d5aad9..f2e034e873 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpoint.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpoint.java @@ -28,31 +28,28 @@ import org.springframework.integration.support.management.graph.IntegrationGraph * @author Tim Ysewyn * @since 2.1.0 */ -@Endpoint(id = "integrationgraph", enableByDefault = false) +@Endpoint(id = "integrationgraph") public class IntegrationGraphEndpoint { - private final IntegrationGraphServer integrationGraphServer; + private final IntegrationGraphServer graphServer; /** - * Creates a new {@code IntegrationGraphEndpoint} that exposes a graph containing all the - * Spring Integration components in the given {@code integrationGraphServer}. - * - * @param integrationGraphServer the integration graph server - * @see IntegrationGraphServer + * Create a new {@code IntegrationGraphEndpoint} that exposes a graph containing all + * the Spring Integration components in the given {@link IntegrationGraphServer}. + * @param graphServer the integration graph server */ - public IntegrationGraphEndpoint(IntegrationGraphServer integrationGraphServer) { - this.integrationGraphServer = integrationGraphServer; + public IntegrationGraphEndpoint(IntegrationGraphServer graphServer) { + this.graphServer = graphServer; } @ReadOperation public Graph graph() { - return this.integrationGraphServer.getGraph(); + return this.graphServer.getGraph(); } - @WriteOperation public void rebuild() { - this.integrationGraphServer.rebuild(); + this.graphServer.rebuild(); } } diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/integration/package-info.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/integration/package-info.java index 6801a40a58..f42d84d3f1 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/integration/package-info.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/integration/package-info.java @@ -15,6 +15,6 @@ */ /** - * Actuator support relating to Spring Integration. + * Actuator support for Spring Integration. */ package org.springframework.boot.actuate.integration; diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpointTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpointTests.java index a50ac5e867..d4f5808ae5 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpointTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpointTests.java @@ -49,21 +49,18 @@ public class IntegrationGraphEndpointTests { } @Test - public void shouldReturnGraph() { + public void readOperationShouldReturnGraph() { Graph mockedGraph = mock(Graph.class); when(this.integrationGraphServer.getGraph()).thenReturn(mockedGraph); Graph graph = this.integrationGraphEndpoint.graph(); - verify(this.integrationGraphServer).getGraph(); - assertThat(graph).isEqualTo(mockedGraph); } @Test - public void shouldRebuildGraph() { + public void writeOperationShouldRebuildGraph() { this.integrationGraphEndpoint.rebuild(); - verify(this.integrationGraphServer).rebuild(); } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpointWebIntegrationTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpointWebIntegrationTests.java index dcfbd39347..9fc6fe2103 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpointWebIntegrationTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/integration/IntegrationGraphEndpointWebIntegrationTests.java @@ -41,7 +41,7 @@ public class IntegrationGraphEndpointWebIntegrationTests { public void graph() { client.get().uri("/actuator/integrationgraph").accept(MediaType.APPLICATION_JSON).exchange() .expectStatus().isOk().expectBody() - .jsonPath("contentDescriptor.providerVersion").isEqualTo("5.0.3.RELEASE") + .jsonPath("contentDescriptor.providerVersion").isNotEmpty() .jsonPath("contentDescriptor.providerFormatVersion").isEqualTo(1.0f) .jsonPath("contentDescriptor.provider").isEqualTo("spring-integration"); } 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 4de51998d5..016c3fa0d6 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 @@ -43,7 +43,6 @@ import org.springframework.integration.jdbc.store.JdbcMessageStore; import org.springframework.integration.jmx.config.EnableIntegrationMBeanExport; import org.springframework.integration.monitor.IntegrationMBeanExporter; import org.springframework.integration.support.management.IntegrationManagementConfigurer; -import org.springframework.integration.support.management.graph.IntegrationGraphServer; import org.springframework.util.StringUtils; /** @@ -55,7 +54,6 @@ import org.springframework.util.StringUtils; * @author Stephane Nicoll * @author Vedran Pavic * @author Madhura Bhave - * @author Tim Ysewyn * @since 1.1.0 */ @Configuration @@ -71,12 +69,6 @@ public class IntegrationAutoConfiguration { @EnableIntegration protected static class IntegrationConfiguration { - @Bean - @ConditionalOnMissingBean - public IntegrationGraphServer integrationGraphServer() { - return new IntegrationGraphServer(); - } - } /** 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 ab9ee920ea..9bc0518bbe 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 @@ -42,7 +42,6 @@ import org.springframework.integration.gateway.RequestReplyExchanger; import org.springframework.integration.handler.MessageProcessor; import org.springframework.integration.support.channel.HeaderChannelRegistry; import org.springframework.integration.support.management.IntegrationManagementConfigurer; -import org.springframework.integration.support.management.graph.IntegrationGraphServer; import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jmx.export.MBeanExporter; @@ -56,7 +55,6 @@ import static org.mockito.Mockito.mock; * @author Artem Bilan * @author Stephane Nicoll * @author Vedran Pavic - * @author Tim Ysewyn */ public class IntegrationAutoConfigurationTests { @@ -70,7 +68,6 @@ public class IntegrationAutoConfigurationTests { @Test public void integrationIsAvailable() { this.contextRunner.run((context) -> { - assertThat(context).hasSingleBean(IntegrationGraphServer.class); assertThat(context).hasSingleBean(TestGateway.class); assertThat(context) .hasSingleBean(IntegrationComponentScanAutoConfiguration.class); diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc index eb68a5932f..bf290b5619 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc @@ -106,8 +106,8 @@ exchanges). |Yes |`integrationgraph` -|Exposes the Spring Integration graph. -|No +|Shows the Spring Integration graph. +|Yes |`loggers` |Shows and modifies the configuration of loggers in the application.