You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2022/03/17 17:49:49 UTC
[camel] branch main updated: CAMEL-17787: Take exposure level configuration into consideration in camel-microprofile-health
This is an automated email from the ASF dual-hosted git repository.
jamesnetherton 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 f86cc72 CAMEL-17787: Take exposure level configuration into consideration in camel-microprofile-health
f86cc72 is described below
commit f86cc7207d024ecbfe699b9139d675ddc6b5515a
Author: James Netherton <ja...@gmail.com>
AuthorDate: Thu Mar 17 15:26:34 2022 +0000
CAMEL-17787: Take exposure level configuration into consideration in camel-microprofile-health
---
.../health/CamelMicroProfileHealthCheck.java | 10 +-
.../CamelMicroProfileHealthCheckRegistry.java | 56 ++--
.../health/CamelMicroProfileHealthHelper.java | 51 ++--
.../CamelMicroProfileRepositoryHealthCheck.java | 9 +-
...CamelMicroProfileHealthCheckRepositoryTest.java | 322 ++++++++++++++++++++-
.../health/CamelMicroProfileHealthCheckTest.java | 127 ++++++++
.../CamelMicroProfileHealthConsumerTest.java | 7 +-
7 files changed, 526 insertions(+), 56 deletions(-)
diff --git a/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheck.java b/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheck.java
index efa22c9..5d8469c 100644
--- a/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheck.java
+++ b/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheck.java
@@ -18,6 +18,8 @@ package org.apache.camel.microprofile.health;
import java.util.Map;
+import org.apache.camel.CamelContext;
+import org.apache.camel.health.HealthCheckRegistry;
import org.apache.camel.impl.health.AbstractHealthCheck;
import org.eclipse.microprofile.health.HealthCheck;
import org.eclipse.microprofile.health.HealthCheckResponse;
@@ -31,9 +33,11 @@ import static org.apache.camel.health.HealthCheck.*;
*/
final class CamelMicroProfileHealthCheck implements HealthCheck {
+ private final CamelContext camelContext;
private final org.apache.camel.health.HealthCheck camelHealthCheck;
- CamelMicroProfileHealthCheck(org.apache.camel.health.HealthCheck camelHealthCheck) {
+ CamelMicroProfileHealthCheck(CamelContext camelContext, org.apache.camel.health.HealthCheck camelHealthCheck) {
+ this.camelContext = camelContext;
this.camelHealthCheck = camelHealthCheck;
}
@@ -52,7 +56,9 @@ final class CamelMicroProfileHealthCheck implements HealthCheck {
}
if (enabled) {
- CamelMicroProfileHealthHelper.applyHealthDetail(builder, result);
+ HealthCheckRegistry registry = HealthCheckRegistry.get(camelContext);
+
+ CamelMicroProfileHealthHelper.applyHealthDetail(builder, result, registry.getExposureLevel());
if (result.getState() == State.DOWN) {
builder.down();
diff --git a/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckRegistry.java b/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckRegistry.java
index a7fcbdd..84e8882 100644
--- a/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckRegistry.java
+++ b/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckRegistry.java
@@ -27,9 +27,8 @@ import org.apache.camel.StartupListener;
import org.apache.camel.health.HealthCheck;
import org.apache.camel.health.HealthCheckRegistry;
import org.apache.camel.health.HealthCheckRepository;
-import org.apache.camel.impl.health.ConsumersHealthCheckRepository;
import org.apache.camel.impl.health.DefaultHealthCheckRegistry;
-import org.apache.camel.impl.health.RoutesHealthCheckRepository;
+import org.apache.camel.impl.health.HealthCheckRegistryRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,8 +38,6 @@ import org.slf4j.LoggerFactory;
*/
public class CamelMicroProfileHealthCheckRegistry extends DefaultHealthCheckRegistry implements StartupListener {
- public static final String CONSUMERS_CHECK_NAME = "camel-consumers";
- public static final String ROUTES_CHECK_NAME = "camel-routes";
private static final Logger LOG = LoggerFactory.getLogger(CamelMicroProfileHealthCheckRegistry.class);
private final Set<HealthCheckRepository> repositories = new CopyOnWriteArraySet<>();
@@ -87,9 +84,18 @@ public class CamelMicroProfileHealthCheckRegistry extends DefaultHealthCheckRegi
removeMicroProfileHealthCheck(check);
} else {
HealthCheckRepository repository = (HealthCheckRepository) obj;
- if (repository instanceof ConsumersHealthCheckRepository || repository instanceof RoutesHealthCheckRepository) {
+ boolean isAllChecksLiveness = repository.stream().allMatch(HealthCheck::isLiveness);
+ boolean isAllChecksReadiness = repository.stream().allMatch(HealthCheck::isReadiness);
+
+ if (!(repository instanceof HealthCheckRegistryRepository) && (isAllChecksLiveness || isAllChecksReadiness)) {
try {
- getReadinessRegistry().remove(repository.getId());
+ if (isAllChecksLiveness) {
+ getLivenessRegistry().remove(repository.getId());
+ }
+
+ if (isAllChecksReadiness) {
+ getReadinessRegistry().remove(repository.getId());
+ }
} catch (IllegalStateException e) {
if (LOG.isDebugEnabled()) {
LOG.debug("Failed to remove repository readiness health {} check due to: {}", repository.getId(),
@@ -121,28 +127,40 @@ public class CamelMicroProfileHealthCheckRegistry extends DefaultHealthCheckRegi
protected void registerRepositoryChecks(HealthCheckRepository repository) {
if (repository.isEnabled()) {
- // Since the number of potential checks for consumers / routes is non-deterministic
- // avoid registering each one with SmallRye health and instead aggregate the results so
- // that we avoid highly verbose health output
- if (repository instanceof ConsumersHealthCheckRepository) {
- CamelMicroProfileRepositoryHealthCheck repositoryHealthCheck
- = new CamelMicroProfileRepositoryHealthCheck(repository, CONSUMERS_CHECK_NAME);
- getReadinessRegistry().register(repository.getId(), repositoryHealthCheck);
- } else if (repository instanceof RoutesHealthCheckRepository) {
- CamelMicroProfileRepositoryHealthCheck repositoryHealthCheck
- = new CamelMicroProfileRepositoryHealthCheck(repository, ROUTES_CHECK_NAME);
- getReadinessRegistry().register(repository.getId(), repositoryHealthCheck);
- } else {
+ boolean isAllChecksLiveness = repository.stream().allMatch(HealthCheck::isLiveness);
+ boolean isAllChecksReadiness = repository.stream().allMatch(HealthCheck::isReadiness);
+
+ if (repository instanceof HealthCheckRegistryRepository || !isAllChecksLiveness && !isAllChecksReadiness) {
+ // Register each check individually for HealthCheckRegistryRepository or where the repository contains
+ // a mix or readiness and liveness checks
repository.stream()
.filter(healthCheck -> healthCheck.isEnabled())
.forEach(this::registerMicroProfileHealthCheck);
+ } else {
+ // Since the number of potential checks for consumers / routes etc is non-deterministic
+ // avoid registering each one with SmallRye health and instead aggregate the results so
+ // that we avoid highly verbose health output
+ String healthCheckName = repository.getId();
+ if (repository.getClass().getName().startsWith("org.apache.camel") && !healthCheckName.startsWith("camel-")) {
+ healthCheckName = "camel-" + healthCheckName;
+ }
+
+ CamelMicroProfileRepositoryHealthCheck repositoryHealthCheck
+ = new CamelMicroProfileRepositoryHealthCheck(getCamelContext(), repository, healthCheckName);
+ if (isAllChecksLiveness) {
+ getLivenessRegistry().register(repository.getId(), repositoryHealthCheck);
+ }
+
+ if (isAllChecksReadiness) {
+ getReadinessRegistry().register(repository.getId(), repositoryHealthCheck);
+ }
}
}
}
protected void registerMicroProfileHealthCheck(HealthCheck camelHealthCheck) {
org.eclipse.microprofile.health.HealthCheck microProfileHealthCheck
- = new CamelMicroProfileHealthCheck(camelHealthCheck);
+ = new CamelMicroProfileHealthCheck(getCamelContext(), camelHealthCheck);
if (camelHealthCheck.isReadiness()) {
getReadinessRegistry().register(camelHealthCheck.getId(), microProfileHealthCheck);
diff --git a/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthHelper.java b/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthHelper.java
index 4571c52..819cbce 100644
--- a/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthHelper.java
+++ b/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthHelper.java
@@ -36,28 +36,35 @@ final class CamelMicroProfileHealthHelper {
/**
* Propagates details from the Camel Health {@link Result} to the MicroProfile {@link HealthCheckResponseBuilder}.
*
- * @param builder The health check response builder
- * @param result The Camel health check result
+ * @param builder The health check response builder
+ * @param result The Camel health check result
+ * @param exposureLevel The level at which to expose details from the health check result
*/
- public static void applyHealthDetail(HealthCheckResponseBuilder builder, Result result) {
- HealthCheck check = result.getCheck();
- Set<String> metaKeys = check.getMetaData().keySet();
-
- result.getDetails().forEach((key, value) -> {
- // Filter health check metadata to have a less verbose output
- if (!metaKeys.contains(key)) {
- builder.withData(key, value.toString());
- }
- });
-
- result.getError().ifPresent(error -> {
- builder.withData("error.message", error.getMessage());
-
- final StringWriter stackTraceWriter = new StringWriter();
- try (final PrintWriter pw = new PrintWriter(stackTraceWriter, true)) {
- error.printStackTrace(pw);
- builder.withData("error.stacktrace", stackTraceWriter.toString());
- }
- });
+ public static void applyHealthDetail(HealthCheckResponseBuilder builder, Result result, String exposureLevel) {
+ if (!exposureLevel.equals("oneline")) {
+ HealthCheck check = result.getCheck();
+ Set<String> metaKeys = check.getMetaData().keySet();
+
+ result.getDetails().forEach((key, value) -> {
+ if (exposureLevel.equals("full")) {
+ builder.withData(key, value.toString());
+ } else {
+ // Filter health check metadata to have a less verbose output
+ if (!metaKeys.contains(key)) {
+ builder.withData(key, value.toString());
+ }
+ }
+ });
+
+ result.getError().ifPresent(error -> {
+ builder.withData("error.message", error.getMessage());
+
+ final StringWriter stackTraceWriter = new StringWriter();
+ try (final PrintWriter pw = new PrintWriter(stackTraceWriter, true)) {
+ error.printStackTrace(pw);
+ builder.withData("error.stacktrace", stackTraceWriter.toString());
+ }
+ });
+ }
}
}
diff --git a/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileRepositoryHealthCheck.java b/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileRepositoryHealthCheck.java
index ef614d5..90700e7 100644
--- a/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileRepositoryHealthCheck.java
+++ b/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileRepositoryHealthCheck.java
@@ -20,8 +20,10 @@ import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
+import org.apache.camel.CamelContext;
import org.apache.camel.health.HealthCheck.Result;
import org.apache.camel.health.HealthCheck.State;
+import org.apache.camel.health.HealthCheckRegistry;
import org.apache.camel.health.HealthCheckRepository;
import org.apache.camel.impl.health.AbstractHealthCheck;
import org.eclipse.microprofile.health.HealthCheck;
@@ -34,10 +36,12 @@ import org.eclipse.microprofile.health.HealthCheckResponseBuilder;
*/
final class CamelMicroProfileRepositoryHealthCheck implements HealthCheck {
+ private final CamelContext camelContext;
private final HealthCheckRepository repository;
private final String name;
- CamelMicroProfileRepositoryHealthCheck(HealthCheckRepository repository, String name) {
+ CamelMicroProfileRepositoryHealthCheck(CamelContext camelContext, HealthCheckRepository repository, String name) {
+ this.camelContext = camelContext;
this.repository = repository;
this.name = name;
}
@@ -56,11 +60,12 @@ final class CamelMicroProfileRepositoryHealthCheck implements HealthCheck {
.collect(Collectors.toList());
// If any of the result statuses is DOWN, find the first one and report any error details
+ HealthCheckRegistry registry = HealthCheckRegistry.get(camelContext);
results.stream()
.filter(result -> result.getState().equals(State.DOWN))
.findFirst()
.ifPresent(result -> {
- CamelMicroProfileHealthHelper.applyHealthDetail(builder, result);
+ CamelMicroProfileHealthHelper.applyHealthDetail(builder, result, registry.getExposureLevel());
builder.down();
});
} else {
diff --git a/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckRepositoryTest.java b/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckRepositoryTest.java
index 41afc21..428639d 100644
--- a/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckRepositoryTest.java
+++ b/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckRepositoryTest.java
@@ -33,7 +33,6 @@ import org.apache.camel.health.HealthCheckRepository;
import org.eclipse.microprofile.health.HealthCheckResponse.Status;
import org.junit.jupiter.api.Test;
-import static org.apache.camel.microprofile.health.CamelMicroProfileHealthCheckRegistry.ROUTES_CHECK_NAME;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CamelMicroProfileHealthCheckRepositoryTest extends CamelMicroProfileHealthTestSupport {
@@ -53,7 +52,7 @@ public class CamelMicroProfileHealthCheckRepositoryTest extends CamelMicroProfil
JsonArray checks = healthObject.getJsonArray("checks");
assertEquals(1, checks.size());
- assertHealthCheckOutput(ROUTES_CHECK_NAME, Status.UP, checks.getJsonObject(0));
+ assertHealthCheckOutput("camel-routes", Status.UP, checks.getJsonObject(0));
}
@Test
@@ -73,7 +72,7 @@ public class CamelMicroProfileHealthCheckRepositoryTest extends CamelMicroProfil
JsonArray checks = healthObject.getJsonArray("checks");
assertEquals(1, checks.size());
- assertHealthCheckOutput(ROUTES_CHECK_NAME, Status.DOWN, checks.getJsonObject(0), jsonObject -> {
+ assertHealthCheckOutput("camel-routes", Status.DOWN, checks.getJsonObject(0), jsonObject -> {
assertEquals("healthyRoute", jsonObject.getString("route.id"));
assertEquals(ServiceStatus.Stopped.name(), jsonObject.getString("route.status"));
});
@@ -136,11 +135,150 @@ public class CamelMicroProfileHealthCheckRepositoryTest extends CamelMicroProfil
assertEquals(Status.DOWN.name(), healthObject.getString("status"));
JsonArray checks = healthObject.getJsonArray("checks");
- assertEquals(2, checks.size());
+ assertEquals(1, checks.size());
+
+ assertHealthCheckOutput("camel-custom-repository", Status.DOWN, checks.getJsonObject(0));
+ }
+
+ @Test
+ public void testRegisterHealthCheckRepositoryAllLiveness() {
+ List<HealthCheck> repositoryChecks = new ArrayList<>();
+ repositoryChecks.add(createLivenessCheck("check-1", true, builder -> builder.up()));
+ repositoryChecks.add(createLivenessCheck("check-2", true, builder -> builder.up()));
+
+ HealthCheckRepository repository = new HealthCheckRepository() {
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ // Noop
+ }
+
+ @Override
+ public Stream<HealthCheck> stream() {
+ return repositoryChecks.stream();
+ }
- assertHealthCheckOutput("check-3", Status.DOWN, checks.getJsonObject(0));
+ @Override
+ public String getId() {
+ return "custom-repository";
+ }
+ };
- assertHealthCheckOutput("check-1", Status.UP, checks.getJsonObject(1));
+ HealthCheckRegistry healthCheckRegistry = HealthCheckRegistry.get(context);
+ healthCheckRegistry.register(repository);
+
+ SmallRyeHealth liveness = reporter.getLiveness();
+ SmallRyeHealth readiness = reporter.getReadiness();
+
+ JsonObject livenessHealthObject = getHealthJson(liveness);
+ assertEquals(Status.UP.name(), livenessHealthObject.getString("status"));
+
+ JsonArray livenessChecks = livenessHealthObject.getJsonArray("checks");
+ assertEquals(1, livenessChecks.size());
+
+ JsonObject readinessHealthObject = getHealthJson(readiness);
+ assertEquals(Status.UP.name(), readinessHealthObject.getString("status"));
+
+ JsonArray readinessChecks = readinessHealthObject.getJsonArray("checks");
+ assertEquals(0, readinessChecks.size());
+ }
+
+ @Test
+ public void testRegisterHealthCheckRepositoryAllReadiness() {
+ List<HealthCheck> repositoryChecks = new ArrayList<>();
+ repositoryChecks.add(createReadinessCheck("check-1", true, builder -> builder.up()));
+ repositoryChecks.add(createReadinessCheck("check-2", true, builder -> builder.up()));
+
+ HealthCheckRepository repository = new HealthCheckRepository() {
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ // Noop
+ }
+
+ @Override
+ public Stream<HealthCheck> stream() {
+ return repositoryChecks.stream();
+ }
+
+ @Override
+ public String getId() {
+ return "custom-repository";
+ }
+ };
+
+ HealthCheckRegistry healthCheckRegistry = HealthCheckRegistry.get(context);
+ healthCheckRegistry.register(repository);
+
+ SmallRyeHealth liveness = reporter.getLiveness();
+ SmallRyeHealth readiness = reporter.getReadiness();
+
+ JsonObject livenessHealthObject = getHealthJson(liveness);
+ assertEquals(Status.UP.name(), livenessHealthObject.getString("status"));
+
+ JsonArray livenessChecks = livenessHealthObject.getJsonArray("checks");
+ assertEquals(0, livenessChecks.size());
+
+ JsonObject readinessHealthObject = getHealthJson(readiness);
+ assertEquals(Status.UP.name(), readinessHealthObject.getString("status"));
+
+ JsonArray readinessChecks = readinessHealthObject.getJsonArray("checks");
+ assertEquals(1, readinessChecks.size());
+ }
+
+ @Test
+ public void testRegisterHealthCheckRepositoryMixedLivenessAndReadiness() {
+ List<HealthCheck> repositoryChecks = new ArrayList<>();
+ repositoryChecks.add(createLivenessCheck("check-1", true, builder -> builder.up()));
+ repositoryChecks.add(createReadinessCheck("check-2", true, builder -> builder.up()));
+
+ HealthCheckRepository repository = new HealthCheckRepository() {
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ // Noop
+ }
+
+ @Override
+ public Stream<HealthCheck> stream() {
+ return repositoryChecks.stream();
+ }
+
+ @Override
+ public String getId() {
+ return "custom-repository";
+ }
+ };
+
+ HealthCheckRegistry healthCheckRegistry = HealthCheckRegistry.get(context);
+ healthCheckRegistry.register(repository);
+
+ SmallRyeHealth liveness = reporter.getLiveness();
+ SmallRyeHealth readiness = reporter.getReadiness();
+
+ JsonObject livenessHealthObject = getHealthJson(liveness);
+ assertEquals(Status.UP.name(), livenessHealthObject.getString("status"));
+
+ JsonArray livenessChecks = livenessHealthObject.getJsonArray("checks");
+ assertEquals(1, livenessChecks.size());
+
+ JsonObject readinessHealthObject = getHealthJson(readiness);
+ assertEquals(Status.UP.name(), readinessHealthObject.getString("status"));
+
+ JsonArray readinessChecks = readinessHealthObject.getJsonArray("checks");
+ assertEquals(1, readinessChecks.size());
}
@Test
@@ -157,7 +295,7 @@ public class CamelMicroProfileHealthCheckRepositoryTest extends CamelMicroProfil
JsonArray checks = healthObject.getJsonArray("checks");
assertEquals(1, checks.size());
- assertHealthCheckOutput(ROUTES_CHECK_NAME, Status.UP, checks.getJsonObject(0));
+ assertHealthCheckOutput("camel-routes", Status.UP, checks.getJsonObject(0));
healthCheckRegistry.unregister(hc);
@@ -170,6 +308,176 @@ public class CamelMicroProfileHealthCheckRepositoryTest extends CamelMicroProfil
assertEquals(0, checks.size());
}
+ @Test
+ public void testUnregisterHealthCheckRepositoryAllLiveness() {
+ List<HealthCheck> repositoryChecks = new ArrayList<>();
+ repositoryChecks.add(createLivenessCheck("check-1", true, builder -> builder.up()));
+ repositoryChecks.add(createLivenessCheck("check-2", true, builder -> builder.up()));
+
+ HealthCheckRepository repository = new HealthCheckRepository() {
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ // Noop
+ }
+
+ @Override
+ public Stream<HealthCheck> stream() {
+ return repositoryChecks.stream();
+ }
+
+ @Override
+ public String getId() {
+ return "custom-repository";
+ }
+ };
+
+ HealthCheckRegistry healthCheckRegistry = HealthCheckRegistry.get(context);
+ healthCheckRegistry.register(repository);
+
+ SmallRyeHealth liveness = reporter.getLiveness();
+ SmallRyeHealth readiness = reporter.getReadiness();
+
+ JsonObject livenessHealthObject = getHealthJson(liveness);
+ assertEquals(Status.UP.name(), livenessHealthObject.getString("status"));
+
+ JsonArray livenessChecks = livenessHealthObject.getJsonArray("checks");
+ assertEquals(1, livenessChecks.size());
+
+ JsonObject readinessHealthObject = getHealthJson(readiness);
+ assertEquals(Status.UP.name(), readinessHealthObject.getString("status"));
+
+ JsonArray readinessChecks = readinessHealthObject.getJsonArray("checks");
+ assertEquals(0, readinessChecks.size());
+
+ healthCheckRegistry.unregister(repository);
+
+ liveness = reporter.getLiveness();
+
+ livenessHealthObject = getHealthJson(liveness);
+ livenessChecks = livenessHealthObject.getJsonArray("checks");
+ assertEquals(0, livenessChecks.size());
+ }
+
+ @Test
+ public void testUnregisterHealthCheckRepositoryAllReadiness() {
+ List<HealthCheck> repositoryChecks = new ArrayList<>();
+ repositoryChecks.add(createReadinessCheck("check-1", true, builder -> builder.up()));
+ repositoryChecks.add(createReadinessCheck("check-2", true, builder -> builder.up()));
+
+ HealthCheckRepository repository = new HealthCheckRepository() {
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ // Noop
+ }
+
+ @Override
+ public Stream<HealthCheck> stream() {
+ return repositoryChecks.stream();
+ }
+
+ @Override
+ public String getId() {
+ return "custom-repository";
+ }
+ };
+
+ HealthCheckRegistry healthCheckRegistry = HealthCheckRegistry.get(context);
+ healthCheckRegistry.register(repository);
+
+ SmallRyeHealth liveness = reporter.getLiveness();
+ SmallRyeHealth readiness = reporter.getReadiness();
+
+ JsonObject livenessHealthObject = getHealthJson(liveness);
+ assertEquals(Status.UP.name(), livenessHealthObject.getString("status"));
+
+ JsonArray livenessChecks = livenessHealthObject.getJsonArray("checks");
+ assertEquals(0, livenessChecks.size());
+
+ JsonObject readinessHealthObject = getHealthJson(readiness);
+ assertEquals(Status.UP.name(), readinessHealthObject.getString("status"));
+
+ JsonArray readinessChecks = readinessHealthObject.getJsonArray("checks");
+ assertEquals(1, readinessChecks.size());
+
+ healthCheckRegistry.unregister(repository);
+
+ readiness = reporter.getReadiness();
+
+ readinessHealthObject = getHealthJson(readiness);
+ readinessChecks = readinessHealthObject.getJsonArray("checks");
+ assertEquals(0, readinessChecks.size());
+ }
+
+ @Test
+ public void testUnregisterHealthCheckRepositoryMixedLivenessAndReadiness() {
+ List<HealthCheck> repositoryChecks = new ArrayList<>();
+ repositoryChecks.add(createLivenessCheck("check-1", true, builder -> builder.up()));
+ repositoryChecks.add(createReadinessCheck("check-2", true, builder -> builder.up()));
+
+ HealthCheckRepository repository = new HealthCheckRepository() {
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ // Noop
+ }
+
+ @Override
+ public Stream<HealthCheck> stream() {
+ return repositoryChecks.stream();
+ }
+
+ @Override
+ public String getId() {
+ return "custom-repository";
+ }
+ };
+
+ HealthCheckRegistry healthCheckRegistry = HealthCheckRegistry.get(context);
+ healthCheckRegistry.register(repository);
+
+ SmallRyeHealth liveness = reporter.getLiveness();
+ SmallRyeHealth readiness = reporter.getReadiness();
+
+ JsonObject livenessHealthObject = getHealthJson(liveness);
+ assertEquals(Status.UP.name(), livenessHealthObject.getString("status"));
+
+ JsonArray livenessChecks = livenessHealthObject.getJsonArray("checks");
+ assertEquals(1, livenessChecks.size());
+
+ JsonObject readinessHealthObject = getHealthJson(readiness);
+ assertEquals(Status.UP.name(), readinessHealthObject.getString("status"));
+
+ JsonArray readinessChecks = readinessHealthObject.getJsonArray("checks");
+ assertEquals(1, readinessChecks.size());
+
+ healthCheckRegistry.unregister(repository);
+
+ liveness = reporter.getLiveness();
+ readiness = reporter.getReadiness();
+
+ livenessHealthObject = getHealthJson(liveness);
+ livenessChecks = livenessHealthObject.getJsonArray("checks");
+ assertEquals(0, livenessChecks.size());
+
+ readinessHealthObject = getHealthJson(readiness);
+ readinessChecks = readinessHealthObject.getJsonArray("checks");
+ assertEquals(0, readinessChecks.size());
+ }
+
@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
diff --git a/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckTest.java b/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckTest.java
index 6c8b5bf..a5d4e3d 100644
--- a/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckTest.java
+++ b/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthCheckTest.java
@@ -29,12 +29,14 @@ import org.apache.camel.health.HealthCheckResultBuilder;
import org.apache.camel.impl.engine.ExplicitCamelContextNameStrategy;
import org.apache.camel.impl.health.AbstractHealthCheck;
import org.apache.camel.impl.health.ContextHealthCheck;
+import org.eclipse.microprofile.health.HealthCheckResponse;
import org.eclipse.microprofile.health.HealthCheckResponse.Status;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
public class CamelMicroProfileHealthCheckTest extends CamelMicroProfileHealthTestSupport {
@@ -323,4 +325,129 @@ public class CamelMicroProfileHealthCheckTest extends CamelMicroProfileHealthTes
assertNotNull(jsonObject.getString("error.stacktrace"));
});
}
+
+ @Test
+ public void testExposureLevelDefault() {
+ HealthCheckRegistry healthCheckRegistry = HealthCheckRegistry.get(context);
+
+ HealthCheck failingCheck = new AbstractHealthCheck("failing-check") {
+ @Override
+ public boolean isLiveness() {
+ return false;
+ }
+
+ @Override
+ protected void doCall(HealthCheckResultBuilder builder, Map<String, Object> options) {
+ builder.error(new Exception("Forced exception"));
+ builder.down();
+ }
+ };
+
+ healthCheckRegistry.register(failingCheck);
+ healthCheckRegistry.register(createLivenessCheck("liveness-1", true, builder -> builder.detail("test", "test").up()));
+
+ SmallRyeHealth health = reporter.getHealth();
+
+ JsonObject healthObject = getHealthJson(health);
+ assertEquals(HealthCheckResponse.Status.DOWN.name(), healthObject.getString("status"));
+
+ JsonArray checks = healthObject.getJsonArray("checks");
+ assertEquals(2, checks.size());
+
+ JsonObject check = checks.getJsonObject(0);
+ assertHealthCheckOutput("liveness-1", HealthCheckResponse.Status.UP, check, result -> {
+ assertNotNull(result);
+ assertEquals("test", result.getString("test"));
+ });
+
+ JsonObject failedCheck = checks.getJsonObject(1);
+ assertHealthCheckOutput("failing-check", HealthCheckResponse.Status.DOWN, failedCheck, result -> {
+ assertNotNull(result);
+ assertEquals("Forced exception", result.getString("error.message"));
+ assertNotNull(result.getString("error.stacktrace"));
+ });
+ }
+
+ @Test
+ public void testExposureLevelFull() {
+ HealthCheckRegistry healthCheckRegistry = HealthCheckRegistry.get(context);
+ healthCheckRegistry.setExposureLevel("full");
+
+ HealthCheck failingCheck = new AbstractHealthCheck("failing-check") {
+ @Override
+ public boolean isLiveness() {
+ return false;
+ }
+
+ @Override
+ protected void doCall(HealthCheckResultBuilder builder, Map<String, Object> options) {
+ builder.error(new Exception("Forced exception"));
+ builder.down();
+ }
+ };
+
+ healthCheckRegistry.register(failingCheck);
+ healthCheckRegistry.register(createLivenessCheck("liveness-1", true, builder -> builder.detail("test", "test").up()));
+
+ SmallRyeHealth health = reporter.getHealth();
+
+ JsonObject healthObject = getHealthJson(health);
+ assertEquals(HealthCheckResponse.Status.DOWN.name(), healthObject.getString("status"));
+
+ JsonArray checks = healthObject.getJsonArray("checks");
+ assertEquals(2, checks.size());
+
+ JsonObject livenessCheck = checks.getJsonObject(0);
+ assertHealthCheckOutput("liveness-1", HealthCheckResponse.Status.UP, livenessCheck, result -> {
+ assertNotNull(result);
+ assertEquals("test", result.getString("test"));
+ });
+
+ JsonObject failedCheck = checks.getJsonObject(1);
+ assertHealthCheckOutput("failing-check", HealthCheckResponse.Status.DOWN, failedCheck, result -> {
+ assertNotNull(result);
+ assertEquals("Forced exception", result.getString("error.message"));
+ assertNotNull(result.getString("error.stacktrace"));
+ });
+ }
+
+ @Test
+ public void testExposureLevelOneline() {
+ HealthCheckRegistry healthCheckRegistry = HealthCheckRegistry.get(context);
+ healthCheckRegistry.setExposureLevel("oneline");
+
+ HealthCheck failingCheck = new AbstractHealthCheck("failing-check") {
+ @Override
+ public boolean isLiveness() {
+ return false;
+ }
+
+ @Override
+ protected void doCall(HealthCheckResultBuilder builder, Map<String, Object> options) {
+ builder.error(new Exception("Forced exception"));
+ builder.down();
+ }
+ };
+
+ healthCheckRegistry.register(failingCheck);
+ healthCheckRegistry.register(createLivenessCheck("liveness-1", true, builder -> builder.detail("test", "test").up()));
+
+ SmallRyeHealth health = reporter.getHealth();
+
+ JsonObject healthObject = getHealthJson(health);
+ assertEquals(HealthCheckResponse.Status.DOWN.name(), healthObject.getString("status"));
+
+ JsonArray checks = healthObject.getJsonArray("checks");
+ assertEquals(2, checks.size());
+
+ JsonObject livenessCheck = checks.getJsonObject(0);
+ assertHealthCheckOutput("liveness-1", HealthCheckResponse.Status.UP, livenessCheck, result -> {
+ assertNull(result);
+ });
+
+ JsonObject failedCheck = checks.getJsonObject(1);
+ assertHealthCheckOutput("failing-check", HealthCheckResponse.Status.DOWN, failedCheck, result -> {
+ assertNull(result);
+ });
+ }
}
diff --git a/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthConsumerTest.java b/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthConsumerTest.java
index 09e2d0d..97c0b6a 100644
--- a/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthConsumerTest.java
+++ b/components/camel-microprofile/camel-microprofile-health/src/test/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthConsumerTest.java
@@ -27,7 +27,6 @@ import org.apache.camel.health.HealthCheckRegistry;
import org.eclipse.microprofile.health.HealthCheckResponse.Status;
import org.junit.jupiter.api.Test;
-import static org.apache.camel.microprofile.health.CamelMicroProfileHealthCheckRegistry.CONSUMERS_CHECK_NAME;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CamelMicroProfileHealthConsumerTest extends CamelMicroProfileHealthTestSupport {
@@ -47,7 +46,7 @@ public class CamelMicroProfileHealthConsumerTest extends CamelMicroProfileHealth
JsonArray checks = healthObject.getJsonArray("checks");
assertEquals(1, checks.size());
- assertHealthCheckOutput(CONSUMERS_CHECK_NAME, Status.UP, checks.getJsonObject(0));
+ assertHealthCheckOutput("camel-consumers", Status.UP, checks.getJsonObject(0));
}
@Test
@@ -67,7 +66,7 @@ public class CamelMicroProfileHealthConsumerTest extends CamelMicroProfileHealth
JsonArray checks = healthObject.getJsonArray("checks");
assertEquals(1, checks.size());
- assertHealthCheckOutput(CONSUMERS_CHECK_NAME, Status.DOWN, checks.getJsonObject(0), jsonObject -> {
+ assertHealthCheckOutput("camel-consumers", Status.DOWN, checks.getJsonObject(0), jsonObject -> {
assertEquals("healthyRoute", jsonObject.getString("route.id"));
assertEquals(ServiceStatus.Stopped.name(), jsonObject.getString("route.status"));
});
@@ -87,7 +86,7 @@ public class CamelMicroProfileHealthConsumerTest extends CamelMicroProfileHealth
JsonArray checks = healthObject.getJsonArray("checks");
assertEquals(1, checks.size());
- assertHealthCheckOutput(CONSUMERS_CHECK_NAME, Status.UP, checks.getJsonObject(0));
+ assertHealthCheckOutput("camel-consumers", Status.UP, checks.getJsonObject(0));
healthCheckRegistry.unregister(hc);