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);

Reply via email to