This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/main by this push:
new 9cc28b480e Add Jolokia native support
9cc28b480e is described below
commit 9cc28b480e7d65c60519a68afc867f2a01183796
Author: James Netherton <[email protected]>
AuthorDate: Thu Feb 27 14:38:30 2025 +0000
Add Jolokia native support
Fixes #7001
---
.../ROOT/pages/reference/extensions/jolokia.adoc | 25 +-
.../pages/reference/extensions/management.adoc | 12 +
.../jolokia/deployment/JolokiaProcessor.java | 159 ------------
extensions-jvm/pom.xml | 1 -
.../jolokia/deployment/pom.xml | 0
.../jolokia/deployment/JolokiaProcessor.java | 287 +++++++++++++++++++++
.../jolokia/deployment/JolokiaServerBuildItem.java | 0
.../deployment/JolokiaServerConfigBuildItem.java | 0
.../jolokia/JolokiaCustomContextPathTest.java | 0
.../JolokiaCustomRestrictorDomainsTest.java | 29 +--
.../camel/quarkus/jolokia/JolokiaDisabledTest.java | 0
.../camel/quarkus/jolokia/JolokiaEnabledTest.java | 0
.../JolokiaManagementEndpointDisabledTest.java | 0
{extensions-jvm => extensions}/jolokia/pom.xml | 2 +-
.../jolokia/runtime/pom.xml | 1 +
.../jolokia/runtime/src/main/doc/limitations.adoc | 5 +
.../jolokia/runtime/src/main/doc/usage.adoc | 0
.../jolokia/CamelQuarkusJolokiaLogHandler.java | 0
.../quarkus/jolokia/CamelQuarkusJolokiaServer.java | 0
.../camel/quarkus/jolokia/JolokiaRecorder.java | 15 +-
.../jolokia/JolokiaRequestRedirectHandler.java | 0
.../jolokia/config/JolokiaBuildTimeConfig.java | 0
.../jolokia/config/JolokiaRuntimeConfig.java | 0
.../jolokia/restrictor/CamelJolokiaRestrictor.java | 0
.../main/resources/META-INF/quarkus-extension.yaml | 3 +-
.../management/deployment/ManagementProcessor.java | 36 +++
.../runtime/src/main/doc/limitations.adoc | 6 +
extensions/pom.xml | 1 +
integration-tests-jvm/pom.xml | 1 -
.../jolokia/pom.xml | 27 ++
.../component/jolokia/it/CustomLogHandler.java | 27 +-
.../component/jolokia/it/CustomRestrictor.java | 17 +-
.../component/jolokia/it/JolokiaResource.java | 8 +
.../component/jolokia/it/JolokiaRoutes.java | 0
.../src/main/resources/application.properties | 19 ++
.../jolokia/it/JolokiaAdditionalPropertiesIT.java | 10 +-
.../it/JolokiaAdditionalPropertiesTest.java | 0
.../jolokia/it/JolokiaCustomHostPortIT.java | 10 +-
.../jolokia/it/JolokiaCustomHostPortTest.java | 0
.../jolokia/it/JolokiaCustomLogHandlerIT.java | 10 +-
.../jolokia/it/JolokiaCustomLogHandlerTest.java | 30 +--
.../jolokia/it/JolokiaCustomRestrictorIT.java | 10 +-
.../jolokia/it/JolokiaCustomRestrictorTest.java | 41 ++-
.../jolokia/it/JolokiaDisableAutoStartIT.java | 10 +-
.../jolokia/it/JolokiaDisableAutoStartTest.java | 0
.../jolokia/it/JolokiaDisableRestrictorIT.java | 10 +-
.../jolokia/it/JolokiaDisableRestrictorTest.java | 0
.../jolokia/it/JolokiaDiscoveryDisabledIT.java | 10 +-
.../jolokia/it/JolokiaDiscoveryDisabledTest.java | 0
.../quarkus/component/jolokia/it/JolokiaIT.java | 11 +-
.../jolokia/it/JolokiaKubernetesClientSSLIT.java | 10 +-
.../jolokia/it/JolokiaKubernetesClientSSLTest.java | 0
.../quarkus/component/jolokia/it/JolokiaTest.java | 19 +-
integration-tests/pom.xml | 1 +
tooling/scripts/test-categories.yaml | 1 +
55 files changed, 549 insertions(+), 315 deletions(-)
diff --git a/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc
b/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc
index 513186eef7..5dff0a8c8b 100644
--- a/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/jolokia.adoc
@@ -4,17 +4,17 @@
= Jolokia
:linkattrs:
:cq-artifact-id: camel-quarkus-jolokia
-:cq-native-supported: false
-:cq-status: Preview
-:cq-status-deprecation: Preview
+:cq-native-supported: true
+:cq-status: Stable
+:cq-status-deprecation: Stable
:cq-description: Expose runtime metrics and management operations via JMX with
Jolokia
:cq-deprecated: false
:cq-jvm-since: 3.19.0
-:cq-native-since: n/a
+:cq-native-since: 3.19.0
ifeval::[{doc-show-badges} == true]
[.badges]
-[.badge-key]##JVM since##[.badge-supported]##3.19.0##
[.badge-key]##Native##[.badge-unsupported]##unsupported##
+[.badge-key]##JVM since##[.badge-supported]##3.19.0## [.badge-key]##Native
since##[.badge-supported]##3.19.0##
endif::[]
Expose runtime metrics and management operations via JMX with Jolokia
@@ -22,6 +22,10 @@ Expose runtime metrics and management operations via JMX
with Jolokia
[id="extensions-jolokia-maven-coordinates"]
== Maven coordinates
+https://{link-quarkus-code-generator}/?extension-search=camel-quarkus-jolokia[Create
a new project with this extension on {link-quarkus-code-generator},
window="_blank"]
+
+Or add the coordinates to your existing project:
+
[source,xml]
----
<dependency>
@@ -161,6 +165,17 @@
quarkus.camel.jolokia.kubernetes.client-principal="cn=hawtio-online.hawtio.svc"
----
+[id="extensions-jolokia-camel-quarkus-limitations"]
+== Camel Quarkus limitations
+
+[id="extensions-jolokia-limitations-native-mode-limitations"]
+=== Native mode limitations
+
+JMX in GraalVM is still *experimental*. Therefore, some features are not
available in native mode.
+
+Refer to the Camel Quarkus Management extension
xref:reference/extensions/management.adoc#extensions-management-limitations-native-mode[limitations]
section for more details.
+
+
[id="extensions-jolokia-additional-camel-quarkus-configuration"]
== Additional Camel Quarkus configuration
diff --git a/docs/modules/ROOT/pages/reference/extensions/management.adoc
b/docs/modules/ROOT/pages/reference/extensions/management.adoc
index c173241405..5e078113c1 100644
--- a/docs/modules/ROOT/pages/reference/extensions/management.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/management.adoc
@@ -62,3 +62,15 @@ quarkus.native.monitoring=jvmstat
For more information, refer to the
https://quarkus.io/guides/building-native-image#using-monitoring-options[Quarkus
native guide].
+
+[id="extensions-management-camel-quarkus-limitations"]
+== Camel Quarkus limitations
+
+[id="extensions-management-limitations-native-mode"]
+=== Native mode
+
+JMX in GraalVM is still *experimental*. Therefore, some features are not
available in native mode.
+
+* Operations for MBean `java.lang:type=Threading` are not fully implemented.
Therefore, it is not possible to obtain details about application threads.
+* Various MBean attributes do not have their values implemented. For example,
the `ClassCount` attribute values for MBean `java.lang:type=ClassLoading` are
fixed at `0`
+
diff --git
a/extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
b/extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
deleted file mode 100644
index 7df5e71a99..0000000000
---
a/extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.jolokia.deployment;
-
-import java.util.function.BooleanSupplier;
-
-import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
-import io.quarkus.deployment.Capabilities;
-import io.quarkus.deployment.Capability;
-import io.quarkus.deployment.IsDevelopment;
-import io.quarkus.deployment.IsNormal;
-import io.quarkus.deployment.annotations.BuildProducer;
-import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.annotations.BuildSteps;
-import io.quarkus.deployment.annotations.ExecutionTime;
-import io.quarkus.deployment.annotations.Record;
-import io.quarkus.deployment.builditem.ApplicationInfoBuildItem;
-import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
-import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
-import io.quarkus.kubernetes.spi.KubernetesPortBuildItem;
-import io.quarkus.vertx.http.deployment.BodyHandlerBuildItem;
-import io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem;
-import io.quarkus.vertx.http.deployment.RouteBuildItem;
-import jakarta.enterprise.context.ApplicationScoped;
-import org.apache.camel.quarkus.core.JvmOnlyRecorder;
-import org.apache.camel.quarkus.jolokia.CamelQuarkusJolokiaServer;
-import org.apache.camel.quarkus.jolokia.JolokiaRecorder;
-import org.apache.camel.quarkus.jolokia.config.JolokiaBuildTimeConfig;
-import org.apache.camel.quarkus.jolokia.config.JolokiaRuntimeConfig;
-import org.jboss.logging.Logger;
-
-@BuildSteps(onlyIf = JolokiaProcessor.JolokiaEnabled.class)
-public class JolokiaProcessor {
- private static final Logger LOG = Logger.getLogger(JolokiaProcessor.class);
- private static final String FEATURE = "camel-jolokia";
-
- @BuildStep
- FeatureBuildItem feature() {
- return new FeatureBuildItem(FEATURE);
- }
-
- @BuildStep
- @Record(ExecutionTime.RUNTIME_INIT)
- JolokiaServerConfigBuildItem createJolokiaServerConfig(
- ApplicationInfoBuildItem applicationInfo,
- JolokiaBuildTimeConfig buildTimeConfig,
- JolokiaRuntimeConfig config,
- JolokiaRecorder recorder) {
- return new JolokiaServerConfigBuildItem(
- recorder.createJolokiaServerConfig(config,
buildTimeConfig.path(), applicationInfo.getName()));
- }
-
- @BuildStep
- @Record(ExecutionTime.RUNTIME_INIT)
- JolokiaServerBuildItem createJolokiaServer(
- JolokiaServerConfigBuildItem jolokiaServerConfig,
- JolokiaRecorder recorder) {
- return new
JolokiaServerBuildItem(recorder.createJolokiaServer(jolokiaServerConfig.getRuntimeValue()));
- }
-
- @BuildStep
- @Record(ExecutionTime.RUNTIME_INIT)
- void startJolokiaServer(
- JolokiaServerBuildItem jolokiaServer,
- JolokiaRuntimeConfig runtimeConfig,
- BuildProducer<SyntheticBeanBuildItem> syntheticBean,
- JolokiaRecorder recorder) {
- recorder.startJolokiaServer(jolokiaServer.getRuntimeValue(),
runtimeConfig);
-
syntheticBean.produce(SyntheticBeanBuildItem.configure(CamelQuarkusJolokiaServer.class)
- .scope(ApplicationScoped.class)
-
.runtimeValue(recorder.createJolokiaServerBean(jolokiaServer.getRuntimeValue()))
- .setRuntimeInit()
- .done());
- }
-
- @BuildStep(onlyIfNot = { IsNormal.class, IsDevelopment.class })
- @Record(ExecutionTime.RUNTIME_INIT)
- void registerJolokiaServerShutdownHook(
- JolokiaServerBuildItem jolokiaServer,
- ShutdownContextBuildItem shutdownContextBuildItem,
- JolokiaRecorder recorder) {
-
recorder.registerJolokiaServerShutdownHook(jolokiaServer.getRuntimeValue(),
shutdownContextBuildItem);
- }
-
- @BuildStep(onlyIf = JolokiaManagementEndpointEnabled.class)
- @Record(ExecutionTime.RUNTIME_INIT)
- void createManagementRoute(
- JolokiaServerConfigBuildItem jolokiaServerConfig,
- NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem,
- BodyHandlerBuildItem bodyHandler,
- Capabilities capabilities,
- BuildProducer<RouteBuildItem> routes,
- JolokiaBuildTimeConfig buildTimeConfig,
- JolokiaRecorder recorder) {
-
- if (capabilities.isPresent(Capability.VERTX_HTTP)) {
- String jolokiaEndpointPath =
nonApplicationRootPathBuildItem.resolvePath(buildTimeConfig.path());
- routes.produce(nonApplicationRootPathBuildItem.routeBuilder()
- .management()
- .routeFunction(buildTimeConfig.path() + "/*",
recorder.route(bodyHandler.getHandler()))
-
.handler(recorder.getHandler(jolokiaServerConfig.getRuntimeValue(),
jolokiaEndpointPath))
- .build());
- }
- }
-
- @BuildStep(onlyIf = { IsNormal.class, ExposeContainerPortEnabled.class })
- KubernetesPortBuildItem configureJolokiaKubernetesPort() {
- return KubernetesPortBuildItem.fromRuntimeConfiguration("jolokia",
"quarkus.camel.jolokia.server.port", 8778, true);
- }
-
- @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
- @Record(value = ExecutionTime.RUNTIME_INIT)
- void warnJvmInNative(JvmOnlyRecorder recorder) {
- JvmOnlyRecorder.warnJvmInNative(LOG, FEATURE);
- recorder.warnJvmInNative(FEATURE);
- }
-
- static final class JolokiaEnabled implements BooleanSupplier {
- JolokiaBuildTimeConfig config;
-
- @Override
- public boolean getAsBoolean() {
- return config.enabled();
- }
- }
-
- static final class JolokiaManagementEndpointEnabled implements
BooleanSupplier {
- JolokiaBuildTimeConfig config;
-
- @Override
- public boolean getAsBoolean() {
- return config.registerManagementEndpoint();
- }
- }
-
- static final class ExposeContainerPortEnabled implements BooleanSupplier {
- JolokiaBuildTimeConfig config;
-
- @Override
- public boolean getAsBoolean() {
- return config.kubernetes().exposeContainerPort();
- }
- }
-}
diff --git a/extensions-jvm/pom.xml b/extensions-jvm/pom.xml
index d3760bda0b..cd510e91fc 100644
--- a/extensions-jvm/pom.xml
+++ b/extensions-jvm/pom.xml
@@ -69,7 +69,6 @@
<module>jcr</module>
<module>jgroups</module>
<module>jgroups-raft</module>
- <module>jolokia</module>
<module>jooq</module>
<module>json-patch</module>
<module>jsonapi</module>
diff --git a/extensions-jvm/jolokia/deployment/pom.xml
b/extensions/jolokia/deployment/pom.xml
similarity index 100%
rename from extensions-jvm/jolokia/deployment/pom.xml
rename to extensions/jolokia/deployment/pom.xml
diff --git
a/extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
b/extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
new file mode 100644
index 0000000000..5e6a81d72e
--- /dev/null
+++
b/extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaProcessor.java
@@ -0,0 +1,287 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.jolokia.deployment;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.function.BooleanSupplier;
+import java.util.stream.Collectors;
+
+import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
+import io.quarkus.deployment.Capabilities;
+import io.quarkus.deployment.Capability;
+import io.quarkus.deployment.IsDevelopment;
+import io.quarkus.deployment.IsNormal;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.BuildSteps;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.ApplicationInfoBuildItem;
+import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
+import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.IndexDependencyBuildItem;
+import io.quarkus.deployment.builditem.NativeMonitoringBuildItem;
+import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
+import
io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
+import io.quarkus.deployment.pkg.NativeConfig;
+import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
+import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
+import io.quarkus.kubernetes.spi.KubernetesPortBuildItem;
+import io.quarkus.maven.dependency.ResolvedDependency;
+import io.quarkus.paths.PathFilter;
+import io.quarkus.paths.PathVisit;
+import io.quarkus.paths.PathVisitor;
+import io.quarkus.vertx.http.deployment.BodyHandlerBuildItem;
+import io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem;
+import io.quarkus.vertx.http.deployment.RouteBuildItem;
+import jakarta.enterprise.context.ApplicationScoped;
+import org.apache.camel.quarkus.jolokia.CamelQuarkusJolokiaServer;
+import org.apache.camel.quarkus.jolokia.JolokiaRecorder;
+import org.apache.camel.quarkus.jolokia.config.JolokiaBuildTimeConfig;
+import org.apache.camel.quarkus.jolokia.config.JolokiaRuntimeConfig;
+import org.apache.camel.quarkus.jolokia.restrictor.CamelJolokiaRestrictor;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.StringHelper;
+import org.jboss.jandex.ClassInfo;
+import org.jboss.jandex.DotName;
+import org.jolokia.server.core.service.api.LogHandler;
+import org.jolokia.server.core.service.api.Restrictor;
+import org.jolokia.server.core.service.impl.QuietLogHandler;
+import org.jolokia.server.core.service.serializer.Serializer;
+import org.jolokia.service.history.History;
+import org.jolokia.service.history.HistoryMBean;
+
+@BuildSteps(onlyIf = JolokiaProcessor.JolokiaEnabled.class)
+public class JolokiaProcessor {
+ private static final String FEATURE = "camel-jolokia";
+
+ @BuildStep
+ FeatureBuildItem feature() {
+ return new FeatureBuildItem(FEATURE);
+ }
+
+ @BuildStep
+ @Record(ExecutionTime.RUNTIME_INIT)
+ JolokiaServerConfigBuildItem createJolokiaServerConfig(
+ ApplicationInfoBuildItem applicationInfo,
+ JolokiaBuildTimeConfig buildTimeConfig,
+ JolokiaRuntimeConfig config,
+ JolokiaRecorder recorder) {
+ return new JolokiaServerConfigBuildItem(
+ recorder.createJolokiaServerConfig(config,
buildTimeConfig.path(), applicationInfo.getName()));
+ }
+
+ @BuildStep
+ @Record(ExecutionTime.RUNTIME_INIT)
+ JolokiaServerBuildItem createJolokiaServer(
+ JolokiaServerConfigBuildItem jolokiaServerConfig,
+ JolokiaRecorder recorder) {
+ return new
JolokiaServerBuildItem(recorder.createJolokiaServer(jolokiaServerConfig.getRuntimeValue()));
+ }
+
+ @BuildStep
+ @Record(ExecutionTime.RUNTIME_INIT)
+ void startJolokiaServer(
+ JolokiaServerBuildItem jolokiaServer,
+ JolokiaRuntimeConfig runtimeConfig,
+ BuildProducer<SyntheticBeanBuildItem> syntheticBean,
+ JolokiaRecorder recorder) {
+ recorder.startJolokiaServer(jolokiaServer.getRuntimeValue(),
runtimeConfig);
+
syntheticBean.produce(SyntheticBeanBuildItem.configure(CamelQuarkusJolokiaServer.class)
+ .scope(ApplicationScoped.class)
+
.runtimeValue(recorder.createJolokiaServerBean(jolokiaServer.getRuntimeValue()))
+ .setRuntimeInit()
+ .done());
+ }
+
+ @BuildStep(onlyIfNot = { IsNormal.class, IsDevelopment.class })
+ @Record(ExecutionTime.RUNTIME_INIT)
+ void registerJolokiaServerShutdownHook(
+ JolokiaServerBuildItem jolokiaServer,
+ ShutdownContextBuildItem shutdownContextBuildItem,
+ JolokiaRecorder recorder) {
+
recorder.registerJolokiaServerShutdownHook(jolokiaServer.getRuntimeValue(),
shutdownContextBuildItem);
+ }
+
+ @BuildStep(onlyIf = JolokiaManagementEndpointEnabled.class)
+ @Record(ExecutionTime.RUNTIME_INIT)
+ void createManagementRoute(
+ JolokiaServerConfigBuildItem jolokiaServerConfig,
+ NonApplicationRootPathBuildItem nonApplicationRootPathBuildItem,
+ BodyHandlerBuildItem bodyHandler,
+ Capabilities capabilities,
+ BuildProducer<RouteBuildItem> routes,
+ JolokiaBuildTimeConfig buildTimeConfig,
+ JolokiaRecorder recorder) {
+
+ if (capabilities.isPresent(Capability.VERTX_HTTP)) {
+ String jolokiaEndpointPath =
nonApplicationRootPathBuildItem.resolvePath(buildTimeConfig.path());
+ routes.produce(nonApplicationRootPathBuildItem.routeBuilder()
+ .management()
+ .routeFunction(buildTimeConfig.path() + "/*",
recorder.route(bodyHandler.getHandler()))
+
.handler(recorder.getHandler(jolokiaServerConfig.getRuntimeValue(),
jolokiaEndpointPath))
+ .build());
+ }
+ }
+
+ @BuildStep(onlyIf = { IsNormal.class, ExposeContainerPortEnabled.class })
+ KubernetesPortBuildItem configureJolokiaKubernetesPort() {
+ return KubernetesPortBuildItem.fromRuntimeConfiguration("jolokia",
"quarkus.camel.jolokia.server.port", 8778, true);
+ }
+
+ @BuildStep
+ IndexDependencyBuildItem indexJolokiaServerCore() {
+ return new IndexDependencyBuildItem("org.jolokia",
"jolokia-server-core");
+ }
+
+ @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
+ void jolokiaNativeSupport(
+ CombinedIndexBuildItem combinedIndex,
+ CurateOutcomeBuildItem curateOutcome,
+ BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+ BuildProducer<NativeImageResourceBuildItem> nativeImageResource,
+ BuildProducer<NativeMonitoringBuildItem> nativeMonitoring) {
+
+ // Enable JMX server, without this some Java runtime MBean attributes
& operations are not available
+ nativeMonitoring.produce(new
NativeMonitoringBuildItem(NativeConfig.MonitoringOption.JMXSERVER));
+
+ // Register Jolokia service support
+ configureJolokiaServiceNativeSupport(curateOutcome, reflectiveClass,
nativeImageResource);
+
+ // Register Jolokia MBean reflective support
+ reflectiveClass.produce(
+ ReflectiveClassBuildItem
+ .builder(Serializer.class, History.class,
HistoryMBean.class)
+ .methods(true)
+ .build());
+
+ // Register custom (non-OSGi) Jolokia Restrictor impls for reflection
+ Set<String> jolokiaRestrictorClasses = combinedIndex.getIndex()
+ .getAllKnownImplementors(Restrictor.class)
+ .stream()
+ .map(ClassInfo::name)
+ .map(DotName::toString)
+ .filter(className ->
!className.startsWith("org.jolokia.server.core.osgi"))
+ .collect(Collectors.toSet());
+
+ jolokiaRestrictorClasses.add(CamelJolokiaRestrictor.class.getName());
+
reflectiveClass.produce(ReflectiveClassBuildItem.builder(jolokiaRestrictorClasses.toArray(new
String[0])).build());
+
+ // Register custom LogHandler classes for reflection
+ Set<String> jolokiaLogHandlerClasses = combinedIndex.getIndex()
+ .getAllKnownImplementors(LogHandler.class)
+ .stream()
+ .map(ClassInfo::name)
+ .map(DotName::toString)
+ .filter(className -> !className.startsWith("org.jolokia"))
+ .collect(Collectors.toSet());
+
+ jolokiaLogHandlerClasses.add(QuietLogHandler.class.getName());
+
reflectiveClass.produce(ReflectiveClassBuildItem.builder(jolokiaLogHandlerClasses.toArray(new
String[0])).build());
+
+ // Include Jolokia static configuration defaults
+ nativeImageResource.produce(new
NativeImageResourceBuildItem("default-jolokia-agent.properties"));
+ nativeImageResource.produce(new
NativeImageResourceBuildItem("version.properties"));
+ }
+
+ private static void configureJolokiaServiceNativeSupport(
+ CurateOutcomeBuildItem curateOutcome,
+ BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
+ BuildProducer<NativeImageResourceBuildItem> nativeImageResource) {
+
+ Set<String> jolokiaServiceIncludes =
Collections.singleton("META-INF/jolokia/*");
+ PathFilter pathFilter = PathFilter.forIncludes(jolokiaServiceIncludes);
+
+ Set<ResolvedDependency> jolokiaDependencies =
curateOutcome.getApplicationModel()
+ .getRuntimeDependencies()
+ .stream()
+ .filter(dependency ->
dependency.getGroupId().equals("org.jolokia"))
+ .collect(Collectors.toUnmodifiableSet());
+
+ Set<String> jolokiaReflectiveClasses = new HashSet<>();
+ for (ResolvedDependency dependency : jolokiaDependencies) {
+ dependency.getContentTree(pathFilter).walk(new PathVisitor() {
+ @Override
+ public void visitPath(PathVisit visit) {
+ String resourcePath =
StringHelper.after(visit.getPath().toString(), "/");
+ nativeImageResource.produce(new
NativeImageResourceBuildItem(resourcePath));
+
+ try {
+ for (String line :
Files.readAllLines(visit.getPath())) {
+ if (ObjectHelper.isEmpty(line) ||
line.startsWith("#")) {
+ continue;
+ }
+
+ String serviceClass;
+ if (line.indexOf(',') > -1) {
+ serviceClass = line.substring(0,
line.indexOf(',')).trim();
+ } else {
+ serviceClass = line.trim();
+ }
+
+ jolokiaReflectiveClasses.add(serviceClass);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ }
+
+ if (!jolokiaReflectiveClasses.isEmpty()) {
+
reflectiveClass.produce(ReflectiveClassBuildItem.builder(jolokiaReflectiveClasses.toArray(new
String[0])).build());
+ }
+ }
+
+ @BuildStep
+ void registerServices(BuildProducer<ServiceProviderBuildItem>
serviceProvider) {
+
serviceProvider.produce(ServiceProviderBuildItem.allProvidersFromClassPath(Serializer.class.getName()));
+ }
+
+ static final class JolokiaEnabled implements BooleanSupplier {
+ JolokiaBuildTimeConfig config;
+
+ @Override
+ public boolean getAsBoolean() {
+ return config.enabled();
+ }
+ }
+
+ static final class JolokiaManagementEndpointEnabled implements
BooleanSupplier {
+ JolokiaBuildTimeConfig config;
+
+ @Override
+ public boolean getAsBoolean() {
+ return config.registerManagementEndpoint();
+ }
+ }
+
+ static final class ExposeContainerPortEnabled implements BooleanSupplier {
+ JolokiaBuildTimeConfig config;
+
+ @Override
+ public boolean getAsBoolean() {
+ return config.kubernetes().exposeContainerPort();
+ }
+ }
+}
diff --git
a/extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerBuildItem.java
b/extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerBuildItem.java
similarity index 100%
rename from
extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerBuildItem.java
rename to
extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerBuildItem.java
diff --git
a/extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerConfigBuildItem.java
b/extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerConfigBuildItem.java
similarity index 100%
rename from
extensions-jvm/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerConfigBuildItem.java
rename to
extensions/jolokia/deployment/src/main/java/org/apache/camel/quarkus/jolokia/deployment/JolokiaServerConfigBuildItem.java
diff --git
a/extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomContextPathTest.java
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomContextPathTest.java
similarity index 100%
rename from
extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomContextPathTest.java
rename to
extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomContextPathTest.java
diff --git
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomRestrictorDomainsTest.java
similarity index 73%
copy from
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
copy to
extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomRestrictorDomainsTest.java
index 526ac4b69d..f9824ddc2e 100644
---
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
+++
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaCustomRestrictorDomainsTest.java
@@ -14,29 +14,25 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.quarkus.component.jolokia.it;
+package org.apache.camel.quarkus.jolokia;
-import java.util.Map;
-
-import io.quarkus.test.junit.QuarkusTest;
-import io.quarkus.test.junit.QuarkusTestProfile;
-import io.quarkus.test.junit.TestProfile;
+import io.quarkus.test.QuarkusUnitTest;
import io.restassured.RestAssured;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
import static org.hamcrest.Matchers.equalTo;
-@TestProfile(JolokiaCustomRestrictorDomainsTest.JolokiaAdditionalPropertiesProfile.class)
-@QuarkusTest
class JolokiaCustomRestrictorDomainsTest {
- @BeforeEach
- public void beforeEach() {
- RestAssured.port = 8778;
- }
+ @RegisterExtension
+ static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
+ .withEmptyApplication()
+
.overrideConfigKey("quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains",
"org.apache.camel");
@Test
void customMBeanAllowDomains() {
+ RestAssured.port = 8778;
+
// Verify org.apache.camel domain allowed
RestAssured.given()
.get("/jolokia/read/org.apache.camel:context=camel-1,type=context,name=\"camel-1\"/CamelId")
@@ -62,11 +58,4 @@ class JolokiaCustomRestrictorDomainsTest {
.body(
"status", equalTo(403));
}
-
- public static final class JolokiaAdditionalPropertiesProfile implements
QuarkusTestProfile {
- @Override
- public Map<String, String> getConfigOverrides() {
- return
Map.of("quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains",
"org.apache.camel");
- }
- }
}
diff --git
a/extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaDisabledTest.java
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaDisabledTest.java
similarity index 100%
rename from
extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaDisabledTest.java
rename to
extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaDisabledTest.java
diff --git
a/extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaEnabledTest.java
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaEnabledTest.java
similarity index 100%
rename from
extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaEnabledTest.java
rename to
extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaEnabledTest.java
diff --git
a/extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaManagementEndpointDisabledTest.java
b/extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaManagementEndpointDisabledTest.java
similarity index 100%
rename from
extensions-jvm/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaManagementEndpointDisabledTest.java
rename to
extensions/jolokia/deployment/src/test/java/org/apache/camel/quarkus/jolokia/JolokiaManagementEndpointDisabledTest.java
diff --git a/extensions-jvm/jolokia/pom.xml b/extensions/jolokia/pom.xml
similarity index 96%
rename from extensions-jvm/jolokia/pom.xml
rename to extensions/jolokia/pom.xml
index 7984aea82b..8cba00c919 100644
--- a/extensions-jvm/jolokia/pom.xml
+++ b/extensions/jolokia/pom.xml
@@ -21,7 +21,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.camel.quarkus</groupId>
- <artifactId>camel-quarkus-extensions-jvm</artifactId>
+ <artifactId>camel-quarkus-extensions</artifactId>
<version>3.20.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
diff --git a/extensions-jvm/jolokia/runtime/pom.xml
b/extensions/jolokia/runtime/pom.xml
similarity index 98%
rename from extensions-jvm/jolokia/runtime/pom.xml
rename to extensions/jolokia/runtime/pom.xml
index 46737d640d..65fa1b4bfe 100644
--- a/extensions-jvm/jolokia/runtime/pom.xml
+++ b/extensions/jolokia/runtime/pom.xml
@@ -32,6 +32,7 @@
<properties>
<camel.quarkus.jvmSince>3.19.0</camel.quarkus.jvmSince>
+ <camel.quarkus.nativeSince>3.19.0</camel.quarkus.nativeSince>
</properties>
<dependencies>
diff --git a/extensions/jolokia/runtime/src/main/doc/limitations.adoc
b/extensions/jolokia/runtime/src/main/doc/limitations.adoc
new file mode 100644
index 0000000000..18de811134
--- /dev/null
+++ b/extensions/jolokia/runtime/src/main/doc/limitations.adoc
@@ -0,0 +1,5 @@
+=== Native mode limitations
+
+JMX in GraalVM is still *experimental*. Therefore, some features are not
available in native mode.
+
+Refer to the Camel Quarkus Management extension
xref:reference/extensions/management.adoc#extensions-management-limitations-native-mode[limitations]
section for more details.
diff --git a/extensions-jvm/jolokia/runtime/src/main/doc/usage.adoc
b/extensions/jolokia/runtime/src/main/doc/usage.adoc
similarity index 100%
rename from extensions-jvm/jolokia/runtime/src/main/doc/usage.adoc
rename to extensions/jolokia/runtime/src/main/doc/usage.adoc
diff --git
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
similarity index 100%
copy from
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
copy to
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
diff --git
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaServer.java
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaServer.java
similarity index 100%
rename from
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaServer.java
rename to
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaServer.java
diff --git
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
similarity index 92%
rename from
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
rename to
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
index ee7c7687bc..c2e1cf6ce5 100644
---
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
+++
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRecorder.java
@@ -45,6 +45,7 @@ import org.jboss.logging.Logger;
import org.jolokia.jvmagent.JolokiaServer;
import org.jolokia.jvmagent.JolokiaServerConfig;
import org.jolokia.server.core.config.ConfigKey;
+import org.jolokia.server.core.service.api.LogHandler;
import static io.smallrye.common.os.Linux.isWSL;
@@ -135,7 +136,13 @@ public class JolokiaRecorder {
public RuntimeValue<JolokiaServer>
createJolokiaServer(RuntimeValue<JolokiaServerConfig> serverConfig) {
try {
- CamelQuarkusJolokiaAgent agent = new
CamelQuarkusJolokiaAgent(serverConfig.getValue());
+ CamelQuarkusJolokiaAgent agent;
+ if
(serverConfig.getValue().getJolokiaConfig().containsKey(ConfigKey.LOGHANDLER_CLASS))
{
+ agent = new CamelQuarkusJolokiaAgent(serverConfig.getValue());
+ } else {
+ agent = new CamelQuarkusJolokiaAgent(serverConfig.getValue(),
new CamelQuarkusJolokiaLogHandler());
+ }
+
return new RuntimeValue<>(agent);
} catch (IOException e) {
throw new RuntimeException(e);
@@ -158,7 +165,11 @@ public class JolokiaRecorder {
static final class CamelQuarkusJolokiaAgent extends JolokiaServer {
CamelQuarkusJolokiaAgent(JolokiaServerConfig config) throws
IOException {
- super(config, new CamelQuarkusJolokiaLogHandler());
+ super(config);
+ }
+
+ CamelQuarkusJolokiaAgent(JolokiaServerConfig config, LogHandler
logHandler) throws IOException {
+ super(config, logHandler);
}
}
diff --git
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRequestRedirectHandler.java
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRequestRedirectHandler.java
similarity index 100%
rename from
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRequestRedirectHandler.java
rename to
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/JolokiaRequestRedirectHandler.java
diff --git
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
similarity index 100%
rename from
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
rename to
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaBuildTimeConfig.java
diff --git
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaRuntimeConfig.java
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaRuntimeConfig.java
similarity index 100%
rename from
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaRuntimeConfig.java
rename to
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/config/JolokiaRuntimeConfig.java
diff --git
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
b/extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
similarity index 100%
rename from
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
rename to
extensions/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/restrictor/CamelJolokiaRestrictor.java
diff --git
a/extensions-jvm/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
b/extensions/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
similarity index 97%
rename from
extensions-jvm/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
rename to
extensions/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
index 93c5bd3ca6..e83199059c 100644
---
a/extensions-jvm/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
+++
b/extensions/jolokia/runtime/src/main/resources/META-INF/quarkus-extension.yaml
@@ -26,9 +26,8 @@ description: "Expose runtime metrics and management
operations via JMX with Jolo
metadata:
icon-url:
"https://raw.githubusercontent.com/apache/camel-website/main/antora-ui-camel/src/img/logo-d.svg"
sponsor: "Apache Software Foundation"
- unlisted: true
guide:
"https://camel.apache.org/camel-quarkus/latest/reference/extensions/jolokia.html"
categories:
- "integration"
status:
- - "preview"
+ - "stable"
diff --git
a/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
b/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
index 5190026dc3..a6392da8cf 100644
---
a/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
+++
b/extensions/management/deployment/src/main/java/org/apache/camel/quarkus/component/management/deployment/ManagementProcessor.java
@@ -16,10 +16,17 @@
*/
package org.apache.camel.quarkus.component.management.deployment;
+import java.io.NotSerializableException;
+import java.io.ObjectStreamException;
import java.lang.reflect.Modifier;
import java.rmi.NotBoundException;
+import java.util.Collections;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.locks.AbstractOwnableSynchronizer;
+import java.util.concurrent.locks.AbstractQueuedSynchronizer;
+import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -40,9 +47,15 @@ import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.NativeMonitoringBuildItem;
+import io.quarkus.deployment.builditem.RemovedResourceBuildItem;
import
io.quarkus.deployment.builditem.nativeimage.NativeImageProxyDefinitionBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.deployment.pkg.NativeConfig;
+import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
+import io.quarkus.maven.dependency.ArtifactKey;
+import jakarta.transaction.NotSupportedException;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.RuntimeExchangeException;
import org.apache.camel.api.management.ManagedAttribute;
import org.apache.camel.api.management.ManagedNotification;
import org.apache.camel.api.management.ManagedNotifications;
@@ -67,15 +80,31 @@ class ManagementProcessor {
ManagedResource.class
};
private static final String[] SERIALIZATION_CLASSES = {
+ AbstractOwnableSynchronizer.class.getName(),
+ AbstractQueuedSynchronizer.class.getName(),
+ "java.util.concurrent.ConcurrentHashMap$CollectionView",
+ ConcurrentHashMap.class.getName(),
+ "java.util.concurrent.ConcurrentHashMap$KeySetView",
+ "java.util.concurrent.ConcurrentHashMap$Segment",
DescriptorSupport.class.getName(),
ModelMBeanAttributeInfo.class.getName(),
ModelMBeanInfoSupport.class.getName(),
ModelMBeanOperationInfo.class.getName(),
MBeanException.class.getName(),
MBeanServerNotification.class.getName(),
+ NoSuchMethodException.class.getName(),
NotBoundException.class.getName(),
+ NotSerializableException.class.getName(),
+ NotSupportedException.class.getName(),
Object.class.getName(),
ObjectInstance.class.getName(),
+ ObjectStreamException.class.getName(),
+ ReentrantLock.class.getName(),
+ "java.util.concurrent.locks.ReentrantLock$NonfairSync",
+ "java.util.concurrent.locks.ReentrantLock$Sync",
+ RuntimeCamelException.class.getName(),
+ RuntimeExchangeException.class.getName(),
+ "java.util.Collections$UnmodifiableSet",
};
@BuildStep
@@ -132,6 +161,13 @@ class ManagementProcessor {
return new
NativeMonitoringBuildItem(NativeConfig.MonitoringOption.JMXSERVER);
}
+ // TODO: Remove this https://github.com/apache/camel-quarkus/issues/7054
+ @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
+ RemovedResourceBuildItem removedResources() {
+ return new
RemovedResourceBuildItem(ArtifactKey.fromString("io.quarkus:quarkus-core"),
+
Collections.singleton("io/quarkus/runtime/graal/Target_javax_management_JMX.class"));
+ }
+
private Set<String> getManagedTypes(IndexView index, Predicate<ClassInfo>
typeFilter) {
return Stream.of(CAMEL_MANAGEMENT_ANNOTATIONS)
.flatMap(annotation ->
index.getAnnotations(annotation).stream())
diff --git a/extensions/management/runtime/src/main/doc/limitations.adoc
b/extensions/management/runtime/src/main/doc/limitations.adoc
new file mode 100644
index 0000000000..b1696f25eb
--- /dev/null
+++ b/extensions/management/runtime/src/main/doc/limitations.adoc
@@ -0,0 +1,6 @@
+=== Native mode
+
+JMX in GraalVM is still *experimental*. Therefore, some features are not
available in native mode.
+
+* Operations for MBean `java.lang:type=Threading` are not fully implemented.
Therefore, it is not possible to obtain details about application threads.
+* Various MBean attributes do not have their values implemented. For example,
the `ClassCount` attribute values for MBean `java.lang:type=ClassLoading` are
fixed at `0`
diff --git a/extensions/pom.xml b/extensions/pom.xml
index 63ffb06d9d..e3e8649111 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -148,6 +148,7 @@
<module>jfr</module>
<module>jira</module>
<module>jms</module>
+ <module>jolokia</module>
<module>jolt</module>
<module>joor</module>
<module>jpa</module>
diff --git a/integration-tests-jvm/pom.xml b/integration-tests-jvm/pom.xml
index 5c65077232..47b086967e 100644
--- a/integration-tests-jvm/pom.xml
+++ b/integration-tests-jvm/pom.xml
@@ -68,7 +68,6 @@
<module>jcr</module>
<module>jgroups</module>
<module>jgroups-raft</module>
- <module>jolokia</module>
<module>jooq</module>
<module>json-patch</module>
<module>jsonapi</module>
diff --git a/integration-tests-jvm/jolokia/pom.xml
b/integration-tests/jolokia/pom.xml
similarity index 84%
rename from integration-tests-jvm/jolokia/pom.xml
rename to integration-tests/jolokia/pom.xml
index 272d60d2f2..cae98b7e6c 100644
--- a/integration-tests-jvm/jolokia/pom.xml
+++ b/integration-tests/jolokia/pom.xml
@@ -127,6 +127,33 @@
</dependency>
</dependencies>
</profile>
+ <profile>
+ <id>native</id>
+ <activation>
+ <property>
+ <name>native</name>
+ </property>
+ </activation>
+ <properties>
+ <quarkus.native.enabled>true</quarkus.native.enabled>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
</profiles>
</project>
diff --git
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomLogHandler.java
similarity index 62%
rename from
extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
rename to
integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomLogHandler.java
index 3b66e757ea..747430525f 100644
---
a/extensions-jvm/jolokia/runtime/src/main/java/org/apache/camel/quarkus/jolokia/CamelQuarkusJolokiaLogHandler.java
+++
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomLogHandler.java
@@ -14,31 +14,36 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.camel.quarkus.jolokia;
+package org.apache.camel.quarkus.component.jolokia.it;
+
+import java.util.concurrent.atomic.AtomicBoolean;
-import org.jboss.logging.Logger;
import org.jolokia.server.core.service.api.LogHandler;
-final class CamelQuarkusJolokiaLogHandler implements LogHandler {
- private static final Logger LOG =
Logger.getLogger(CamelQuarkusJolokiaLogHandler.class);
+public class CustomLogHandler implements LogHandler {
+ public static AtomicBoolean MESSAGE_LOGGED = new AtomicBoolean(false);
@Override
- public void debug(String s) {
- LOG.debug(s);
+ public void debug(String message) {
+ MESSAGE_LOGGED.set(true);
}
@Override
- public void info(String s) {
- LOG.info(s);
+ public void info(String message) {
+ MESSAGE_LOGGED.set(true);
}
@Override
- public void error(String s, Throwable throwable) {
- LOG.error(s);
+ public void error(String message, Throwable t) {
+ MESSAGE_LOGGED.set(true);
}
@Override
public boolean isDebug() {
- return LOG.isDebugEnabled();
+ return true;
+ }
+
+ public static Boolean isMessageLogged() {
+ return MESSAGE_LOGGED.get();
}
}
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomRestrictor.java
similarity index 68%
copy from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to
integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomRestrictor.java
index 439d1155d4..65fa5bf047 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/CustomRestrictor.java
@@ -16,12 +16,19 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
-import org.apache.camel.builder.RouteBuilder;
+import javax.management.ObjectName;
-public class JolokiaRoutes extends RouteBuilder {
+import org.jolokia.server.core.restrictor.AllowAllRestrictor;
+
+/**
+ * Only allows MBean operation sendStringBody.
+ */
+public class CustomRestrictor extends AllowAllRestrictor {
@Override
- public void configure() throws Exception {
- from("direct:start")
- .to("seda:end");
+ public boolean isOperationAllowed(ObjectName pName, String pOperation) {
+ if (pOperation.startsWith("sendStringBody")) {
+ return true;
+ }
+ return false;
}
}
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
similarity index 86%
rename from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
rename to
integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
index f97be0810c..5b52d90446 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
+++
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaResource.java
@@ -23,6 +23,7 @@ import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
import org.apache.camel.ConsumerTemplate;
import org.apache.camel.quarkus.jolokia.CamelQuarkusJolokiaServer;
@@ -53,4 +54,11 @@ public class JolokiaResource {
public void stop() {
server.stop();
}
+
+ @Path("/custom/logger/activated")
+ @GET
+ public Response isCustomLoggerActivated() {
+ int statusCode = CustomLogHandler.isMessageLogged() ? 200 : 404;
+ return Response.status(statusCode).build();
+ }
}
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
similarity index 100%
copy from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to
integration-tests/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
diff --git
a/integration-tests/jolokia/src/main/resources/application.properties
b/integration-tests/jolokia/src/main/resources/application.properties
new file mode 100644
index 0000000000..6c0534afa0
--- /dev/null
+++ b/integration-tests/jolokia/src/main/resources/application.properties
@@ -0,0 +1,19 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements. See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License. You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+# Enable in all modes since native testing runs against prod mode and this
simplifies test assertions
+quarkus.camel.jolokia.server.discovery-enabled-mode=all
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesIT.java
similarity index 79%
copy from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesIT.java
index 439d1155d4..6b902ab018 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesIT.java
@@ -16,12 +16,8 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
-public class JolokiaRoutes extends RouteBuilder {
- @Override
- public void configure() throws Exception {
- from("direct:start")
- .to("seda:end");
- }
+@QuarkusIntegrationTest
+class JolokiaAdditionalPropertiesIT extends JolokiaAdditionalPropertiesTest {
}
diff --git
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
similarity index 100%
copy from
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
copy to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortIT.java
similarity index 79%
copy from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortIT.java
index 439d1155d4..ce064baade 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortIT.java
@@ -16,12 +16,8 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
-public class JolokiaRoutes extends RouteBuilder {
- @Override
- public void configure() throws Exception {
- from("direct:start")
- .to("seda:end");
- }
+@QuarkusIntegrationTest
+class JolokiaCustomHostPortIT extends JolokiaCustomHostPortTest {
}
diff --git
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortTest.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortTest.java
similarity index 100%
rename from
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortTest.java
rename to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomHostPortTest.java
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerIT.java
similarity index 79%
copy from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerIT.java
index 439d1155d4..108cf3ae9c 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerIT.java
@@ -16,12 +16,8 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
-public class JolokiaRoutes extends RouteBuilder {
- @Override
- public void configure() throws Exception {
- from("direct:start")
- .to("seda:end");
- }
+@QuarkusIntegrationTest
+class JolokiaCustomLogHandlerIT extends JolokiaCustomLogHandlerTest {
}
diff --git
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerTest.java
similarity index 66%
rename from
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
rename to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerTest.java
index 03d45d578c..2a5e1376c4 100644
---
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaAdditionalPropertiesTest.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomLogHandlerTest.java
@@ -16,38 +16,32 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
+import java.time.Duration;
import java.util.Map;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.QuarkusTestProfile;
import io.quarkus.test.junit.TestProfile;
import io.restassured.RestAssured;
-import org.junit.jupiter.api.BeforeEach;
+import org.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
-import static org.hamcrest.Matchers.equalTo;
-
-@TestProfile(JolokiaAdditionalPropertiesTest.JolokiaAdditionalPropertiesProfile.class)
+@TestProfile(JolokiaCustomLogHandlerTest.JolokiaCustomLogHandlerProfile.class)
@QuarkusTest
-class JolokiaAdditionalPropertiesTest {
- @BeforeEach
- public void beforeEach() {
- RestAssured.port = 8778;
- }
-
+class JolokiaCustomLogHandlerTest {
@Test
- void additionalProperties() {
- RestAssured.given()
- .get("/jolokia/")
- .then()
- .statusCode(200)
- .body("value.config.maxDepth", equalTo("10"));
+ void customLogHandler() {
+
Awaitility.await().pollInterval(Duration.ofMillis(250)).atMost(Duration.ofSeconds(10)).untilAsserted(()
-> {
+ RestAssured.get("/jolokia/custom/logger/activated")
+ .then()
+ .statusCode(200);
+ });
}
- public static final class JolokiaAdditionalPropertiesProfile implements
QuarkusTestProfile {
+ public static final class JolokiaCustomLogHandlerProfile implements
QuarkusTestProfile {
@Override
public Map<String, String> getConfigOverrides() {
- return
Map.of("quarkus.camel.jolokia.additional-properties.maxDepth", "10");
+ return
Map.of("quarkus.camel.jolokia.additional-properties.logHandlerClass",
CustomLogHandler.class.getName());
}
}
}
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorIT.java
similarity index 79%
copy from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorIT.java
index 439d1155d4..26162f4b4f 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorIT.java
@@ -16,12 +16,8 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
-public class JolokiaRoutes extends RouteBuilder {
- @Override
- public void configure() throws Exception {
- from("direct:start")
- .to("seda:end");
- }
+@QuarkusIntegrationTest
+class JolokiaCustomRestrictorIT extends JolokiaCustomRestrictorTest {
}
diff --git
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorTest.java
similarity index 52%
rename from
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
rename to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorTest.java
index 526ac4b69d..0b63f2c869 100644
---
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorDomainsTest.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaCustomRestrictorTest.java
@@ -22,51 +22,48 @@ import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.QuarkusTestProfile;
import io.quarkus.test.junit.TestProfile;
import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import static org.apache.camel.builder.Builder.body;
import static org.hamcrest.Matchers.equalTo;
-@TestProfile(JolokiaCustomRestrictorDomainsTest.JolokiaAdditionalPropertiesProfile.class)
+@TestProfile(JolokiaCustomRestrictorTest.JolokiaCustomRestrictorProfile.class)
@QuarkusTest
-class JolokiaCustomRestrictorDomainsTest {
+class JolokiaCustomRestrictorTest {
@BeforeEach
public void beforeEach() {
RestAssured.port = 8778;
}
@Test
- void customMBeanAllowDomains() {
- // Verify org.apache.camel domain allowed
+ void customRestrictorDeniesOperationAccess() {
+ // sendStringBody operations should be allowed
+ String sendStringBodyPayload =
"{\"type\":\"exec\",\"mbean\":\"org.apache.camel:context=camel-1,type=context,name=\\\"camel-1\\\"\",\"operation\":\"sendStringBody(java.lang.String,
java.lang.String)\",\"arguments\":[\"direct://start\",\"Hello World\"]}";
RestAssured.given()
-
.get("/jolokia/read/org.apache.camel:context=camel-1,type=context,name=\"camel-1\"/CamelId")
+ .contentType(ContentType.JSON)
+ .body(sendStringBodyPayload)
+ .post("/jolokia/")
.then()
.statusCode(200)
- .body(
- "status", equalTo(200),
- "value", equalTo("camel-1"));
+ .body("status", equalTo(200));
- // Verify java.lang domain disallowed
+ // All other operations should be disallowed
+ String dumpRoutesAsXmlPayload =
"{\"type\":\"exec\",\"mbean\":\"org.apache.camel:context=camel-1,type=context,name=\\\"camel-1\\\"\",\"operation\":\"dumpRoutesAsXml()\",\"arguments\":[]}";
RestAssured.given()
-
.get("/jolokia/read/java.lang:type=ClassLoading/LoadedClassCount")
+ .contentType(ContentType.JSON)
+ .body(dumpRoutesAsXmlPayload)
+ .post("/jolokia/")
.then()
.statusCode(200)
- .body(
- "status", equalTo(403));
-
- // Verify java.nio domain disallowed
- RestAssured.given()
-
.get("/jolokia/read/java.nio:type=BufferPool,name=direct/MemoryUsed")
- .then()
- .statusCode(200)
- .body(
- "status", equalTo(403));
+ .body("status", equalTo(403));
}
- public static final class JolokiaAdditionalPropertiesProfile implements
QuarkusTestProfile {
+ public static final class JolokiaCustomRestrictorProfile implements
QuarkusTestProfile {
@Override
public Map<String, String> getConfigOverrides() {
- return
Map.of("quarkus.camel.jolokia.camel-restrictor-allowed-mbean-domains",
"org.apache.camel");
+ return
Map.of("quarkus.camel.jolokia.additional-properties.restrictorClass",
CustomRestrictor.class.getName());
}
}
}
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartIT.java
similarity index 79%
copy from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartIT.java
index 439d1155d4..5473e7ac7b 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartIT.java
@@ -16,12 +16,8 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
-public class JolokiaRoutes extends RouteBuilder {
- @Override
- public void configure() throws Exception {
- from("direct:start")
- .to("seda:end");
- }
+@QuarkusIntegrationTest
+class JolokiaDisableAutoStartIT extends JolokiaDisableAutoStartTest {
}
diff --git
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartTest.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartTest.java
similarity index 100%
rename from
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartTest.java
rename to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableAutoStartTest.java
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorIT.java
similarity index 79%
copy from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorIT.java
index 439d1155d4..5c841f6f92 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorIT.java
@@ -16,12 +16,8 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
-public class JolokiaRoutes extends RouteBuilder {
- @Override
- public void configure() throws Exception {
- from("direct:start")
- .to("seda:end");
- }
+@QuarkusIntegrationTest
+class JolokiaDisableRestrictorIT extends JolokiaDisableRestrictorTest {
}
diff --git
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorTest.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorTest.java
similarity index 100%
rename from
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorTest.java
rename to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDisableRestrictorTest.java
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledIT.java
similarity index 79%
copy from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledIT.java
index 439d1155d4..1226fd5490 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledIT.java
@@ -16,12 +16,8 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
-public class JolokiaRoutes extends RouteBuilder {
- @Override
- public void configure() throws Exception {
- from("direct:start")
- .to("seda:end");
- }
+@QuarkusIntegrationTest
+class JolokiaDiscoveryDisabledIT extends JolokiaDiscoveryDisabledTest {
}
diff --git
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledTest.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledTest.java
similarity index 100%
rename from
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledTest.java
rename to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaDiscoveryDisabledTest.java
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaIT.java
similarity index 79%
copy from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
copy to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaIT.java
index 439d1155d4..497e052474 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaIT.java
@@ -16,12 +16,9 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
+
+@QuarkusIntegrationTest
+class JolokiaIT extends JolokiaTest {
-public class JolokiaRoutes extends RouteBuilder {
- @Override
- public void configure() throws Exception {
- from("direct:start")
- .to("seda:end");
- }
}
diff --git
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLIT.java
similarity index 79%
rename from
integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
rename to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLIT.java
index 439d1155d4..7b218e7a0c 100644
---
a/integration-tests-jvm/jolokia/src/main/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaRoutes.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLIT.java
@@ -16,12 +16,8 @@
*/
package org.apache.camel.quarkus.component.jolokia.it;
-import org.apache.camel.builder.RouteBuilder;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
-public class JolokiaRoutes extends RouteBuilder {
- @Override
- public void configure() throws Exception {
- from("direct:start")
- .to("seda:end");
- }
+@QuarkusIntegrationTest
+class JolokiaKubernetesClientSSLIT extends JolokiaKubernetesClientSSLTest {
}
diff --git
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLTest.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLTest.java
similarity index 100%
rename from
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLTest.java
rename to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaKubernetesClientSSLTest.java
diff --git
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
similarity index 85%
rename from
integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
rename to
integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
index 6b3c686941..6ea2d18e07 100644
---
a/integration-tests-jvm/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
+++
b/integration-tests/jolokia/src/test/java/org/apache/camel/quarkus/component/jolokia/it/JolokiaTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.quarkus.component.jolokia.it;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
+import io.restassured.path.json.JsonPath;
import org.apache.camel.quarkus.jolokia.restrictor.CamelJolokiaRestrictor;
import org.eclipse.microprofile.config.ConfigProvider;
import org.junit.jupiter.api.BeforeEach;
@@ -26,6 +27,8 @@ import org.junit.jupiter.api.Test;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.matchesPattern;
+import static org.junit.jupiter.api.Assertions.assertTrue;
@QuarkusTest
class JolokiaTest {
@@ -45,7 +48,7 @@ class JolokiaTest {
"value.config.discoveryEnabled", equalTo("true"),
"value.config.restrictorClass",
equalTo(CamelJolokiaRestrictor.class.getName()),
"value.config.agentDescription",
equalTo("camel-quarkus-integration-test-jolokia"),
- "value.details.url",
equalTo("http://127.0.0.1:8778/jolokia/"));
+ "value.details.url",
matchesPattern("http://.*:8778/jolokia/"));
}
@Test
@@ -79,13 +82,19 @@ class JolokiaTest {
"value", greaterThanOrEqualTo(0));
// Verify java.nio domain
- RestAssured.given()
+ JsonPath response = RestAssured.given()
.get("/jolokia/read/java.nio:type=BufferPool,name=direct/MemoryUsed")
.then()
.statusCode(200)
- .body(
- "status", equalTo(200),
- "value", greaterThanOrEqualTo(0));
+ .extract()
+ .body()
+ .jsonPath();
+
+ // java.nio MBeans are not available in native mode so the Jolokia
status must be checked
+ int status = response.getInt("status");
+ if (status == 200) {
+ assertTrue(response.getInt("value") >= 0);
+ }
// Disallowed domain
RestAssured.given()
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index bd7004633f..eed4141ab6 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -129,6 +129,7 @@
<module>jms-artemis-ra</module>
<module>jms-ibmmq-client</module>
<module>jms-qpid-amqp-client</module>
+ <module>jolokia</module>
<module>jolt</module>
<module>joor</module>
<module>jpa</module>
diff --git a/tooling/scripts/test-categories.yaml
b/tooling/scripts/test-categories.yaml
index 8f21c3ca9c..31463339e8 100644
--- a/tooling/scripts/test-categories.yaml
+++ b/tooling/scripts/test-categories.yaml
@@ -177,6 +177,7 @@ group-10:
- fop
- google-secret-manager
- groovy
+ - jolokia
- joor
- mail
- main-unknown-args-fail