Repository: camel Updated Branches: refs/heads/master 2db5fbf7a -> 62bce5144
CAMEL-7191: Disable load performance statistics by default. Thanks to Preben Asumussen for the patch. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/62bce514 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/62bce514 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/62bce514 Branch: refs/heads/master Commit: 62bce5144822a02f20463c0f711c1222099caf72 Parents: 2db5fbf Author: Claus Ibsen <davscl...@apache.org> Authored: Thu Feb 20 09:39:10 2014 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Thu Feb 20 09:39:26 2014 +0100 ---------------------------------------------------------------------- .../management/DefaultManagementStrategy.java | 2 +- .../management/mbean/ManagedCamelContext.java | 26 +++++- .../camel/management/mbean/ManagedRoute.java | 24 ++++- .../camel/support/TimerListenerManager.java | 3 + .../impl/MultipleLifecycleStrategyTest.java | 5 +- .../management/ManagedRouteAddRemoveTest.java | 43 ++++----- .../ManagedRouteLoadstatisticsTest.java | 92 ++++++++++++++++++++ .../resources/META-INF/spring/camel-context.xml | 2 +- 8 files changed, 164 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/62bce514/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java index 11b663b..303718a 100644 --- a/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java +++ b/camel-core/src/main/java/org/apache/camel/management/DefaultManagementStrategy.java @@ -61,7 +61,7 @@ public class DefaultManagementStrategy extends ServiceSupport implements Managem private boolean onlyManageProcessorWithCustomId; private ManagementAgent managementAgent; private ManagementStatisticsLevel statisticsLevel = ManagementStatisticsLevel.All; - private boolean loadStatisticsEnabled = true; + private boolean loadStatisticsEnabled; private CamelContext camelContext; public DefaultManagementStrategy() { http://git-wip-us.apache.org/repos/asf/camel/blob/62bce514/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java index 55fd40e..e12de9c 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedCamelContext.java @@ -170,17 +170,35 @@ public class ManagedCamelContext extends ManagedPerformanceCounter implements Ti public boolean isShutdownNowOnTimeout() { return context.getShutdownStrategy().isShutdownNowOnTimeout(); } - + public String getLoad01() { - return String.format("%.2f", load.getLoad1()); + double load1 = load.getLoad1(); + if (Double.isNaN(load1)) { + // empty string if load statistics is disabled + return ""; + } else { + return String.format("%.2f", load1); + } } public String getLoad05() { - return String.format("%.2f", load.getLoad5()); + double load5 = load.getLoad5(); + if (Double.isNaN(load5)) { + // empty string if load statistics is disabled + return ""; + } else { + return String.format("%.2f", load5); + } } public String getLoad15() { - return String.format("%.2f", load.getLoad15()); + double load15 = load.getLoad15(); + if (Double.isNaN(load15)) { + // empty string if load statistics is disabled + return ""; + } else { + return String.format("%.2f", load15); + } } public boolean isUseBreadcrumb() { http://git-wip-us.apache.org/repos/asf/camel/blob/62bce514/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java index 51ce287..0b026a6 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java @@ -145,15 +145,33 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList } public String getLoad01() { - return String.format("%.2f", load.getLoad1()); + double load1 = load.getLoad1(); + if (Double.isNaN(load1)) { + // empty string if load statistics is disabled + return ""; + } else { + return String.format("%.2f", load1); + } } public String getLoad05() { - return String.format("%.2f", load.getLoad5()); + double load5 = load.getLoad5(); + if (Double.isNaN(load5)) { + // empty string if load statistics is disabled + return ""; + } else { + return String.format("%.2f", load5); + } } public String getLoad15() { - return String.format("%.2f", load.getLoad15()); + double load15 = load.getLoad15(); + if (Double.isNaN(load15)) { + // empty string if load statistics is disabled + return ""; + } else { + return String.format("%.2f", load15); + } } @Override http://git-wip-us.apache.org/repos/asf/camel/blob/62bce514/camel-core/src/main/java/org/apache/camel/support/TimerListenerManager.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/support/TimerListenerManager.java b/camel-core/src/main/java/org/apache/camel/support/TimerListenerManager.java index ad7794d..793e9cd 100644 --- a/camel-core/src/main/java/org/apache/camel/support/TimerListenerManager.java +++ b/camel-core/src/main/java/org/apache/camel/support/TimerListenerManager.java @@ -36,6 +36,9 @@ import org.slf4j.LoggerFactory; * <p/> * Also ensure when adding and remove listeners, that they are correctly removed to avoid * leaking memory. + * <p/> + * From Camel 2.13 onwards the {@link TimerListenerManager} is only enabled if + * {@link org.apache.camel.spi.ManagementStrategy#isLoadStatisticsEnabled()} is enabled. * * @see TimerListener */ http://git-wip-us.apache.org/repos/asf/camel/blob/62bce514/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java b/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java index 5486d77..b863d35 100644 --- a/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java +++ b/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java @@ -50,9 +50,8 @@ public class MultipleLifecycleStrategyTest extends TestSupport { context.removeComponent("log"); context.stop(); - List<String> expectedEvents = Arrays.asList("onContextStart", "onServiceAdd", "onServiceAdd", "onServiceAdd", - "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", - "onThreadPoolAdd", "onComponentAdd", "onEndpointAdd", "onComponentRemove", "onContextStop", "onThreadPoolRemove"); + List<String> expectedEvents = Arrays.asList("onContextStart", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", + "onServiceAdd", "onComponentAdd", "onEndpointAdd", "onComponentRemove", "onContextStop"); assertEquals(expectedEvents, dummy1.getEvents()); assertEquals(expectedEvents, dummy2.getEvents()); http://git-wip-us.apache.org/repos/asf/camel/blob/62bce514/camel-core/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java index ed1bc29..a58fdbf 100644 --- a/camel-core/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java +++ b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java @@ -19,6 +19,7 @@ package org.apache.camel.management; import java.util.HashMap; import java.util.Map; import java.util.Set; + import javax.management.MBeanServer; import javax.management.ObjectName; @@ -58,7 +59,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // number of services Set<ObjectName> names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Adding 2nd route"); @@ -78,7 +79,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Removing 2nd route"); @@ -89,7 +90,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Shutting down..."); } @@ -105,7 +106,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // number of services Set<ObjectName> names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Adding 2nd route"); @@ -125,7 +126,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Removing 2nd route"); @@ -136,7 +137,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Shutting down..."); } @@ -152,7 +153,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // number of services Set<ObjectName> names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Adding 2nd route"); @@ -172,7 +173,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Removing 2nd route"); @@ -183,7 +184,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Shutting down..."); } @@ -199,7 +200,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // number of services Set<ObjectName> names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Adding 2nd route"); @@ -229,7 +230,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); // now stop and remove the 2nd route log.info("Stopping 2nd route"); @@ -241,7 +242,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Shutting down..."); } @@ -257,7 +258,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // number of services Set<ObjectName> names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Adding 2nd route"); @@ -288,7 +289,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); // now stop and remove the 2nd route log.info("Stopping 2nd route"); @@ -300,7 +301,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Shutting down..."); } @@ -316,7 +317,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // number of services Set<ObjectName> names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Adding 2nd route"); @@ -345,7 +346,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); // now stop and remove the 2nd route log.info("Stopping 2nd route"); @@ -357,7 +358,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Shutting down..."); } @@ -373,7 +374,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // number of services Set<ObjectName> names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Adding 2nd route"); @@ -403,7 +404,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); // now stop and remove the 2nd route log.info("Stopping 2nd route"); @@ -415,7 +416,7 @@ public class ManagedRouteAddRemoveTest extends ManagementTestSupport { // there should still be the same number of services names = mbeanServer.queryNames(on, null); - assertEquals(8, names.size()); + assertEquals(7, names.size()); log.info("Shutting down..."); } http://git-wip-us.apache.org/repos/asf/camel/blob/62bce514/camel-core/src/test/java/org/apache/camel/management/ManagedRouteLoadstatisticsTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedRouteLoadstatisticsTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteLoadstatisticsTest.java new file mode 100644 index 0000000..1b683c5 --- /dev/null +++ b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteLoadstatisticsTest.java @@ -0,0 +1,92 @@ +/** + * 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 javax.management.MBeanServer; +import javax.management.ObjectName; + +import org.apache.camel.builder.RouteBuilder; + +/** + * @version + */ +public class ManagedRouteLoadStatisticsTest extends ManagementTestSupport { + + public void testLoadStatisticsAreDisabledByDefault() throws Exception { + // JMX tests dont work well on AIX CI servers (hangs them) + if (isPlatform("aix")) { + return; + } + + assertFalse(context.getManagementStrategy().isLoadStatisticsEnabled()); + // get the stats for the route + MBeanServer mbeanServer = getMBeanServer(); + ObjectName on = ObjectName.getInstance("org.apache.camel:context=camel-1,type=routes,name=\"route1\""); + getMockEndpoint("mock:result").expectedMessageCount(1); + + template.asyncSendBody("direct:start", "Hello World"); + + assertMockEndpointsSatisfied(); + + String load01 = (String)mbeanServer.getAttribute(on, "Load01"); + String load05 = (String)mbeanServer.getAttribute(on, "Load05"); + String load15 = (String)mbeanServer.getAttribute(on, "Load15"); + assertEquals("", load01); + assertEquals("", load05); + assertEquals("", load15); + } + + public void testEnableLoadStatistics() throws Exception { + // JMX tests dont work well on AIX CI servers (hangs them) + if (isPlatform("aix")) { + return; + } + context.getManagementStrategy().setLoadStatisticsEnabled(true); + context.stop(); + context.start(); + // get the stats for the route + MBeanServer mbeanServer = getMBeanServer(); + ObjectName on = ObjectName.getInstance("org.apache.camel:context=camel-1,type=routes,name=\"route1\""); + + getMockEndpoint("mock:result").expectedMessageCount(1); + + template.asyncSendBody("direct:start", "Hello World"); + + assertMockEndpointsSatisfied(); + Thread.sleep(2000); + String load01 = (String)mbeanServer.getAttribute(on, "Load01"); + String load05 = (String)mbeanServer.getAttribute(on, "Load05"); + String load15 = (String)mbeanServer.getAttribute(on, "Load15"); + assertNotNull(load01); + assertNotNull(load05); + assertNotNull(load15); + assertTrue(Double.parseDouble(load01.replace(',', '.')) >= 0); + assertTrue(Double.parseDouble(load05.replace(',', '.')) >= 0); + assertTrue(Double.parseDouble(load15.replace(',', '.')) >= 0); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start").to("log:foo").delay(2000).to("mock:result"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/62bce514/examples/camel-example-management/src/main/resources/META-INF/spring/camel-context.xml ---------------------------------------------------------------------- diff --git a/examples/camel-example-management/src/main/resources/META-INF/spring/camel-context.xml b/examples/camel-example-management/src/main/resources/META-INF/spring/camel-context.xml index 18aba39..66a9c6d 100644 --- a/examples/camel-example-management/src/main/resources/META-INF/spring/camel-context.xml +++ b/examples/camel-example-management/src/main/resources/META-INF/spring/camel-context.xml @@ -29,7 +29,7 @@ <!-- create a CamelContext --> <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring" depends-on="broker"> <!-- Default JMX connector url: "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi/camel" --> - <jmxAgent id="agent" createConnector="true"/> + <jmxAgent id="agent" createConnector="true" loadStatisticsEnabled="true"/> <route> <from uri="timer://inbox?period=5000"/>