You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/05/11 12:38:50 UTC

[camel] branch main updated: CAMEL-18085 Introduction of ManagementMBeansLevel (#7584)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new c0de8c957ce CAMEL-18085 Introduction of ManagementMBeansLevel (#7584)
c0de8c957ce is described below

commit c0de8c957ce1d319b38568fa5e4f892bda625ab1
Author: JiriOndrusek <on...@gmail.com>
AuthorDate: Wed May 11 14:38:41 2022 +0200

    CAMEL-18085 Introduction of ManagementMBeansLevel (#7584)
---
 .../main/camel-main-configuration-metadata.json    |  1 +
 .../resources/org/apache/camel/jaxb.index          |  1 +
 .../org/apache/camel/ManagementMBeansLevel.java    | 38 ++++++++++
 .../java/org/apache/camel/spi/ManagementAgent.java | 20 ++++-
 .../MainConfigurationPropertiesConfigurer.java     |  6 ++
 .../camel-main-configuration-metadata.json         |  1 +
 core/camel-main/src/main/docs/main.adoc            |  3 +-
 .../camel/main/DefaultConfigurationProperties.java | 26 +++++++
 .../camel/management/DefaultManagementAgent.java   | 12 +++
 .../management/JmxManagementLifecycleStrategy.java | 10 +++
 .../ManagedMBeansAndStatisticsConflictTest.java    | 51 +++++++++++++
 .../ManagedMBeansLevelContextOnlyTest.java         | 42 +++++++++++
 ...edMBeansLevelContextOnlyWithAddedRouteTest.java | 71 ++++++++++++++++++
 .../management/ManagedMBeansLevelDefaultTest.java  | 41 +++++++++++
 ...anagedMBeansLevelDefaultWithAddedRouteTest.java | 76 +++++++++++++++++++
 .../ManagedMBeansLevelRoutesOnlyTest.java          | 42 +++++++++++
 .../management/ManagedMBeansLevelTestSupport.java  | 86 ++++++++++++++++++++++
 docs/user-manual/modules/ROOT/pages/jmx.adoc       | 13 ++++
 18 files changed, 538 insertions(+), 2 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index 668d2cf6ae3..d6df43111f8 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -53,6 +53,7 @@
     { "name": "camel.main.javaRoutesExcludePattern", "description": "Used for exclusive filtering RouteBuilder classes which are collected from the registry or via classpath scanning. The exclusive filtering takes precedence over inclusive filtering. The pattern is using Ant-path style pattern. Multiple patterns can be specified separated by comma. For example to exclude all classes starting with Bar use: &#42;&#42;\/Bar&#42; To exclude all routes form a specific package use: com\/mycomp [...]
     { "name": "camel.main.javaRoutesIncludePattern", "description": "Used for inclusive filtering RouteBuilder classes which are collected from the registry or via classpath scanning. The exclusive filtering takes precedence over inclusive filtering. The pattern is using Ant-path style pattern. Multiple patterns can be specified separated by comma. Multiple patterns can be specified separated by comma. For example to include all classes starting with Foo use: &#42;&#42;\/Foo To include a [...]
     { "name": "camel.main.jmxEnabled", "description": "Enable JMX in your Camel application.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.jmxManagementMBeansLevel", "description": "Sets the mbeans registration level. The default value is Default.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "object", "javaType": "org.apache.camel.ManagementMBeansLevel", "defaultValue": "Default" },
     { "name": "camel.main.jmxManagementNamePattern", "description": "The naming pattern for creating the CamelContext JMX management name. The default pattern is #name#", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "#name#" },
     { "name": "camel.main.jmxManagementStatisticsLevel", "description": "Sets the JMX statistics level, the level can be set to Extended to gather additional information The default value is Default.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "object", "javaType": "org.apache.camel.ManagementStatisticsLevel", "defaultValue": "Default", "enum": [ "Extended", "Default", "RoutesOnly", "Off" ] },
     { "name": "camel.main.lightweight", "description": "Configure the context to be lightweight. This will trigger some optimizations and memory reduction options. Lightweight context have some limitations. At this moment, dynamic endpoint destinations are not supported.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
diff --git a/core/camel-api/src/generated/resources/org/apache/camel/jaxb.index b/core/camel-api/src/generated/resources/org/apache/camel/jaxb.index
index 6d9b86e4fef..60b154c6a8f 100644
--- a/core/camel-api/src/generated/resources/org/apache/camel/jaxb.index
+++ b/core/camel-api/src/generated/resources/org/apache/camel/jaxb.index
@@ -2,6 +2,7 @@
 BeanScope
 ExchangePattern
 LoggingLevel
+ManagementMBeansLevel
 ManagementStatisticsLevel
 ShutdownRoute
 ShutdownRunningTask
diff --git a/core/camel-api/src/main/java/org/apache/camel/ManagementMBeansLevel.java b/core/camel-api/src/main/java/org/apache/camel/ManagementMBeansLevel.java
new file mode 100644
index 00000000000..421b374796a
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/ManagementMBeansLevel.java
@@ -0,0 +1,38 @@
+/*
+ * 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;
+
+import javax.xml.bind.annotation.XmlEnum;
+
+/**
+ * Level of mbeans for registration
+ */
+@XmlEnum
+public enum ManagementMBeansLevel {
+
+    ContextOnly,
+    RoutesOnly,
+    Default;
+
+    public boolean isRoutes() {
+        return ordinal() == Default.ordinal() || ordinal() == RoutesOnly.ordinal();
+    }
+
+    public boolean isProcessors() {
+        return ordinal() == Default.ordinal();
+    }
+}
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java b/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java
index fad1c618206..199ddb88fde 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java
@@ -20,6 +20,7 @@ import javax.management.JMException;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.apache.camel.ManagementMBeansLevel;
 import org.apache.camel.ManagementStatisticsLevel;
 import org.apache.camel.Service;
 
@@ -294,6 +295,23 @@ public interface ManagementAgent extends Service {
      */
     ManagementStatisticsLevel getStatisticsLevel();
 
+    /**
+     * Sets the mbeans registration level
+     * <p/>
+     * Default is {@link org.apache.camel.ManagementMBeansLevel#Default}
+     * <p/>
+     *
+     * @param level the new level
+     */
+    void setMBeansLevel(ManagementMBeansLevel level);
+
+    /**
+     * ยง Gets the mbeans registration level
+     *
+     * @return the level
+     */
+    ManagementMBeansLevel getMBeansLevel();
+
     /**
      * Gets whether host IP Address to be used instead of host name.
      *
@@ -303,7 +321,7 @@ public interface ManagementAgent extends Service {
 
     /**
      * Sets whether to use host IP Address
-     * 
+     *
      * @param useHostIPAddress <tt>true</tt> to use IP Address.
      */
     void setUseHostIPAddress(Boolean useHostIPAddress);
diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
index 8d2e873c166..5a2510cda73 100644
--- a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
+++ b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
@@ -101,6 +101,8 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "JavaRoutesIncludePattern": target.setJavaRoutesIncludePattern(property(camelContext, java.lang.String.class, value)); return true;
         case "jmxenabled":
         case "JmxEnabled": target.setJmxEnabled(property(camelContext, boolean.class, value)); return true;
+        case "jmxmanagementmbeanslevel":
+        case "JmxManagementMBeansLevel": target.setJmxManagementMBeansLevel(property(camelContext, org.apache.camel.ManagementMBeansLevel.class, value)); return true;
         case "jmxmanagementnamepattern":
         case "JmxManagementNamePattern": target.setJmxManagementNamePattern(property(camelContext, java.lang.String.class, value)); return true;
         case "jmxmanagementstatisticslevel":
@@ -332,6 +334,8 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "JavaRoutesIncludePattern": return java.lang.String.class;
         case "jmxenabled":
         case "JmxEnabled": return boolean.class;
+        case "jmxmanagementmbeanslevel":
+        case "JmxManagementMBeansLevel": return org.apache.camel.ManagementMBeansLevel.class;
         case "jmxmanagementnamepattern":
         case "JmxManagementNamePattern": return java.lang.String.class;
         case "jmxmanagementstatisticslevel":
@@ -564,6 +568,8 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "JavaRoutesIncludePattern": return target.getJavaRoutesIncludePattern();
         case "jmxenabled":
         case "JmxEnabled": return target.isJmxEnabled();
+        case "jmxmanagementmbeanslevel":
+        case "JmxManagementMBeansLevel": return target.getJmxManagementMBeansLevel();
         case "jmxmanagementnamepattern":
         case "JmxManagementNamePattern": return target.getJmxManagementNamePattern();
         case "jmxmanagementstatisticslevel":
diff --git a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index 668d2cf6ae3..d6df43111f8 100644
--- a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -53,6 +53,7 @@
     { "name": "camel.main.javaRoutesExcludePattern", "description": "Used for exclusive filtering RouteBuilder classes which are collected from the registry or via classpath scanning. The exclusive filtering takes precedence over inclusive filtering. The pattern is using Ant-path style pattern. Multiple patterns can be specified separated by comma. For example to exclude all classes starting with Bar use: &#42;&#42;\/Bar&#42; To exclude all routes form a specific package use: com\/mycomp [...]
     { "name": "camel.main.javaRoutesIncludePattern", "description": "Used for inclusive filtering RouteBuilder classes which are collected from the registry or via classpath scanning. The exclusive filtering takes precedence over inclusive filtering. The pattern is using Ant-path style pattern. Multiple patterns can be specified separated by comma. Multiple patterns can be specified separated by comma. For example to include all classes starting with Foo use: &#42;&#42;\/Foo To include a [...]
     { "name": "camel.main.jmxEnabled", "description": "Enable JMX in your Camel application.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
+    { "name": "camel.main.jmxManagementMBeansLevel", "description": "Sets the mbeans registration level. The default value is Default.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "object", "javaType": "org.apache.camel.ManagementMBeansLevel", "defaultValue": "Default" },
     { "name": "camel.main.jmxManagementNamePattern", "description": "The naming pattern for creating the CamelContext JMX management name. The default pattern is #name#", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "#name#" },
     { "name": "camel.main.jmxManagementStatisticsLevel", "description": "Sets the JMX statistics level, the level can be set to Extended to gather additional information The default value is Default.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "object", "javaType": "org.apache.camel.ManagementStatisticsLevel", "defaultValue": "Default", "enum": [ "Extended", "Default", "RoutesOnly", "Off" ] },
     { "name": "camel.main.lightweight", "description": "Configure the context to be lightweight. This will trigger some optimizations and memory reduction options. Lightweight context have some limitations. At this moment, dynamic endpoint destinations are not supported.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": "false" },
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index a9c5d2f5712..a387bd9e338 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -18,7 +18,7 @@ The following tables lists all the options:
 
 // main options: START
 === Camel Main configurations
-The camel.main supports 112 options, which are listed below.
+The camel.main supports 113 options, which are listed below.
 
 [width="100%",cols="2,5,^1,2",options="header"]
 |===
@@ -63,6 +63,7 @@ The camel.main supports 112 options, which are listed below.
 | *camel.main.javaRoutesExclude{zwsp}Pattern* | Used for exclusive filtering RouteBuilder classes which are collected from the registry or via classpath scanning. The exclusive filtering takes precedence over inclusive filtering. The pattern is using Ant-path style pattern. Multiple patterns can be specified separated by comma. For example to exclude all classes starting with Bar use: &#42;&#42;/Bar&#42; To exclude all routes form a specific package use: com/mycompany/bar/&#42; To exclud [...]
 | *camel.main.javaRoutesInclude{zwsp}Pattern* | Used for inclusive filtering RouteBuilder classes which are collected from the registry or via classpath scanning. The exclusive filtering takes precedence over inclusive filtering. The pattern is using Ant-path style pattern. Multiple patterns can be specified separated by comma. Multiple patterns can be specified separated by comma. For example to include all classes starting with Foo use: &#42;&#42;/Foo To include all routes form a speci [...]
 | *camel.main.jmxEnabled* | Enable JMX in your Camel application. | true | boolean
+| *camel.main.jmxManagementMBeans{zwsp}Level* | Sets the mbeans registration level. The default value is Default. | Default | ManagementMBeansLevel
 | *camel.main.jmxManagementName{zwsp}Pattern* | The naming pattern for creating the CamelContext JMX management name. The default pattern is #name# | #name# | String
 | *camel.main.jmxManagement{zwsp}StatisticsLevel* | Sets the JMX statistics level, the level can be set to Extended to gather additional information The default value is Default. | Default | ManagementStatisticsLevel
 | *camel.main.lightweight* | Configure the context to be lightweight. This will trigger some optimizations and memory reduction options. Lightweight context have some limitations. At this moment, dynamic endpoint destinations are not supported. | false | boolean
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
index d1245f02606..3da030fb362 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
@@ -20,6 +20,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.camel.LoggingLevel;
+import org.apache.camel.ManagementMBeansLevel;
 import org.apache.camel.ManagementStatisticsLevel;
 import org.apache.camel.StartupSummaryLevel;
 import org.apache.camel.spi.Metadata;
@@ -88,6 +89,8 @@ public abstract class DefaultConfigurationProperties<T> {
     private boolean useBreadcrumb;
     private boolean beanPostProcessorEnabled = true;
     @Metadata(defaultValue = "Default")
+    private ManagementMBeansLevel jmxManagementMBeansLevel = ManagementMBeansLevel.Default;
+    @Metadata(defaultValue = "Default")
     private ManagementStatisticsLevel jmxManagementStatisticsLevel = ManagementStatisticsLevel.Default;
     private String jmxManagementNamePattern = "#name#";
     private boolean useMdcLogging;
@@ -842,6 +845,19 @@ public abstract class DefaultConfigurationProperties<T> {
         this.beanPostProcessorEnabled = beanPostProcessorEnabled;
     }
 
+    public ManagementMBeansLevel getJmxManagementMBeansLevel() {
+        return jmxManagementMBeansLevel;
+    }
+
+    /**
+     * Sets the mbeans registration level.
+     *
+     * The default value is Default.
+     */
+    public void setJmxManagementMBeansLevel(ManagementMBeansLevel jmxManagementMBeansLevel) {
+        this.jmxManagementMBeansLevel = jmxManagementMBeansLevel;
+    }
+
     public ManagementStatisticsLevel getJmxManagementStatisticsLevel() {
         return jmxManagementStatisticsLevel;
     }
@@ -1977,6 +1993,16 @@ public abstract class DefaultConfigurationProperties<T> {
         return (T) this;
     }
 
+    /**
+     * Sets the mbeans registration level.
+     *
+     * The default value is Default.
+     */
+    public T withJmxManagementMBeansLevel(ManagementMBeansLevel jmxManagementMBeansLevel) {
+        this.jmxManagementMBeansLevel = jmxManagementMBeansLevel;
+        return (T) this;
+    }
+
     /**
      * Sets the JMX statistics level The level can be set to Extended to gather additional information
      *
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java b/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
index 9b7f783eda6..8830df36a4d 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/DefaultManagementAgent.java
@@ -34,6 +34,7 @@ import javax.management.ObjectName;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.ManagementMBeansLevel;
 import org.apache.camel.ManagementStatisticsLevel;
 import org.apache.camel.api.management.JmxSystemPropertyKeys;
 import org.apache.camel.spi.ManagementAgent;
@@ -74,6 +75,7 @@ public class DefaultManagementAgent extends ServiceSupport implements Management
     private Boolean useHostIPAddress = false;
     private String managementNamePattern = "#name#";
     private ManagementStatisticsLevel statisticsLevel = ManagementStatisticsLevel.Default;
+    private ManagementMBeansLevel mBeansLevel = ManagementMBeansLevel.Default;
 
     public DefaultManagementAgent() {
     }
@@ -286,6 +288,16 @@ public class DefaultManagementAgent extends ServiceSupport implements Management
         this.statisticsLevel = statisticsLevel;
     }
 
+    @Override
+    public ManagementMBeansLevel getMBeansLevel() {
+        return mBeansLevel;
+    }
+
+    @Override
+    public void setMBeansLevel(ManagementMBeansLevel mBeansLevel) {
+        this.mBeansLevel = mBeansLevel;
+    }
+
     @Override
     public CamelContext getCamelContext() {
         return camelContext;
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
index b415b93d02e..63608f9378e 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/JmxManagementLifecycleStrategy.java
@@ -829,6 +829,11 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
      * Should the given processor be registered.
      */
     protected boolean registerProcessor(ProcessorDefinition<?> processor) {
+
+        //skip processors according the ManagementMBeansLevel
+        if (!getManagementStrategy().getManagementAgent().getMBeansLevel().isProcessors()) {
+            return false;
+        }
         // skip on exception
         if (processor instanceof OnExceptionDefinition) {
             return false;
@@ -914,6 +919,11 @@ public class JmxManagementLifecycleStrategy extends ServiceSupport implements Li
 
         LOG.trace("Checking whether to register {} from route: {}", service, route);
 
+        //skip route according the ManagementMBeansLevel
+        if (!getManagementStrategy().getManagementAgent().getMBeansLevel().isRoutes()) {
+            return false;
+        }
+
         ManagementAgent agent = getManagementStrategy().getManagementAgent();
         if (agent == null) {
             // do not register if no agent
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansAndStatisticsConflictTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansAndStatisticsConflictTest.java
new file mode 100644
index 00000000000..11a0c8ee5b3
--- /dev/null
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansAndStatisticsConflictTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.management;
+
+import java.util.Set;
+
+import javax.management.ObjectName;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ManagementMBeansLevel;
+import org.apache.camel.ManagementStatisticsLevel;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@DisabledOnOs(OS.AIX)
+public class ManagedMBeansAndStatisticsConflictTest extends ManagedMBeansLevelTestSupport {
+
+    public ManagedMBeansAndStatisticsConflictTest() {
+        super(ManagementMBeansLevel.ContextOnly);
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.getManagementStrategy().getManagementAgent().setStatisticsLevel(ManagementStatisticsLevel.RoutesOnly);
+        return context;
+    }
+
+    @Override
+    void assertResults(Set<ObjectName> contexts, Set<ObjectName> routes, Set<ObjectName> processors) {
+        assertEquals(1, contexts.size());
+        assertEquals(0, routes.size());
+        assertEquals(0, processors.size());
+    }
+}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelContextOnlyTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelContextOnlyTest.java
new file mode 100644
index 00000000000..b2816df0357
--- /dev/null
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelContextOnlyTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.management;
+
+import java.util.Set;
+
+import javax.management.ObjectName;
+
+import org.apache.camel.ManagementMBeansLevel;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@DisabledOnOs(OS.AIX)
+public class ManagedMBeansLevelContextOnlyTest extends ManagedMBeansLevelTestSupport {
+
+    public ManagedMBeansLevelContextOnlyTest() {
+        super(ManagementMBeansLevel.ContextOnly);
+    }
+
+    @Override
+    void assertResults(Set<ObjectName> contexts, Set<ObjectName> routes, Set<ObjectName> processors) {
+        assertEquals(1, contexts.size());
+        assertEquals(0, routes.size());
+        assertEquals(0, processors.size());
+    }
+}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelContextOnlyWithAddedRouteTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelContextOnlyWithAddedRouteTest.java
new file mode 100644
index 00000000000..1480c5fabe3
--- /dev/null
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelContextOnlyWithAddedRouteTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.management;
+
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.apache.camel.ManagementMBeansLevel;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+/**
+ * Tests that mbeans for routes and processors are NOT added after addition of a 2nd route after CamelContext has been
+ * started, because the mbeansLevel is set to contextOnly.
+ */
+@DisabledOnOs(OS.AIX)
+public class ManagedMBeansLevelContextOnlyWithAddedRouteTest extends ManagedMBeansLevelTestSupport {
+
+    public ManagedMBeansLevelContextOnlyWithAddedRouteTest() {
+        super(ManagementMBeansLevel.ContextOnly);
+    }
+
+    @Override
+    void assertResults(Set<ObjectName> contexts, Set<ObjectName> routes, Set<ObjectName> processors) {
+        assertEquals(1, contexts.size());
+        assertEquals(0, routes.size());
+        assertEquals(0, processors.size());
+    }
+
+    @Test
+    @Override
+    public void test() throws Exception {
+        MBeanServer mbeanServer = getMBeanServer();
+        //test state after before adding a new route
+        assertMBeans(mbeanServer);
+
+        log.info(">>>>>>>>>>>>>>>>> adding 2nd route <<<<<<<<<<<<<<");
+        // add a 2nd route
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:bar").routeId("bar").to("mock:bar");
+            }
+        });
+        log.info(">>>>>>>>>>>>>>>>> adding 2nd route DONE <<<<<<<<<<<<<<");
+
+        //no route or processor MBean should be created
+        assertMBeans(mbeanServer);
+    }
+
+}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelDefaultTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelDefaultTest.java
new file mode 100644
index 00000000000..9e685a0add4
--- /dev/null
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelDefaultTest.java
@@ -0,0 +1,41 @@
+/*
+ * 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.management;
+
+import java.util.Set;
+
+import javax.management.ObjectName;
+
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@DisabledOnOs(OS.AIX)
+public class ManagedMBeansLevelDefaultTest extends ManagedMBeansLevelTestSupport {
+
+    public ManagedMBeansLevelDefaultTest() {
+        super(null);
+    }
+
+    @Override
+    void assertResults(Set<ObjectName> contexts, Set<ObjectName> routes, Set<ObjectName> processors) {
+        assertEquals(1, contexts.size());
+        assertEquals(1, routes.size());
+        assertEquals(1, processors.size());
+    }
+}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelDefaultWithAddedRouteTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelDefaultWithAddedRouteTest.java
new file mode 100644
index 00000000000..704b2557428
--- /dev/null
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelDefaultWithAddedRouteTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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.management;
+
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import org.apache.camel.ManagementMBeansLevel;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+/**
+ * Tests that mbeans for routes and processors are added after addition of a 2nd route after CamelContext has been
+ * started, because the mbeansLevel is set to contextOnly.
+ */
+@DisabledOnOs(OS.AIX)
+public class ManagedMBeansLevelDefaultWithAddedRouteTest extends ManagedMBeansLevelTestSupport {
+
+    public ManagedMBeansLevelDefaultWithAddedRouteTest() {
+        super(ManagementMBeansLevel.Default);
+    }
+
+    @Override
+    void assertResults(Set<ObjectName> contexts, Set<ObjectName> routes, Set<ObjectName> processors) {
+        assertEquals(1, contexts.size());
+        assertEquals(1, routes.size());
+        assertEquals(1, processors.size());
+    }
+
+    @Test
+    @Override
+    public void test() throws Exception {
+        MBeanServer mbeanServer = getMBeanServer();
+        //test state after before adding a new route
+        assertMBeans(mbeanServer);
+
+        log.info(">>>>>>>>>>>>>>>>> adding 2nd route <<<<<<<<<<<<<<");
+        // add a 2nd route
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:bar").routeId("bar").to("mock:bar");
+            }
+        });
+        log.info(">>>>>>>>>>>>>>>>> adding 2nd route DONE <<<<<<<<<<<<<<");
+
+        //no route or processor MBean should be created
+        Set<ObjectName> contexts = mbeanServer.queryNames(new ObjectName("*:type=context,*"), null);
+        Set<ObjectName> routes = mbeanServer.queryNames(new ObjectName("*:type=routes,*"), null);
+        Set<ObjectName> processors = mbeanServer.queryNames(new ObjectName("*:type=processors,*"), null);
+        assertEquals(1, contexts.size());
+        assertEquals(2, routes.size());
+        assertEquals(2, processors.size());
+    }
+
+}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelRoutesOnlyTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelRoutesOnlyTest.java
new file mode 100644
index 00000000000..e0e4e42e264
--- /dev/null
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelRoutesOnlyTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.management;
+
+import java.util.Set;
+
+import javax.management.ObjectName;
+
+import org.apache.camel.ManagementMBeansLevel;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@DisabledOnOs(OS.AIX)
+public class ManagedMBeansLevelRoutesOnlyTest extends ManagedMBeansLevelTestSupport {
+
+    public ManagedMBeansLevelRoutesOnlyTest() {
+        super(ManagementMBeansLevel.RoutesOnly);
+    }
+
+    @Override
+    void assertResults(Set<ObjectName> contexts, Set<ObjectName> routes, Set<ObjectName> processors) {
+        assertEquals(1, contexts.size());
+        assertEquals(1, routes.size());
+        assertEquals(0, processors.size());
+    }
+}
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelTestSupport.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelTestSupport.java
new file mode 100644
index 00000000000..d0bb63ee6a4
--- /dev/null
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedMBeansLevelTestSupport.java
@@ -0,0 +1,86 @@
+/*
+ * 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.management;
+
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ManagementMBeansLevel;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledOnOs;
+import org.junit.jupiter.api.condition.OS;
+
+@DisabledOnOs(OS.AIX)
+public abstract class ManagedMBeansLevelTestSupport extends ManagementTestSupport {
+
+    private final ManagementMBeansLevel level;
+
+    public ManagedMBeansLevelTestSupport(ManagementMBeansLevel level) {
+        this.level = level;
+    }
+
+    abstract void assertResults(Set<ObjectName> contexts, Set<ObjectName> routes, Set<ObjectName> processors);
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        //set level if provided
+        if (level != null) {
+            context.getManagementStrategy().getManagementAgent().setMBeansLevel(level);
+        }
+        return context;
+    }
+
+    @Test
+    public void test() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:start", "Hello World", "foo", "123");
+
+        assertMockEndpointsSatisfied();
+
+        // get the stats for the route
+        MBeanServer mbeanServer = getMBeanServer();
+
+        assertMBeans(mbeanServer);
+    }
+
+    void assertMBeans(MBeanServer mbeanServer) throws MalformedObjectNameException {
+        Set<ObjectName> contexts = mbeanServer.queryNames(new ObjectName("*:type=context,*"), null);
+        Set<ObjectName> routes = mbeanServer.queryNames(new ObjectName("*:type=routes,*"), null);
+        Set<ObjectName> processors = mbeanServer.queryNames(new ObjectName("*:type=processors,*"), null);
+
+        assertResults(contexts, routes, processors);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("mock:result");
+            }
+        };
+    }
+}
diff --git a/docs/user-manual/modules/ROOT/pages/jmx.adoc b/docs/user-manual/modules/ROOT/pages/jmx.adoc
index 206f5da1f3f..ef0f77671b5 100644
--- a/docs/user-manual/modules/ROOT/pages/jmx.adoc
+++ b/docs/user-manual/modules/ROOT/pages/jmx.adoc
@@ -82,6 +82,10 @@ The Camel JMX can be configured with the following options.
 |`mbeanObjectDomainName` |`org.apache.camel.jmx.mbeanObjectDomainName` |`org.apache.camel`
 |The JMX domain that all object names will use
 
+|`mbeansLevel` |  |`Default`
+|Configures the level for which MBeans are registered.
+See section _Registering MBeans for specific resources only_ for more details.
+
 |`onlyRegisterProcessorWithCustomId`
 |`org.apache.camel.jmx.onlyRegisterProcessorWithCustomId` |`false`
 |If this option is enabled then only processors with a
@@ -113,6 +117,15 @@ usage of each incoming and outgoing endpoints).
 from MBean names and attributes.
 |=======================================================================
 
+=== Registering MBeans for specific resources only
+
+By default Camel registers MBeans for the context, all the routes and the processors when its starting. You can set a level whether MBeans are registered or not when Camel starts up. The levels are:
+
+* `Default` - Camel will register MBeans for the context, all the routes and the processors.
+
+* `RoutesOnly` - Camel will register MBeans for the context and for all the routes. (not for any processor).
+
+* `ContextOnly` -  Camel will register MBeans for the context (neither for any route nor for any processor).
 
 === Registering new MBeans for new routes or endpoints