This post will show you how to monitor a Tomcat application server using JMX MBeans and an SNMP management application. The first part will guide you through securely enabling JMX management on the Java process. Once you have done this, you can use tools like Visual VM to monitor your process and its MBeans. If you want to take a step further and have this data gathered all the time, you might want to continue with the second part and integrate it with OpenNMS.
It is assumed that you have Tomcat on a server you want to manage, and you have also got Sun Java 7 SDK (not JRE) to run on your machine (they both can be the same machine, but we keep them separated here). You can apply this to any other Java process with little modification (to the MBean names maybe).
Add a few Java arguments to your CATALINA_OPTS to enable remote connection to JMX, and then restart the application server:
Replacing with the appropriate path for your Java, copy /jre/lib/management/jmxremote.password.template into /jre/lib/management/jmxremote.password and set the passwords for monitorRole and controlRole at the end of the file as you wish. We will assume you have set them to MONITOR_PASS and CONTROL_PASS here .
Make sure that your firewall doesn’t block port 1100. You may change the port number as you wish, but remember to change it everywhere mentioned in this guide.
Now run a JMX utility to connect to your JMX server, like JConsole or Visual VM. If using JConsole, connect to a remote host providing hostname, port (1100), username (controlRole), and password (CONTROL_PASS). If using Visual VM with a VisualVM-MBeans plugin installed, you might be able to browse among the MBeans and call some operations (click to enlarge):
This might be enough if you want to see what’s going on in the JVM at the moment. You can even double click the numbers (only the ones highlighted) to see a graph over time.
But if you want to keep historical records of different things over time, keep reading. We will be demonstrating how to use a network management software to connect to JMX and gather information. This will be based on an open source application called OpenNMS, but you can probably use your own software so long as it supports JSR160.
This document provides instructions for Fedora 16. Please follow the OpenNMS installation guide for other operating systems.
Add OpenNMS repository.
Install, init, and start PostgreSQL server, if you don’t have one.
To allow OpenNMS which is run as root to connect to PostgreSQL as opennms, you need to relax some access requirements. Edit /var/lib/pgsql/data/pg_hba.conf and make sure you have entries like this (change the last column):
Now restart PostgreSQL for these changes to take effect:
Now you are ready to install OpenNMS:
If you have followed the instructions in the previous section, you are now able to access the web interface of OpenNMS via http://:8980/opennms/. Enter admin for both username and password when prompted. Just remember to open port 8980 in your firewall for hosts you will be accessing OpenNMS web interface from.
The easiest way to set up OpenNMS to monitor a JMX service is to hijack the configuration to set up its own JMX interface. The only things we need to change is port number, username, password, and a few names that are different in Tomcat. Please see this wiki page for an explanation.
Please modify your configuration files stated below to make sure that it matches what provided here.
Now restart the server after making these changes.
Once restarted successfully, go to the web interface and perform the following steps:
- In the Admin tab, click “Add Interface for Scanning”, then enter and add.
- In the Events tab, click “All Events” and look for services being discovered.
- In the Reports tab, click “Resource Graphs”, select Tomcat server in the standard reports, select the opennms-jvm, then click “Graph Selection”.
Here are your graphs.
You need to follow the same pattern to monitor other MBeans. For example to graph total compilation time we need to follow these steps.
First, add an entry in jmx-datacollection-config.xml file to query the MBean (use JConsole or JVisualVM to find the name of the MBean you are interested in):
Then, add a report template in the snmp-graph.properties section:
Finally, don’t forget to add this new graph to the list of graphs (mind the semicolon and backslash at the end of the line):
reports=mib2.HCbits, mib2.bits, mib2.percentdiscards, mib2.percenterrors, \
jvm.gc.copy, jvm.gc.msc, jvm.gc.parnew, jvm.gc.cms, jvm.gc.psms, jvm.gc.pss, jvm.compilation, \