You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/03/22 14:18:53 UTC
[camel] branch main updated: 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.
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 <cl...@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);