This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new dc6caa6 CAMEL-12460 Fix camel actuator endpoints to get it working with SB2 (#2307) dc6caa6 is described below commit dc6caa696255240a2a27c3bf229fc3aac9014401 Author: Tomohisa Igarashi <tm.igara...@gmail.com> AuthorDate: Thu Apr 26 09:12:19 2018 -0400 CAMEL-12460 Fix camel actuator endpoints to get it working with SB2 (#2307) * CAMEL-12460 Fix camel actuator endpoints to get it working with SB2 Also extracted CamelRoutesEndpointProperties as a separated class from CamelRoutesEndpoint * CAMEL-12460 Update camel-archetype-spring-boot to align with SB2 Reflected review comments: * Updated actuator properties in archetype template to get working with SB2 * Added a comment on the -parameter javac option that it's required for SB2 actuator endpoint --- .../main/resources/archetype-resources/readme.adoc | 4 +-- .../src/main/resources/application.properties | 9 ++++-- .../boot/actuate/endpoint/CamelRoutesEndpoint.java | 21 +++++-------- .../CamelRoutesEndpointAutoConfiguration.java | 12 +++++++- .../endpoint/CamelRoutesEndpointProperties.java | 34 ++++++++++++++++++++++ .../additional-spring-configuration-metadata.json | 8 +---- .../pom.xml | 2 +- .../readme.adoc | 10 +++---- .../src/main/resources/application.properties | 4 ++- examples/camel-example-spring-boot/readme.adoc | 4 +-- .../src/main/resources/application.properties | 4 +++ parent/pom.xml | 6 ++++ 12 files changed, 82 insertions(+), 36 deletions(-) diff --git a/archetypes/camel-archetype-spring-boot/src/main/resources/archetype-resources/readme.adoc b/archetypes/camel-archetype-spring-boot/src/main/resources/archetype-resources/readme.adoc index 310c8fb..1fc8d6d 100644 --- a/archetypes/camel-archetype-spring-boot/src/main/resources/archetype-resources/readme.adoc +++ b/archetypes/camel-archetype-spring-boot/src/main/resources/archetype-resources/readme.adoc @@ -26,13 +26,13 @@ You can run this example using To show a summary of all the routes ---- -curl -XGET -s http://localhost:8080/camel/routes +curl -XGET -s http://localhost:8080/camelroutes ---- To show detailed information for a specific route ---- -curl -XGET -s http://localhost:8080/camel/routes/{id}/info +curl -XGET -s http://localhost:8080/camelroutes/{id}/detail ---- diff --git a/archetypes/camel-archetype-spring-boot/src/main/resources/archetype-resources/src/main/resources/application.properties b/archetypes/camel-archetype-spring-boot/src/main/resources/archetype-resources/src/main/resources/application.properties index 34397fc..24b20c1 100644 --- a/archetypes/camel-archetype-spring-boot/src/main/resources/archetype-resources/src/main/resources/application.properties +++ b/archetypes/camel-archetype-spring-boot/src/main/resources/archetype-resources/src/main/resources/application.properties @@ -31,14 +31,17 @@ timer.period = 2000 # add for example: &repeatCount=5 to the timer endpoint to make Camel idle #camel.springboot.duration-max-idle-seconds=15 +# expose actuator endpoint via HTTP +management.endpoints.web.exposure.include=info,health,camelroutes + # all access to actuator endpoints without security management.security.enabled = false # turn on actuator health check -endpoints.health.enabled = true +management.endpoint.health.enabled = true # allow to obtain basic information about camel routes (read only mode) -endpoints.camelroutes.enabled = true -endpoints.camelroutes.read-only = true +management.endpoint.camelroutes.enabled = true +management.endpoint.camelroutes.read-only = true # to configure logging levels #logging.level.org.springframework = INFO diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java index e9f8a53..f7978e4 100644 --- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java +++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpoint.java @@ -39,19 +39,20 @@ import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.boot.actuate.endpoint.annotation.Selector; import org.springframework.boot.actuate.endpoint.annotation.WriteOperation; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.lang.Nullable; /** * {@link Endpoint} to expose {@link org.apache.camel.Route} information. */ @Endpoint(id = "camelroutes", enableByDefault = true) -@ConfigurationProperties("management.endpoint.camelroutes") public class CamelRoutesEndpoint { private CamelContext camelContext; - private boolean readOnly = true; + private CamelRoutesEndpointProperties properties; - public CamelRoutesEndpoint(CamelContext camelContext) { + public CamelRoutesEndpoint(CamelContext camelContext, CamelRoutesEndpointProperties properties) { this.camelContext = camelContext; + this.properties = properties; } @ReadOperation @@ -72,8 +73,8 @@ public class CamelRoutesEndpoint { } @WriteOperation - public void doWriteAction(@Selector String id, @Selector WriteAction action, TimeInfo timeInfo) { - if (this.isReadOnly()) { + public void doWriteAction(@Selector String id, @Selector WriteAction action, @Nullable TimeInfo timeInfo) { + if (this.properties.isReadOnly()) { throw new IllegalArgumentException(String.format("Read only: write action %s is not allowed", action)); } @@ -106,7 +107,7 @@ public class CamelRoutesEndpoint { @WriteOperation public String getRouteDump(@Selector String id) { - if (this.isReadOnly()) { + if (this.properties.isReadOnly()) { throw new IllegalArgumentException("Read only: route dump is not permitted in read-only mode"); } @@ -121,14 +122,6 @@ public class CamelRoutesEndpoint { return null; } - public boolean isReadOnly() { - return readOnly; - } - - public void setReadOnly(boolean readOnly) { - this.readOnly = readOnly; - } - private RouteEndpointInfo getRouteInfo(String id) { Route route = camelContext.getRoute(id); if (route != null) { diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpointAutoConfiguration.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpointAutoConfiguration.java index 5b44269..8a2ccda 100644 --- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpointAutoConfiguration.java +++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpointAutoConfiguration.java @@ -18,11 +18,14 @@ package org.apache.camel.spring.boot.actuate.endpoint; import org.apache.camel.CamelContext; import org.apache.camel.spring.boot.CamelAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; 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.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,17 +33,24 @@ import org.springframework.context.annotation.Configuration; * Auto configuration for the {@link CamelRoutesEndpoint}. */ @Configuration +@EnableConfigurationProperties({ CamelRoutesEndpointProperties.class }) @ConditionalOnClass({CamelRoutesEndpoint.class}) @ConditionalOnBean(CamelAutoConfiguration.class) @AutoConfigureAfter(CamelAutoConfiguration.class) public class CamelRoutesEndpointAutoConfiguration { + private CamelRoutesEndpointProperties properties; + + public CamelRoutesEndpointAutoConfiguration(CamelRoutesEndpointProperties properties) { + this.properties = properties; + } + @Bean @ConditionalOnClass(CamelContext.class) @ConditionalOnMissingBean @ConditionalOnEnabledEndpoint public CamelRoutesEndpoint camelEndpoint(CamelContext camelContext) { - return new CamelRoutesEndpoint(camelContext); + return new CamelRoutesEndpoint(camelContext, properties); } } diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpointProperties.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpointProperties.java new file mode 100644 index 0000000..a5a18d1 --- /dev/null +++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/actuate/endpoint/CamelRoutesEndpointProperties.java @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.camel.spring.boot.actuate.endpoint; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties("management.endpoint.camelroutes") +public class CamelRoutesEndpointProperties { + + private boolean readOnly = true; + + public boolean isReadOnly() { + return readOnly; + } + + public void setReadOnly(boolean readOnly) { + this.readOnly = readOnly; + } + +} diff --git a/components/camel-spring-boot/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/components/camel-spring-boot/src/main/resources/META-INF/additional-spring-configuration-metadata.json index e756628..cf56bd1 100644 --- a/components/camel-spring-boot/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/components/camel-spring-boot/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -1,16 +1,10 @@ { "properties": [ { - "name": "management.endpoint.camelroutes.path", - "type": "java.lang.String", - "description": "The URL path to use for Camel Routes actuator endpoint.", - "defaultValue": "/camel/routes" - }, - { "name": "management.endpoint.camelroutes.read-only", "type": "java.lang.Boolean", "description": "Whether Camel Routes actuator is in read-only mode. If not in read-only mode then operations to start/stop routes would be enabled.", - "defaultValue": "true" + "defaultValue": true }, { "name": "management.endpoint.camelroutes.enabled", diff --git a/examples/camel-example-spring-boot-supervising-route-controller/pom.xml b/examples/camel-example-spring-boot-supervising-route-controller/pom.xml index 11b7ec9..c00d489 100644 --- a/examples/camel-example-spring-boot-supervising-route-controller/pom.xml +++ b/examples/camel-example-spring-boot-supervising-route-controller/pom.xml @@ -85,7 +85,7 @@ </dependency> <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-actuator</artifactId> + <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> diff --git a/examples/camel-example-spring-boot-supervising-route-controller/readme.adoc b/examples/camel-example-spring-boot-supervising-route-controller/readme.adoc index 8c7bb28..2c5aa35 100644 --- a/examples/camel-example-spring-boot-supervising-route-controller/readme.adoc +++ b/examples/camel-example-spring-boot-supervising-route-controller/readme.adoc @@ -14,35 +14,35 @@ Beside JMX you can use Spring Boot Endpoints to interact with the routes: + [source] ---- -curl -XGET -s http://localhost:8080/camel/routes +curl -XGET -s http://localhost:8080/actuator/camelroutes ---- + +* To get details about a route ++ +[source] +---- -+curl -XGET -s http://localhost:8080/camel/routes/{id}/detail ++curl -XGET -s http://localhost:8080/actuator/camelroutes/{id}/detail +---- * To get info about a route + [source] ---- -curl -XGET -s http://localhost:8080/camel/routes/{id}/info +curl -XGET -s http://localhost:8080/actuator/camelroutes/{id}/info ---- * To stop a route + [source] ---- -curl -XPOST -s http://localhost:8080/camel/routes/{id}/stop +curl -XPOST -H "Content-Type: application/json" -s http://localhost:8080/actuator/camelroutes/{id}/stop ---- * To start a route + [source] ---- -curl -XPOST -s http://localhost:8080/camel/routes/{id}/stop +curl -XPOST -H "Content-Type: application/json" -s http://localhost:8080/actuator/camelroutes/{id}/start ---- diff --git a/examples/camel-example-spring-boot-supervising-route-controller/src/main/resources/application.properties b/examples/camel-example-spring-boot-supervising-route-controller/src/main/resources/application.properties index e19589a..63741bd 100644 --- a/examples/camel-example-spring-boot-supervising-route-controller/src/main/resources/application.properties +++ b/examples/camel-example-spring-boot-supervising-route-controller/src/main/resources/application.properties @@ -24,13 +24,15 @@ logging.level.org.apache.camel.impl.SupervisingRouteController = DEBUG logging.level.org.apache.camel.util.backoff = DEBUG logging.level.sample.camel = DEBUG +# expose actuator endpoint via HTTP +management.endpoints.web.exposure.include=info,health,camelroutes + management.endpoints.enabled-by-default = true management.endpoints.jmx.enabled = false management.endpoint.health.enabled = true # camel routes is by default enabled # so you do not have to configure below -# management.endpoint.camelroutes.path = /camel/routes # management.endpoint.camelroutes.enabled = true # turn off read-only so we can stop/start the Camel routes diff --git a/examples/camel-example-spring-boot/readme.adoc b/examples/camel-example-spring-boot/readme.adoc index ca38462..7e5d7f0 100644 --- a/examples/camel-example-spring-boot/readme.adoc +++ b/examples/camel-example-spring-boot/readme.adoc @@ -34,13 +34,13 @@ curl -XGET -s http://localhost:8080/actuator/health To show a summary of all the routes ---- -curl -XGET -s http://localhost:8080/actuator/camel/routes +curl -XGET -s http://localhost:8080/actuator/camelroutes ---- To show detailed information for a specific route ---- -curl -XGET -s http://localhost:8080/actuator/camel/routes/{id}/info +curl -XGET -s http://localhost:8080/actuator/camelroutes/{id}/detail ---- diff --git a/examples/camel-example-spring-boot/src/main/resources/application.properties b/examples/camel-example-spring-boot/src/main/resources/application.properties index cefe0da..0c5cc55 100644 --- a/examples/camel-example-spring-boot/src/main/resources/application.properties +++ b/examples/camel-example-spring-boot/src/main/resources/application.properties @@ -31,6 +31,9 @@ timer.period = 2000 # add for example: &repeatCount=5 to the timer endpoint to make Camel idle #camel.springboot.duration-max-idle-seconds=15 +# expose actuator endpoint via HTTP +management.endpoints.web.exposure.include=info,health,camelroutes + # show verbose health details (/actuator/info) so you can see Camel information also management.endpoint.health.show-details=always @@ -46,3 +49,4 @@ management.endpoint.camelroutes.read-only = true #logging.level.org.apache.camel.spring.boot = INFO #logging.level.org.apache.camel.impl = DEBUG #logging.level.sample.camel = DEBUG + diff --git a/parent/pom.xml b/parent/pom.xml index 36341a8..7a9a2f4 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -5009,6 +5009,10 @@ <target>${jdk.version}</target> <maxmem>512M</maxmem> <fork>${compiler.fork}</fork> + <compilerArgs> + <!-- SB2 actuator endpoint requires MethodParameter metadata --> + <arg>-parameters</arg> + </compilerArgs> </configuration> </plugin> <plugin> @@ -5687,6 +5691,8 @@ <compilerArgs> <arg>-J--add-modules</arg> <arg>-Jjava.xml.bind</arg> + <!-- SB2 actuator endpoint requires MethodParameter metadata --> + <arg>-parameters</arg> </compilerArgs> </configuration> </plugin> -- To stop receiving notification emails like this one, please contact davscl...@apache.org.