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
commit 2767db3a5d66c08eb392564935fd320ed9ab7fdb Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri May 29 10:57:11 2020 +0200 CAMLE-15126: Make health-check able to resolve from classpath. And make a health check implementation by default enabled (was a bit awkward to both register and have to enable it afterwards). --- .../camel/health/HealthCheckConfiguration.java | 2 +- .../apache/camel/health/HealthCheckRegistry.java | 10 +++++ .../services/org/apache/camel/context-health-check | 2 + .../camel/impl/health/ContextHealthCheck.java | 2 + .../impl/health/DefaultHealthCheckRegistry.java | 44 +++++++++++----------- .../health/DefaultHealthCheckRegistryTest.java | 36 ++++++++++++++++-- .../apache/camel/impl/health/HealthCheckTest.java | 2 + .../camel/management/ManagedHealthCheckTest.java | 18 +++++++++ 8 files changed, 91 insertions(+), 25 deletions(-) diff --git a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java index 91b4e35..8289dd6 100644 --- a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java +++ b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckConfiguration.java @@ -23,7 +23,7 @@ import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.TimeUtils; public class HealthCheckConfiguration implements Cloneable { - public static final Boolean DEFAULT_VALUE_ENABLED = Boolean.FALSE; + public static final Boolean DEFAULT_VALUE_ENABLED = Boolean.TRUE; public static final Duration DEFAULT_VALUE_INTERVAL = Duration.ZERO; public static final Integer DEFAULT_VALUE_FAILURE_THRESHOLD = 0; diff --git a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java index e20b784..e7998e7 100644 --- a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java +++ b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckRegistry.java @@ -39,6 +39,16 @@ public interface HealthCheckRegistry extends HealthCheckRepository, CamelContext String FACTORY = "health-check-registry"; /** + * Resolves {@link HealthCheck} by id. + * + * Will first lookup in this {@link HealthCheckRegistry} and then {@link org.apache.camel.spi.Registry}, + * and lastly do classpath scanning via {@link org.apache.camel.spi.annotations.ServiceFactory}. + * The classpath scanning is attempted first with id-health-check as the key, and then with id as fallback + * if not found the first time. + */ + HealthCheck resolveHealthCheckById(String id); + + /** * Registers a service {@link HealthCheck}. */ boolean register(HealthCheck check); diff --git a/core/camel-health/src/generated/resources/META-INF/services/org/apache/camel/context-health-check b/core/camel-health/src/generated/resources/META-INF/services/org/apache/camel/context-health-check new file mode 100644 index 0000000..5413a66 --- /dev/null +++ b/core/camel-health/src/generated/resources/META-INF/services/org/apache/camel/context-health-check @@ -0,0 +1,2 @@ +# Generated by camel build tools - do NOT edit this file! +class=org.apache.camel.impl.health.ContextHealthCheck diff --git a/core/camel-health/src/main/java/org/apache/camel/impl/health/ContextHealthCheck.java b/core/camel-health/src/main/java/org/apache/camel/impl/health/ContextHealthCheck.java index 764073b..52b26fe 100644 --- a/core/camel-health/src/main/java/org/apache/camel/impl/health/ContextHealthCheck.java +++ b/core/camel-health/src/main/java/org/apache/camel/impl/health/ContextHealthCheck.java @@ -21,11 +21,13 @@ import java.util.Map; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; import org.apache.camel.health.HealthCheckResultBuilder; +import org.apache.camel.spi.annotations.JdkService; /** * {@link org.apache.camel.health.HealthCheck} that checks the status of the {@link CamelContext} whether * its started or not. */ +@JdkService("context-health-check") public final class ContextHealthCheck extends AbstractHealthCheck implements CamelContextAware { private CamelContext camelContext; diff --git a/core/camel-health/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java b/core/camel-health/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java index 8c91095..81750e4 100644 --- a/core/camel-health/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java +++ b/core/camel-health/src/main/java/org/apache/camel/impl/health/DefaultHealthCheckRegistry.java @@ -24,10 +24,11 @@ import java.util.stream.Stream; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; +import org.apache.camel.ExtendedCamelContext; import org.apache.camel.health.HealthCheck; -import org.apache.camel.health.HealthCheckConfiguration; import org.apache.camel.health.HealthCheckRegistry; import org.apache.camel.health.HealthCheckRepository; +import org.apache.camel.spi.FactoryFinder; import org.apache.camel.spi.annotations.JdkService; import org.apache.camel.support.service.ServiceSupport; import org.slf4j.Logger; @@ -43,7 +44,6 @@ public class DefaultHealthCheckRegistry extends ServiceSupport implements Health private final Set<HealthCheck> checks; private final Set<HealthCheckRepository> repositories; private CamelContext camelContext; - private boolean includeContextCheck = true; public DefaultHealthCheckRegistry() { this(null); @@ -61,14 +61,6 @@ public class DefaultHealthCheckRegistry extends ServiceSupport implements Health protected void doInit() throws Exception { super.doInit(); - // include the basic context check if not already present - if (checks.stream().noneMatch(ContextHealthCheck.class::isInstance)) { - ContextHealthCheck check = new ContextHealthCheck(); - // and make it enabled - check.setConfiguration(HealthCheckConfiguration.builder().enabled(true).build()); - checks.add(check); - } - for (HealthCheck check : checks) { if (check instanceof CamelContextAware) { ((CamelContextAware) check).setCamelContext(camelContext); @@ -86,17 +78,6 @@ public class DefaultHealthCheckRegistry extends ServiceSupport implements Health // Properties // ************************************ - public boolean isIncludeContextCheck() { - return includeContextCheck; - } - - /** - * Whether to automatic include the basic {@link ContextHealthCheck}. - */ - public void setIncludeContextCheck(boolean includeContextCheck) { - this.includeContextCheck = includeContextCheck; - } - @Override public final void setCamelContext(CamelContext camelContext) { this.camelContext = camelContext; @@ -108,6 +89,27 @@ public class DefaultHealthCheckRegistry extends ServiceSupport implements Health } @Override + @SuppressWarnings("unchecked") + public HealthCheck resolveHealthCheckById(String id) { + HealthCheck answer = + checks.stream().filter(h -> h.getId().equals(id)).findFirst() + .orElse(camelContext.getRegistry().findByTypeWithName(HealthCheck.class).get(id)); + if (answer == null) { + // discover via classpath (try first via -health-check and then id as-is) + FactoryFinder ff = camelContext.adapt(ExtendedCamelContext.class).getDefaultFactoryFinder(); + Class<? extends HealthCheck> clazz = (Class<? extends HealthCheck>) ff.findOptionalClass(id + "-health-check").orElse(null); + if (clazz == null) { + clazz = (Class<? extends HealthCheck>) ff.findOptionalClass(id).orElse(null); + } + if (clazz != null) { + answer = camelContext.getInjector().newInstance(clazz); + } + } + + return answer; + } + + @Override public boolean register(HealthCheck check) { boolean result = checks.add(check); if (result) { diff --git a/core/camel-health/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckRegistryTest.java b/core/camel-health/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckRegistryTest.java index efd6547..0ef6c7e 100644 --- a/core/camel-health/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckRegistryTest.java +++ b/core/camel-health/src/test/java/org/apache/camel/impl/health/DefaultHealthCheckRegistryTest.java @@ -44,7 +44,6 @@ public class DefaultHealthCheckRegistryTest { @Test public void testDefaultHealthCheckRegistry() throws Exception { DefaultHealthCheckRegistry registry = new DefaultHealthCheckRegistry(); - registry.setIncludeContextCheck(false); registry.register(new MyHealthCheck("G1", "1")); registry.register(new MyHealthCheck("G1", "1")); registry.register(new MyHealthCheck("G1", "2")); @@ -65,7 +64,6 @@ public class DefaultHealthCheckRegistryTest { @Test public void testDefaultHealthCheckRegistryWithRepositories() throws Exception { DefaultHealthCheckRegistry registry = new DefaultHealthCheckRegistry(); - registry.setIncludeContextCheck(false); registry.register(new MyHealthCheck("G1", "1")); registry.register(new MyHealthCheck("G1", "1")); @@ -103,7 +101,39 @@ public class DefaultHealthCheckRegistryTest { registry.start(); List<HealthCheck> checks = registry.stream().collect(Collectors.toList()); - // should also include default + Assert.assertEquals(3, checks.size()); + + for (HealthCheck check : checks) { + HealthCheck.Result response = check.call(); + + Assert.assertEquals(HealthCheck.State.UP, response.getState()); + Assert.assertFalse(response.getMessage().isPresent()); + Assert.assertFalse(response.getError().isPresent()); + Assert.assertSame(context, ((CamelContextAware) check).getCamelContext()); + } + } + + @Test + public void testResolveContextHealthCheck() throws Exception { + CamelContext context = new DefaultCamelContext(); + + HealthCheckRegistry registry = new DefaultHealthCheckRegistry(); + registry.setCamelContext(context); + HealthCheck hc = registry.resolveHealthCheckById("context"); + Assert.assertNotNull(hc); + Assert.assertEquals("camel", hc.getGroup()); + Assert.assertEquals("context", hc.getId()); + Assert.assertTrue(hc instanceof ContextHealthCheck); + + registry.register(hc); + registry.register(new MyHealthCheck("G1", "1")); + registry.register(new MyHealthCheck("G1", "2")); + registry.register(new MyHealthCheck("G2", "3")); + + context.start(); + registry.start(); + + List<HealthCheck> checks = registry.stream().collect(Collectors.toList()); Assert.assertEquals(4, checks.size()); for (HealthCheck check : checks) { diff --git a/core/camel-health/src/test/java/org/apache/camel/impl/health/HealthCheckTest.java b/core/camel-health/src/test/java/org/apache/camel/impl/health/HealthCheckTest.java index 923fd03..973d2a1 100644 --- a/core/camel-health/src/test/java/org/apache/camel/impl/health/HealthCheckTest.java +++ b/core/camel-health/src/test/java/org/apache/camel/impl/health/HealthCheckTest.java @@ -29,6 +29,8 @@ public class HealthCheckTest { public void testCheck() throws Exception { MyHealthCheck check = new MyHealthCheck(); check.setState(HealthCheck.State.UP); + // disable + check.getConfiguration().setEnabled(false); HealthCheck.Result result; diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedHealthCheckTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedHealthCheckTest.java index b8d05bb..9f332a7 100644 --- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedHealthCheckTest.java +++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedHealthCheckTest.java @@ -22,11 +22,29 @@ import javax.management.openmbean.TabularData; import java.util.Collection; +import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.health.HealthCheck; +import org.apache.camel.health.HealthCheckRegistry; +import org.apache.camel.impl.health.DefaultHealthCheckRegistry; import org.junit.Test; public class ManagedHealthCheckTest extends ManagementTestSupport { + @Override + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + + // install health check manually + HealthCheckRegistry registry = new DefaultHealthCheckRegistry(); + registry.setCamelContext(context); + HealthCheck hc = registry.resolveHealthCheckById("context"); + registry.register(hc); + context.setExtension(HealthCheckRegistry.class, registry); + + return context; + } + @Test public void testHealthCheck() throws Exception { // JMX tests dont work well on AIX CI servers (hangs them)