blob: c7dfe44831a9bb9e161e19578bd519b60344d921 [file] [log] [blame]
/**
* 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.io.IOException;
import java.lang.management.ManagementFactory;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.management.MBeanServer;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import org.apache.camel.ContextTestSupport;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
/**
* This test verifies JMX is enabled by default and it uses local mbean
* server to conduct the test as connector server is not enabled by default.
*
* @version
*/
public class JmxInstrumentationUsingDefaultsTest extends ContextTestSupport {
protected String domainName = DefaultManagementAgent.DEFAULT_DOMAIN;
protected MBeanServerConnection mbsc;
protected long sleepForConnection;
@Override
protected boolean useJmx() {
return true;
}
protected void assertDefaultDomain() throws IOException {
if (System.getProperty(JmxSystemPropertyKeys.USE_PLATFORM_MBS) != null
&& !Boolean.getBoolean(JmxSystemPropertyKeys.USE_PLATFORM_MBS)) {
assertEquals(domainName, mbsc.getDefaultDomain());
}
}
public void testMBeansRegistered() throws Exception {
assertDefaultDomain();
template.sendBody("direct:start", "Hello World");
resolveMandatoryEndpoint("mock:end", MockEndpoint.class);
Set<ObjectName> s = mbsc.queryNames(new ObjectName(domainName + ":type=endpoints,*"), null);
assertEquals("Could not find 2 endpoints: " + s, 2, s.size());
s = mbsc.queryNames(new ObjectName(domainName + ":type=context,*"), null);
assertEquals("Could not find 1 context: " + s, 1, s.size());
s = mbsc.queryNames(new ObjectName(domainName + ":type=processors,*"), null);
assertEquals("Could not find 1 processors: " + s, 1, s.size());
s = mbsc.queryNames(new ObjectName(domainName + ":type=consumers,*"), null);
assertEquals("Could not find 1 consumers: " + s, 1, s.size());
s = mbsc.queryNames(new ObjectName(domainName + ":type=producers,*"), null);
assertEquals("Could not find 2 producers: " + s, 0, s.size());
s = mbsc.queryNames(new ObjectName(domainName + ":type=routes,*"), null);
assertEquals("Could not find 1 route: " + s, 1, s.size());
}
public void testCounters() throws Exception {
MockEndpoint resultEndpoint = resolveMandatoryEndpoint("mock:end", MockEndpoint.class);
resultEndpoint.expectedBodiesReceived("<hello>world!</hello>");
sendBody("direct:start", "<hello>world!</hello>");
resultEndpoint.assertIsSatisfied();
verifyCounter(mbsc, new ObjectName(domainName + ":type=routes,*"));
}
protected void verifyCounter(MBeanServerConnection beanServer, ObjectName name) throws Exception {
Set<ObjectName> s = beanServer.queryNames(name, null);
assertEquals("Found mbeans: " + s, 1, s.size());
Iterator<ObjectName> iter = s.iterator();
ObjectName pcob = iter.next();
Long valueofNumExchanges = (Long)beanServer.getAttribute(pcob, "ExchangesTotal");
assertNotNull("Expected attribute found. MBean registered under a "
+ "'<domain>:name=Stats,*' key must be of type PerformanceCounter.class",
valueofNumExchanges);
assertEquals(Long.valueOf(1), valueofNumExchanges);
Long valueofNumCompleted = (Long)beanServer.getAttribute(pcob, "ExchangesCompleted");
assertNotNull("Expected attribute found. MBean registered under a "
+ "'<domain>:name=Stats,*' key must be of type PerformanceCounter.class",
valueofNumCompleted);
assertEquals(Long.valueOf(1), valueofNumCompleted);
Long valueofNumFailed = (Long)beanServer.getAttribute(pcob, "ExchangesFailed");
assertNotNull("Expected attribute found. MBean registered under a "
+ "'<domain>:name=Stats,*' key must be of type PerformanceCounter.class",
valueofNumFailed);
assertEquals(Long.valueOf(0), valueofNumFailed);
Long valueofMinProcessingTime = (Long)beanServer.getAttribute(pcob, "MinProcessingTime");
assertNotNull("Expected attribute found. MBean registered under a "
+ "'<domain>:name=Stats,*' key must be of type PerformanceCounter.class",
valueofMinProcessingTime);
assertTrue(valueofMinProcessingTime >= 0);
Long valueofMaxProcessingTime = (Long)beanServer.getAttribute(pcob, "MaxProcessingTime");
assertNotNull("Expected attribute found. MBean registered under a "
+ "'<domain>:name=Stats,*' key must be of type PerformanceCounter.class",
valueofMaxProcessingTime);
assertTrue(valueofMaxProcessingTime >= 0);
Long valueofMeanProcessingTime = (Long)beanServer.getAttribute(pcob, "MeanProcessingTime");
assertNotNull("Expected attribute found. MBean registered under a "
+ "'<domain>:name=Stats,*' key must be of type PerformanceCounter.class",
valueofMeanProcessingTime);
assertTrue(valueofMeanProcessingTime >= valueofMinProcessingTime
&& valueofMeanProcessingTime <= valueofMaxProcessingTime);
Long totalProcessingTime = (Long)beanServer.getAttribute(pcob, "TotalProcessingTime");
assertNotNull("Expected attribute found. MBean registered under a "
+ "'<domain>:name=Stats,*' key must be of type PerformanceCounter.class",
totalProcessingTime);
assertTrue(totalProcessingTime >= 0);
Long lastProcessingTime = (Long)beanServer.getAttribute(pcob, "LastProcessingTime");
assertNotNull("Expected attribute found. MBean registered under a "
+ "'<domain>:name=Stats,*' key must be of type PerformanceCounter.class",
lastProcessingTime);
assertTrue(lastProcessingTime >= 0);
assertNotNull("Expected first completion time to be available",
beanServer.getAttribute(pcob, "FirstExchangeCompletedTimestamp"));
assertNotNull("Expected last completion time to be available",
beanServer.getAttribute(pcob, "LastExchangeCompletedTimestamp"));
}
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
// need a little delay for fast computers being able to process
// the exchange in 0 millis and we need to simulate a little computation time
from("direct:start").delay(10).to("mock:end");
}
};
}
@Override
protected void setUp() throws Exception {
releaseMBeanServers();
super.setUp();
Thread.sleep(sleepForConnection);
mbsc = getMBeanConnection();
}
@Override
protected void tearDown() throws Exception {
try {
super.tearDown();
releaseMBeanServers();
mbsc = null;
} finally {
// restore environment to original state
// the following properties may have been set by specialization of this test class
System.clearProperty(JmxSystemPropertyKeys.USE_PLATFORM_MBS);
System.clearProperty(JmxSystemPropertyKeys.DOMAIN);
System.clearProperty(JmxSystemPropertyKeys.MBEAN_DOMAIN);
System.clearProperty(JmxSystemPropertyKeys.CREATE_CONNECTOR);
System.clearProperty(JmxSystemPropertyKeys.REGISTRY_PORT);
}
}
protected void releaseMBeanServers() {
for (MBeanServer server : (List<MBeanServer>)MBeanServerFactory.findMBeanServer(null)) {
MBeanServerFactory.releaseMBeanServer(server);
}
}
protected MBeanServerConnection getMBeanConnection() throws Exception {
if (mbsc == null) {
mbsc = ManagementFactory.getPlatformMBeanServer();
}
return mbsc;
}
}