From 7eb5ff2ab93c8a62ff85249e8356922553880b01 Mon Sep 17 00:00:00 2001 From: Tadayoshi Sato Date: Thu, 23 Nov 2023 13:06:11 +0900 Subject: [PATCH] Make camel-springboot hawtio-enabled --- camel-springboot/README.md | 121 +++++++++++++++++++++++------- camel-springboot/jmx-exporter.yml | 6 -- camel-springboot/pom.xml | 50 ++++++------ pom.xml | 28 +------ 4 files changed, 117 insertions(+), 88 deletions(-) delete mode 100644 camel-springboot/jmx-exporter.yml diff --git a/camel-springboot/README.md b/camel-springboot/README.md index 36663e2..2433757 100644 --- a/camel-springboot/README.md +++ b/camel-springboot/README.md @@ -2,49 +2,116 @@ This sample application shows how to make it hawtio-enabled with Camel Spring Boot. Once deployed on OpenShift/Kubernetes, it will be discovered by Hawtio Online. -## How to run +## Highlights -Run with: +- [pom.xml](pom.xml) - mvn spring-boot:run +This project uses JKube [kubernetes-maven-plugin](https://eclipse.dev/jkube/docs/kubernetes-maven-plugin/) to build a container image and deploy it to a Kubernetes/OpenShift cluster. JKube supports Jolokia out of the box and the default base image already includes Jolokia agent. -Hawtio is exposed at the [Actuator](https://docs.spring.io/spring-boot/docs/latest/reference/html/production-ready-endpoints.html) management port configured using -`management.server.port` in `application.properties`. Browse Hawtio via the following URL: http://localhost:10001/actuator/hawtio/index.html +All you need to make the application _hawtio-enabled_ is to define additional environment variables to the deployment resource to fine-tune the Jolokia agent options. By default, JKube plugin sets up a Jolokia agent with HTTPS and SSL client authentication enabled. The only necessary configurations are the client principal that matches the Hawtio Online instance (the default is `hawtio-online.hawtio.svc`) and the CA cert to specify `service-ca.crt` instead of the default `ca.crt`. -The actual application is running on port 10000 (`server.port` in `application.properties`). +```xml + + + + cn=hawtio-online.hawtio.svc + caCert=/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt + + + +``` -## Alternative configurations +## How to run locally -### Alternative management endpoint base paths -If your preference is to avoid running Hawtio under the `/actuator` path, you can set the `management.endpoints.web.base-path` property in `application.properties`: +Run with: -``` -management.endpoints.web.base-path=/ +```console +mvn spring-boot:run ``` -Hawtio will then be available at http://localhost:10001/hawtio/index.html. +## How to deploy it to Kubernetes/OpenShift -### Alternative hawtio endpoint paths +This example is intended to be used by deploying to a Kubernetes/OpenShift cluster. -You can also customize the endpoint path of the Hawtio actuator endpoint by setting the `management.endpoints.web.path-mapping.hawtio` property in `application.properties`: +To deploy it to a cluster, firstly change the container image name in [pom.xml](pom.xml) to fit your development environment. (The default image name is `quay.io/hawtio/hawtio-online-example-camel-springboot:latest`, which should be pushed to the `hawtio` organisation on [Quay.io](https://quay.io/).) -``` -management.endpoints.web.path-mapping.hawtio=hawtio/console +```xml + quay.io/hawtio/%a:latest ``` -### Alternative ports & context paths -Alternative ports and context path configurations can be tested by changing the following properties in `application.properties`: +Then build the project and container image: +```console +mvn package k8s:build ``` -server.port=10000 -server.servlet.context-path=/sample-app -management.port=10000 -management.server.servlet.context-path=/management + +and push the image to the container registry so that Kubernetes/OpenShift can pull it at deployment: + +```console +mvn k8s:push ``` -Using the above configuration, the server will use port 10000 and the custom context path `sample-app`. -The Actuator management endpoints and Hawtio will also run on port 10000 using the custom management context path `management`. -The URLs for accessing the application and Hawtio are as follows: +To deploy it to Kubernetes/OpenShift: -- Application: http://localhost:10000/sample-app/ -- Hawtio: http://localhost:10000/sample-app/management/actuator/hawtio +```console +mvn k8s:resource k8s:deploy +``` + +After deployment is successful and the pod has started, the application log can be seen on the cluster like this: + +```console +$ hawtio-online-example-camel-springboot ++ hawtio-online-example-camel-springboot-7f578548d6-s27j4 › spring-boot +Starting the Java application using /opt/jboss/container/java/run/run-java.sh ... +INFO exec java -javaagent:/usr/share/java/jolokia-jvm-agent/jolokia-jvm.jar=config=/opt/jboss/container/jolokia/etc/jolokia.properties -javaagent:/usr/share/java/prometheus-jmx-exporter/jmx_prometheus_javaagent.jar=9779:/opt/jboss/container/prometheus/etc/jmx-exporter-config.yaml -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -XX:+ExitOnOutOfMemoryError -cp ".:/deployments/*" org.springframework.boot.loader.JarLauncher + _________________________________________ +< Hawtio Online Camel Spring Boot Example > + ----------------------------------------- + \ ^__^ + \ (oo)\_______ + (__)\ )\/\ + ||----w | + || || + +I> No access restrictor found, access to any MBean is allowed +Jolokia: Agent started with URL https://172.17.11.234:8778/jolokia/ +2023-11-23T03:51:12.505Z INFO 1 --- [ main] i.h.o.e.s.SampleSpringBootService : Starting SampleSpringBootService using Java 17.0.9 with PID 1 (/deployments/BOOT-INF/classes started by jboss in /deployments) +2023-11-23T03:51:12.512Z INFO 1 --- [ main] i.h.o.e.s.SampleSpringBootService : No active profile set, falling back to 1 default profile: "default" +2023-11-23T03:51:15.938Z INFO 1 --- [ main] o.a.c.i.e.DefaultCamelContextExtension : Detected: camel-debug JAR (Enabling Camel Debugging) +2023-11-23T03:51:17.021Z INFO 1 --- [ main] org.xnio : XNIO version 3.8.8.Final +2023-11-23T03:51:17.037Z INFO 1 --- [ main] org.xnio.nio : XNIO NIO Implementation Version 3.8.8.Final +2023-11-23T03:51:17.077Z INFO 1 --- [ main] org.jboss.threads : JBoss Threads version 3.5.0.Final +2023-11-23T03:51:17.502Z INFO 1 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Apache Camel 4.1.0 (SampleCamelSpringBoot) is starting +2023-11-23T03:51:17.582Z INFO 1 --- [ main] o.a.c.component.quartz.QuartzComponent : Setting org.quartz.scheduler.jmx.export=true to ensure QuartzScheduler(s) will be enlisted in JMX +2023-11-23T03:51:17.617Z INFO 1 --- [ main] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2023-11-23T03:51:17.621Z INFO 1 --- [ main] org.quartz.simpl.SimpleThreadPool : Job execution threads will use class loader of thread: main +2023-11-23T03:51:17.632Z INFO 1 --- [ main] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2023-11-23T03:51:17.633Z INFO 1 --- [ main] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2023-11-23T03:51:17.633Z INFO 1 --- [ main] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2023-11-23T03:51:17.638Z INFO 1 --- [ main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'DefaultQuartzScheduler-SampleCamelSpringBoot' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2023-11-23T03:51:17.638Z INFO 1 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'DefaultQuartzScheduler-SampleCamelSpringBoot' initialized from an externally provided properties instance. +2023-11-23T03:51:17.638Z INFO 1 --- [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2023-11-23T03:51:17.651Z INFO 1 --- [ main] o.a.c.component.quartz.QuartzEndpoint : Job Camel_SampleCamelSpringBoot.cron (cron=0/10 * * * * ?, triggerType=CronTriggerImpl, jobClass=CamelJob) is scheduled. Next fire date is 2023-11-23T03:51:20.000+0000 +2023-11-23T03:51:17.688Z INFO 1 --- [ main] o.a.c.component.quartz.QuartzEndpoint : Job Camel_SampleCamelSpringBoot.simple (cron=null, triggerType=SimpleTriggerImpl, jobClass=CamelJob) is scheduled. Next fire date is 2023-11-23T03:51:17.685+0000 +2023-11-23T03:51:17.733Z INFO 1 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Routes startup (started:2) +2023-11-23T03:51:17.733Z INFO 1 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Started cron (quartz://cron) +2023-11-23T03:51:17.733Z INFO 1 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Started simple (quartz://simple) +2023-11-23T03:51:17.733Z INFO 1 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Apache Camel 4.1.0 (SampleCamelSpringBoot) started in 230ms (build:0ms init:0ms start:230ms) +2023-11-23T03:51:17.735Z INFO 1 --- [ main] o.a.camel.impl.debugger.BacklogDebugger : Enabling Camel debugger +2023-11-23T03:51:17.735Z INFO 1 --- [ main] o.a.c.component.quartz.QuartzComponent : Starting Quartz scheduler: org.quartz.impl.StdScheduler@72b53f27 +2023-11-23T03:51:17.740Z INFO 1 --- [ main] org.quartz.core.QuartzScheduler : Scheduler DefaultQuartzScheduler-SampleCamelSpringBoot_$_NON_CLUSTERED started. +2023-11-23T03:51:17.744Z INFO 1 --- [ main] i.h.o.e.s.SampleSpringBootService : Started SampleSpringBootService in 6.646 seconds (process running for 7.617) +Hello Camel! - simple +2023-11-23T03:51:17.788Z INFO 1 --- [melJMXConnector] o.a.c.c.debug.JmxConnectorService : JMX Connector thread started and listening at: service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi/camel +Hello Camel! - cron +Hello Camel! - simple +Hello Camel! - cron +Hello Camel! - simple +``` diff --git a/camel-springboot/jmx-exporter.yml b/camel-springboot/jmx-exporter.yml deleted file mode 100644 index 02df234..0000000 --- a/camel-springboot/jmx-exporter.yml +++ /dev/null @@ -1,6 +0,0 @@ -startDelaySecs: 5 -ssl: false -lowercaseOutputName: true -lowercaseOutputLabelNames: true -blacklistObjectNames: ["java.lang:*"] -attrNameSnakeCase: true diff --git a/camel-springboot/pom.xml b/camel-springboot/pom.xml index f9c30f7..6cd5d19 100644 --- a/camel-springboot/pom.xml +++ b/camel-springboot/pom.xml @@ -12,6 +12,12 @@ Hawtio Online Camel Spring Boot Example Hawtio Online :: Sample Camel Spring Boot 3.x application + + quay.io/hawtio/%a:latest + + jib + + @@ -105,12 +111,6 @@ org.springframework.boot spring-boot-maven-plugin ${spring-boot-version} - - io.hawt.online.example.springboot.SampleSpringBootService - - -javaagent:./target/dependency/jmx_prometheus_javaagent.jar=10002:./jmx-exporter.yml - - @@ -119,30 +119,24 @@ - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy - compile - - copy - - - + org.eclipse.jkube + kubernetes-maven-plugin + ${kubernetes-maven-plugin-version} - - - io.prometheus.jmx - jmx_prometheus_javaagent - ${prometheus-jmx-exporter-version} - jar - jmx_prometheus_javaagent.jar - - + + + + cn=hawtio-online.hawtio.svc + caCert=/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt + + diff --git a/pom.xml b/pom.xml index 1b58ecc..95650ce 100644 --- a/pom.xml +++ b/pom.xml @@ -32,13 +32,11 @@ 2.0.0-M4 0.20.0 + 1.15.0 3.1.0 3.0.0 3.11.0 - 3.6.1 3.2.2 - 3.0.1 - 2.6 3.2.2 @@ -51,7 +49,6 @@ - org.apache.maven.plugins maven-antrun-plugin ${maven-antrun-plugin-version} @@ -63,37 +60,14 @@ maven-compiler-plugin ${maven-compiler-plugin-version} - - maven-dependency-plugin - ${maven-dependency-plugin-version} - maven-failsafe-plugin ${maven-failsafe-plugin-version} - - maven-release-plugin - ${maven-release-plugin-version} - maven-surefire-plugin ${maven-surefire-plugin-version} - - com.github.eirslett - frontend-maven-plugin - ${frontend-maven-plugin-version} - - - org.codehaus.mojo - build-helper-maven-plugin - ${build-helper-maven-plugin-version} - - - io.fabric8 - docker-maven-plugin - ${docker-plugin-version} -