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 89a424c  camel-jbang - Add health check status
89a424c is described below

commit 89a424c77e33f845ee00cd739a825966f79e5cdc
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Fri Jan 28 11:21:23 2022 +0100

    camel-jbang - Add health check status
---
 .../apache/camel/dsl/jbang/core/commands/Run.java  |  6 +++
 .../java/org/apache/camel/main/KameletMain.java    | 10 ++++
 .../org/apache/camel/main/VertxHttpServer.java     | 61 +++++++++++++++++++++-
 3 files changed, 76 insertions(+), 1 deletion(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index e0bf1f6..1175f85 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -108,6 +108,9 @@ class Run implements Callable<Integer> {
     @Option(names = { "--console" }, description = "Developer console at /dev 
on local HTTP server (port 8080 by default)")
     private boolean console;
 
+    @Option(names = { "--health" }, description = "Health check at /health on 
local HTTP server (port 8080 by default)")
+    private boolean health;
+
     @Override
     public Integer call() throws Exception {
         if (stopRequested) {
@@ -168,6 +171,9 @@ class Run implements Callable<Integer> {
         if (console) {
             main.addInitialProperty("camel.jbang.console", "true");
         }
+        if (health) {
+            main.addInitialProperty("camel.jbang.health", "true");
+        }
 
         if (jfr) {
             main.addInitialProperty("camel.jbang.jfr", "jfr");
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index 8d14087..7ed00e4 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -179,6 +179,16 @@ public class KameletMain extends MainCommandLineSupport {
         }
         configure().withLoadHealthChecks(true);
 
+        boolean health = 
"true".equals(getInitialProperties().get("camel.jbang.health"));
+        if (health && port == null) {
+            // use default port 8080 if console is enabled
+            VertxHttpServer.registerServer(answer, 8080);
+        }
+        if (health) {
+            configure().withLoadHealthChecks(true);
+            VertxHttpServer.registerHealthCheck(answer);
+        }
+
         // need to setup jfr early
         Object jfr = getInitialProperties().get("camel.jbang.jfr");
         Object jfrProfile = 
getInitialProperties().get("camel.jbang.jfr-profile");
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/VertxHttpServer.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/VertxHttpServer.java
index 7ab379e..b1222b5 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/VertxHttpServer.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/VertxHttpServer.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.main;
 
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -33,11 +34,15 @@ import 
org.apache.camel.component.platform.http.vertx.VertxPlatformHttpServer;
 import 
org.apache.camel.component.platform.http.vertx.VertxPlatformHttpServerConfiguration;
 import org.apache.camel.console.DevConsole;
 import org.apache.camel.console.DevConsoleRegistry;
+import org.apache.camel.health.HealthCheck;
+import org.apache.camel.health.HealthCheckHelper;
 import org.apache.camel.spi.CamelEvent;
 import org.apache.camel.support.SimpleEventNotifierSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.camel.health.HealthCheckHelper.invoke;
+
 /**
  * To setup vertx http server in the running Camel application
  */
@@ -50,6 +55,7 @@ public final class VertxHttpServer {
     private static final Logger LOG = 
LoggerFactory.getLogger(VertxHttpServer.class);
     private static final AtomicBoolean REGISTERED = new AtomicBoolean();
     private static final AtomicBoolean CONSOLE = new AtomicBoolean();
+    private static final AtomicBoolean HEALTH_CHECK = new AtomicBoolean();
 
     private VertxHttpServer() {
     }
@@ -137,7 +143,6 @@ public final class VertxHttpServer {
     private static void doRegisterConsole(CamelContext context) {
         Route dev = router.route("/dev");
         dev.method(HttpMethod.GET);
-        dev.handler(router.bodyHandler());
         dev.produces("text/plain");
         dev.handler(new Handler<RoutingContext>() {
             @Override
@@ -169,4 +174,58 @@ public final class VertxHttpServer {
         phc.addHttpEndpoint("/dev");
     }
 
+    public static void registerHealthCheck(CamelContext camelContext) {
+        if (HEALTH_CHECK.compareAndSet(false, true)) {
+            doRegisterHealthCheck(camelContext);
+        }
+    }
+
+    private static void doRegisterHealthCheck(CamelContext context) {
+        final Route health = router.route("/health");
+        health.method(HttpMethod.GET);
+        health.produces("application/json");
+        final Route live = router.route("/health/live");
+        live.method(HttpMethod.GET);
+        live.produces("application/json");
+        final Route ready = router.route("/health/ready");
+        ready.method(HttpMethod.GET);
+        ready.produces("application/json");
+
+        Handler<RoutingContext> handler = new Handler<RoutingContext>() {
+            @Override
+            public void handle(RoutingContext ctx) {
+                boolean all = ctx.currentRoute() == health;
+                boolean liv = ctx.currentRoute() == live;
+
+                StringBuilder sb = new StringBuilder();
+                sb.append("{\n");
+
+                Collection<HealthCheck.Result> res;
+                if (all) {
+                    res = HealthCheckHelper.invoke(context);
+                } else if (liv) {
+                    res = HealthCheckHelper.invokeLiveness(context);
+                } else {
+                    res = HealthCheckHelper.invokeReadiness(context);
+                }
+
+                // we just want a brief summary or either UP or DOWN
+                boolean up = res.stream().noneMatch(r -> 
r.getState().equals(HealthCheck.State.DOWN));
+                if (up) {
+                    sb.append("    \"status\": \"UP\"\n");
+                } else {
+                    sb.append("    \"status\": \"DOWN\"\n");
+                }
+                sb.append("}\n");
+
+                ctx.end(sb.toString());
+            }
+        };
+        health.handler(handler);
+        live.handler(handler);
+        ready.handler(handler);
+
+        phc.addHttpEndpoint("/health");
+    }
+
 }

Reply via email to