This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch rc in repository https://gitbox.apache.org/repos/asf/camel.git
commit 070e68f937e828babab2779e624a8f1e4607b3f2 Author: Claus Ibsen <[email protected]> AuthorDate: Sat Dec 16 13:08:09 2023 +0100 CAMEL-20242: camel-core: RouteController health check to be DOWN during starting routes. Supervising route controller option to be DOWN during restarting phase. --- .../src/main/java/org/apache/camel/spi/RouteController.java | 6 ++++++ .../java/org/apache/camel/spi/SupervisingRouteController.java | 4 ++++ .../java/org/apache/camel/impl/engine/DefaultRouteController.java | 5 +++++ .../camel/impl/engine/DefaultSupervisingRouteController.java | 7 ++++++- .../org/apache/camel/impl/engine/InternalRouteController.java | 7 +++++++ .../org/apache/camel/impl/console/RouteControllerConsole.java | 4 ++++ .../org/apache/camel/impl/health/RouteControllerHealthCheck.java | 8 ++------ .../dsl/jbang/core/commands/action/RouteControllerAction.java | 3 +++ 8 files changed, 37 insertions(+), 7 deletions(-) diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/RouteController.java b/core/camel-api/src/main/java/org/apache/camel/spi/RouteController.java index 5b7eefcff34..d538eb77d97 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/RouteController.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/RouteController.java @@ -99,6 +99,12 @@ public interface RouteController extends CamelContextAware, StaticService { */ boolean isStartingRoutes(); + /** + * Indicates if the route controller has routes that are unhealthy such as they have not yet been successfully started, + * and if being supervised then the route can either be pending restarts or failed all restart attempts and are exhausted. + */ + boolean isUnhealthyRoutes(); + /** * Reloads all the routes * diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/SupervisingRouteController.java b/core/camel-api/src/main/java/org/apache/camel/spi/SupervisingRouteController.java index 4631919cfbc..a2018986e1b 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/SupervisingRouteController.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/SupervisingRouteController.java @@ -173,6 +173,10 @@ public interface SupervisingRouteController extends RouteController { */ Throwable getRestartException(String routeId); + /** + * Whether the route controller is currently starting routes for the first time. + * This only reports on the first time start phase. + */ boolean isStartingRoutes(); } diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java index 54ee46708f4..fa63220eedb 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRouteController.java @@ -108,6 +108,11 @@ public class DefaultRouteController extends ServiceSupport implements RouteContr return getInternalRouteController().isStartingRoutes(); } + @Override + public boolean isUnhealthyRoutes() { + return getInternalRouteController().isUnhealthyRoutes(); + } + @Override public void reloadAllRoutes() throws Exception { getInternalRouteController().reloadAllRoutes(); diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultSupervisingRouteController.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultSupervisingRouteController.java index 44b3b6cc6a0..5df8119b4fc 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultSupervisingRouteController.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultSupervisingRouteController.java @@ -248,7 +248,7 @@ public class DefaultSupervisingRouteController extends DefaultRouteController im // ********************************* @Override - public boolean isStartingRoutes() { + public boolean isUnhealthyRoutes() { boolean answer = startingRoutes; // if we have started the routes first time, but some failed and are scheduled for restart @@ -264,6 +264,11 @@ public class DefaultSupervisingRouteController extends DefaultRouteController im return answer; } + @Override + public boolean isStartingRoutes() { + return startingRoutes; + } + @Override public void startRoute(String routeId) throws Exception { final Optional<RouteHolder> route = routes.stream().filter(r -> r.getId().equals(routeId)).findFirst(); diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/InternalRouteController.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/InternalRouteController.java index 4341050bbe8..e07a99760cd 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/InternalRouteController.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/InternalRouteController.java @@ -27,6 +27,8 @@ import org.apache.camel.spi.RouteController; import org.apache.camel.spi.RouteError; import org.apache.camel.spi.SupervisingRouteController; +import static org.apache.camel.support.service.ServiceHelper.isStarted; + /** * Internal {@link RouteController} used internally by {@link AbstractCamelContext}. */ @@ -111,6 +113,11 @@ class InternalRouteController implements RouteController { return abstractCamelContext.isStartingRoutes(); } + @Override + public boolean isUnhealthyRoutes() { + return false; + } + @Override public ServiceStatus getRouteStatus(String routeId) { return abstractCamelContext.getRouteStatus(routeId); diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteControllerConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteControllerConsole.java index c43e1fa1960..bb64f241393 100644 --- a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteControllerConsole.java +++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteControllerConsole.java @@ -66,6 +66,8 @@ public class RouteControllerConsole extends AbstractDevConsole { long started = routes.stream().filter(r -> src.getRouteStatus(r.getRouteId()).isStarted()) .count(); + sb.append(String.format("\nInitial Starting Routes: %b", src.isStartingRoutes())); + sb.append(String.format("\nUnhealthy Routes: %b", src.isUnhealthyRoutes())); sb.append(String.format("Total Routes: %d", routes.size())); sb.append(String.format("\nStarted Routes: %d", started)); sb.append(String.format("\nRestarting Routes: %d", src.getRestartingRoutes().size())); @@ -178,6 +180,8 @@ public class RouteControllerConsole extends AbstractDevConsole { .count(); root.put("controller", "SupervisingRouteController"); + root.put("startingRoutes", src.isStartingRoutes()); + root.put("unhealthyRoutes", src.isUnhealthyRoutes()); root.put("totalRoutes", routes.size()); root.put("startedRoutes", started); root.put("restartingRoutes", src.getRestartingRoutes().size()); diff --git a/core/camel-health/src/main/java/org/apache/camel/impl/health/RouteControllerHealthCheck.java b/core/camel-health/src/main/java/org/apache/camel/impl/health/RouteControllerHealthCheck.java index 35d37c3bbe1..06b076e44f1 100644 --- a/core/camel-health/src/main/java/org/apache/camel/impl/health/RouteControllerHealthCheck.java +++ b/core/camel-health/src/main/java/org/apache/camel/impl/health/RouteControllerHealthCheck.java @@ -45,12 +45,8 @@ public class RouteControllerHealthCheck extends AbstractHealthCheck { RouteController rc = getCamelContext().getRouteController(); if (rc != null) { - // should be down if starting routes as all routes must be complete before ready - up = ServiceHelper.isStarted(rc); - if (up) { - // is starting routes in progress then we should be DOWN - up = !rc.isStartingRoutes(); - } + // should only be up if there are no unhealthy routes + up = !rc.isUnhealthyRoutes(); } if (up) { diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java index e9f501b6576..8a85c25459a 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/RouteControllerAction.java @@ -165,6 +165,8 @@ public class RouteControllerAction extends ActionWatchCommand { if (supervising) { if (header) { System.out.println("Supervising Route Controller"); + System.out.printf("\tInitial Starting Routes: %b%n", jo.getBoolean("startingRoutes")); + System.out.printf("\tUnhealthy Routes: %b%n", jo.getBoolean("unhealthyRoutes")); System.out.printf("\tRoutes Total: %s%n", jo.getInteger("totalRoutes")); System.out.printf("\tRoutes Started: %d%n", jo.getInteger("startedRoutes")); System.out.printf("\tRoutes Restarting: %d%n", jo.getInteger("restartingRoutes")); @@ -183,6 +185,7 @@ public class RouteControllerAction extends ActionWatchCommand { } else { if (header) { System.out.println("Default Route Controller"); + System.out.printf("\tStarting Routes: %b%n", jo.getBoolean("startingRoutes")); System.out.printf("\tRoutes Total: %s%n", jo.getInteger("totalRoutes")); System.out.println("\n"); }
