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