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 <jamesnether...@gmail.com> 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