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

Reply via email to