This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 635b1dc CAMEL-17839: camel-health - Add CHECK.KIND when invoking a health-check so we know if its a readiness or liveness check being executed. This is needed for checks that support boths but need to react differently. 635b1dc is described below commit 635b1dc28409f7adf0237846c18dd70b5e043cc5 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Tue Mar 22 15:16:14 2022 +0100 CAMEL-17839: camel-health - Add CHECK.KIND when invoking a health-check so we know if its a readiness or liveness check being executed. This is needed for checks that support boths but need to react differently. --- .../java/org/apache/camel/health/HealthCheck.java | 7 +++ .../org/apache/camel/health/HealthCheckHelper.java | 8 ++-- .../impl/health/ReadinessAndLivenessTest.java | 53 ++++++++++++++++++++++ .../camel/impl/health/AbstractHealthCheck.java | 8 +++- .../support/ScheduledPollConsumerHealthCheck.java | 4 ++ 5 files changed, 75 insertions(+), 5 deletions(-) diff --git a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheck.java b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheck.java index 958e5b6..8e26501 100644 --- a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheck.java +++ b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheck.java @@ -31,6 +31,7 @@ public interface HealthCheck extends HasGroup, HasId, Ordered { String CHECK_ID = "check.id"; String CHECK_GROUP = "check.group"; + String CHECK_KIND = "check.kind"; String CHECK_ENABLED = "check.enabled"; String INVOCATION_COUNT = "invocation.count"; String INVOCATION_TIME = "invocation.time"; @@ -52,6 +53,12 @@ public interface HealthCheck extends HasGroup, HasId, Ordered { UNKNOWN } + enum Kind { + READINESS, + LIVENESS, + ALL, + } + @Override default int getOrder() { return Ordered.LOWEST; diff --git a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckHelper.java b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckHelper.java index b300a4b..ba5c28d 100644 --- a/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckHelper.java +++ b/core/camel-api/src/main/java/org/apache/camel/health/HealthCheckHelper.java @@ -48,21 +48,23 @@ public final class HealthCheckHelper { * Invokes the checks and returns a collection of results. */ public static Collection<HealthCheck.Result> invoke(CamelContext camelContext) { - return invoke(camelContext, check -> Collections.emptyMap(), check -> false); + return invoke(camelContext, check -> Map.of(HealthCheck.CHECK_KIND, HealthCheck.Kind.ALL), check -> false); } /** * Invokes the readiness checks and returns a collection of results. */ public static Collection<HealthCheck.Result> invokeReadiness(CamelContext camelContext) { - return invoke(camelContext, check -> Collections.emptyMap(), check -> !check.isReadiness()); + return invoke(camelContext, check -> Map.of(HealthCheck.CHECK_KIND, HealthCheck.Kind.READINESS), + check -> !check.isReadiness()); } /** * Invokes the liveness checks and returns a collection of results. */ public static Collection<HealthCheck.Result> invokeLiveness(CamelContext camelContext) { - return invoke(camelContext, check -> Collections.emptyMap(), check -> !check.isLiveness()); + return invoke(camelContext, check -> Map.of(HealthCheck.CHECK_KIND, HealthCheck.Kind.LIVENESS), + check -> !check.isLiveness()); } /** diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/health/ReadinessAndLivenessTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/health/ReadinessAndLivenessTest.java index 8a44ca1..9ddf874 100644 --- a/core/camel-core/src/test/java/org/apache/camel/impl/health/ReadinessAndLivenessTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/impl/health/ReadinessAndLivenessTest.java @@ -69,6 +69,40 @@ public class ReadinessAndLivenessTest { assertTrue(result.getCheck() instanceof MyLiveCheck); } + @Test + public void testAll() throws Exception { + CamelContext context = new DefaultCamelContext(); + + HealthCheckRegistry registry = new DefaultHealthCheckRegistry(); + registry.setCamelContext(context); + + context.getRegistry().bind("check1", new MyAllCheck("G1", "1")); + + context.start(); + registry.start(); + + List<HealthCheck> checks = registry.stream().collect(Collectors.toList()); + assertEquals(1, checks.size()); + + Collection<HealthCheck.Result> results = HealthCheckHelper.invokeReadiness(context); + assertEquals(1, results.size()); + HealthCheck.Result result = results.iterator().next(); + assertEquals(HealthCheck.State.DOWN, result.getState()); + assertEquals("READINESS", result.getMessage().get()); + assertTrue(result.getCheck().isLiveness()); + assertTrue(result.getCheck().isReadiness()); + assertTrue(result.getCheck() instanceof MyAllCheck); + + results = HealthCheckHelper.invokeLiveness(context); + assertEquals(1, results.size()); + result = results.iterator().next(); + assertEquals(HealthCheck.State.UP, result.getState()); + assertTrue(result.getCheck().isLiveness()); + assertTrue(result.getCheck().isReadiness()); + assertEquals("LIVENESS", result.getMessage().get()); + assertTrue(result.getCheck() instanceof MyAllCheck); + } + private static class MyReadyCheck extends AbstractHealthCheck implements CamelContextAware { protected MyReadyCheck(String group, String id) { @@ -104,4 +138,23 @@ public class ReadinessAndLivenessTest { } } + + private static class MyAllCheck extends AbstractHealthCheck implements CamelContextAware { + + protected MyAllCheck(String group, String id) { + super(group, id); + } + + @Override + public void doCall(HealthCheckResultBuilder builder, Map<String, Object> options) { + String k = options.get(HealthCheck.CHECK_KIND).toString(); + builder.message(k); + if ("READINESS".equals(k)) { + builder.down(); + } else { + builder.up(); + } + } + + } } diff --git a/core/camel-health/src/main/java/org/apache/camel/impl/health/AbstractHealthCheck.java b/core/camel-health/src/main/java/org/apache/camel/impl/health/AbstractHealthCheck.java index 860a371..44616e6 100644 --- a/core/camel-health/src/main/java/org/apache/camel/impl/health/AbstractHealthCheck.java +++ b/core/camel-health/src/main/java/org/apache/camel/impl/health/AbstractHealthCheck.java @@ -128,6 +128,10 @@ public abstract class AbstractHealthCheck implements HealthCheck, CamelContextAw protected HealthCheckResultBuilder doCall(Map<String, Object> options) { final HealthCheckResultBuilder builder = HealthCheckResultBuilder.on(this); + // what kind of check is this + HealthCheck.Kind kind = (Kind) options.getOrDefault(CHECK_KIND, Kind.ALL); + builder.detail(CHECK_KIND, kind.name()); + // Extract relevant information from meta data. int invocationCount = (Integer) meta.getOrDefault(INVOCATION_COUNT, 0); int failureCount = (Integer) meta.getOrDefault(FAILURE_COUNT, 0); @@ -139,14 +143,14 @@ public abstract class AbstractHealthCheck implements HealthCheck, CamelContextAw meta.put(INVOCATION_ATTEMPT_TIME, invocationTime); if (!isEnabled()) { - LOG.debug("health-check {}/{} disabled", getGroup(), getId()); + LOG.debug("health-check ({}) {}/{} disabled", kind, getGroup(), getId()); builder.message("Disabled"); builder.detail(CHECK_ENABLED, false); builder.unknown(); return builder; } - LOG.debug("Invoke health-check {}/{}", getGroup(), getId()); + LOG.debug("Invoke health-check ({}) {}/{}", kind, getGroup(), getId()); doCall(builder, options); if (builder.state() == null) { diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumerHealthCheck.java b/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumerHealthCheck.java index 5f5129e..18111cf 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumerHealthCheck.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/ScheduledPollConsumerHealthCheck.java @@ -55,6 +55,10 @@ public class ScheduledPollConsumerHealthCheck implements HealthCheck { public Result call(Map<String, Object> options) { final HealthCheckResultBuilder builder = HealthCheckResultBuilder.on(this); + // what kind of check is this + HealthCheck.Kind kind = (Kind) options.getOrDefault(CHECK_KIND, Kind.ALL); + builder.detail(CHECK_KIND, kind.name()); + // ensure to sanitize uri, so we do not show sensitive information such as passwords builder.detail(ENDPOINT_URI, sanitizedUri); builder.detail(FAILURE_ENDPOINT_URI, sanitizedUri);