This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch stop
in repository https://gitbox.apache.org/repos/asf/camel.git

commit d94ed06f1c9a5497cf3d766a865a819cd6f83532
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Oct 10 17:43:05 2024 +0200

    CAMEL-21335: camel-core - Should log summary when starting and stopping 
routes manually via API or jbang
---
 .../camel/impl/engine/AbstractCamelContext.java    | 94 +++++++++++++++++++++-
 .../camel/cli/connector/LocalCliConnector.java     | 28 ++++---
 2 files changed, 110 insertions(+), 12 deletions(-)

diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 571c6985d1b..93940f7e738 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -1050,6 +1050,11 @@ public abstract class AbstractCamelContext extends 
BaseService
 
     public void startAllRoutes() throws Exception {
         internalRouteStartupManager.doStartOrResumeRoutes(this, routeServices, 
true, true, false, false);
+
+        if (startupSummaryLevel != StartupSummaryLevel.Oneline
+                && startupSummaryLevel != StartupSummaryLevel.Off) {
+            logRouteStartSummary(LoggingLevel.INFO);
+        }
     }
 
     private void doStopRoutes(RouteController controller, 
Comparator<RouteStartupOrder> comparator) throws Exception {
@@ -1113,6 +1118,10 @@ public abstract class AbstractCamelContext extends 
BaseService
     }
 
     public void startRoute(String routeId) throws Exception {
+        startRoute(routeId, LoggingLevel.INFO);
+    }
+
+    public void startRoute(String routeId, LoggingLevel loggingLevel) throws 
Exception {
         lock.lock();
         try {
             DefaultRouteError.reset(this, routeId);
@@ -1121,6 +1130,7 @@ public abstract class AbstractCamelContext extends 
BaseService
             if (routeService != null) {
                 try {
                     startRouteService(routeService, false);
+                    logRouteState(routeService.getRoute(), "Started", 
loggingLevel);
                 } catch (Exception e) {
                     DefaultRouteError.set(this, routeId, Phase.START, e);
                     throw e;
@@ -1132,6 +1142,10 @@ public abstract class AbstractCamelContext extends 
BaseService
     }
 
     public void resumeRoute(String routeId) throws Exception {
+        resumeRoute(routeId, LoggingLevel.INFO);
+    }
+
+    public void resumeRoute(String routeId, LoggingLevel loggingLevel) throws 
Exception {
         lock.lock();
         try {
             DefaultRouteError.reset(this, routeId);
@@ -1139,7 +1153,7 @@ public abstract class AbstractCamelContext extends 
BaseService
             try {
                 if (!routeSupportsSuspension(routeId)) {
                     // start route if suspension is not supported
-                    startRoute(routeId);
+                    startRoute(routeId, loggingLevel);
                     return;
                 }
 
@@ -1149,6 +1163,7 @@ public abstract class AbstractCamelContext extends 
BaseService
                     // must resume the route as well
                     Route route = getRoute(routeId);
                     ServiceHelper.resumeService(route);
+                    logRouteState(routeService.getRoute(), "Resumed", 
loggingLevel);
                 }
             } catch (Exception e) {
                 DefaultRouteError.set(this, routeId, Phase.RESUME, e);
@@ -3186,6 +3201,83 @@ public abstract class AbstractCamelContext extends 
BaseService
         }
     }
 
+    protected void logRouteStartSummary(LoggingLevel loggingLevel) {
+        CamelLogger logger = new CamelLogger(LOG, loggingLevel);
+        if (logger.shouldLog()) {
+            int total = 0;
+            int started = 0;
+            int kamelets = 0;
+            int templates = 0;
+            int rests = 0;
+            boolean registerKamelets = false;
+            boolean registerTemplates = true;
+            ManagementStrategy ms = getManagementStrategy();
+            if (ms != null && ms.getManagementAgent() != null) {
+                registerKamelets = 
ms.getManagementAgent().getRegisterRoutesCreateByKamelet();
+                registerTemplates = 
ms.getManagementAgent().getRegisterRoutesCreateByTemplate();
+            }
+            List<String> lines = new ArrayList<>();
+
+            final ShutdownStrategy shutdownStrategy = 
camelContextExtension.getShutdownStrategy();
+            if (shutdownStrategy != null && 
shutdownStrategy.isShutdownRoutesInReverseOrder()) {
+                
routeStartupOrder.sort(Comparator.comparingInt(RouteStartupOrder::getStartupOrder).reversed());
+            } else {
+                
routeStartupOrder.sort(Comparator.comparingInt(RouteStartupOrder::getStartupOrder));
+            }
+            for (RouteStartupOrder order : routeStartupOrder) {
+                total++;
+                String id = order.getRoute().getRouteId();
+                String status = getRouteStatus(id).name();
+                if (order.getRoute().isCreatedByKamelet()) {
+                    kamelets++;
+                } else if (order.getRoute().isCreatedByRouteTemplate()) {
+                    templates++;
+                } else if (order.getRoute().isCreatedByRestDsl()) {
+                    rests++;
+                }
+                boolean skip = (!registerKamelets && 
order.getRoute().isCreatedByKamelet())
+                        || (!registerTemplates && 
order.getRoute().isCreatedByRouteTemplate());
+                if (!skip && ServiceStatus.Started.name().equals(status)) {
+                    started++;
+                }
+                // use basic endpoint uri to not log verbose details or 
potential sensitive data
+                String uri = 
order.getRoute().getEndpoint().getEndpointBaseUri();
+                uri = URISupport.sanitizeUri(uri);
+                if (startupSummaryLevel == StartupSummaryLevel.Verbose || 
!skip) {
+                    lines.add(String.format("    %s %s (%s)", status, id, 
uri));
+                }
+            }
+            int newTotal = total;
+            if (!registerKamelets) {
+                newTotal -= kamelets;
+            }
+            if (!registerTemplates) {
+                newTotal -= templates;
+            }
+            StringJoiner sj = new StringJoiner(" ");
+            sj.add("total:" + newTotal);
+            if (total != started) {
+                sj.add("started:" + started);
+            }
+            if (kamelets > 0) {
+                sj.add("kamelets:" + kamelets);
+            }
+            if (templates > 0) {
+                sj.add("templates:" + templates);
+            }
+            if (rests > 0) {
+                sj.add("rest-dsl:" + rests);
+            }
+            logger.log(String.format("Routes started (%s)", sj));
+            // if we are default/verbose then log each route line
+            if (startupSummaryLevel == StartupSummaryLevel.Default || 
startupSummaryLevel == StartupSummaryLevel.Verbose) {
+                for (String line : lines) {
+                    logger.log(line);
+                }
+            }
+        }
+    }
+
     public void startRouteDefinitions() throws Exception {
     }
 
diff --git 
a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
 
b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
index 279eecc1f0c..365996552e9 100644
--- 
a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
+++ 
b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
@@ -910,18 +910,24 @@ public class LocalCliConnector extends ServiceSupport 
implements CliConnector, C
     private void doActionRouteTask(JsonObject root) {
         // id is a pattern
         String[] patterns = root.getString("id").split(",");
-        // find matching IDs
-        List<String> ids = camelContext.getRoutes()
-                .stream().map(Route::getRouteId)
-                .filter(routeId -> {
-                    for (String p : patterns) {
-                        if (PatternHelper.matchPattern(routeId, p)) {
-                            return true;
+        boolean all = patterns.length == 1 && "*".equals(patterns[0]);
+        List<String> ids;
+        if (all) {
+            ids = List.of("*");
+        } else {
+            // find matching IDs
+            ids = camelContext.getRoutes()
+                    .stream().map(Route::getRouteId)
+                    .filter(routeId -> {
+                        for (String p : patterns) {
+                            if (PatternHelper.matchPattern(routeId, p)) {
+                                return true;
+                            }
                         }
-                    }
-                    return false;
-                })
-                .toList();
+                        return false;
+                    })
+                    .toList();
+        }
         for (String id : ids) {
             String command = root.getString("command");
             try {

Reply via email to