cancel
Showing results for 
Search instead for 
Did you mean: 
Create Post

Understanding Java Remote JMX - Initial Setup/Config Overview

Overview

I wanted to outline some misunderstanding and give some guidance on monitoring java web apps via remote JMX. The flavor of how you're hosting the java application, e.g. Tomcat, Websphere, etc, all follow the same foundation.

First, the java web application can be accessed via a web browser (typically on port 8080) but the detailed performance info is accessed on a different port called remote JMX. Java applications do not have this remote JMX port enabled by default.  You have to manually enable it. The "how" part can vary based on tomcat or websphere and can even change based on the version you're running of each. This is where the initial confusion can begin. Since I can't outline every way to configure it, i'll outline the basic concept and let you use some google fu to fill in the blanks.

For Tomcat deployments

We need to find the JAVA_OPTS startup setting. It is normally defined in whatever startup script java uses.

  • For Linux, it's typically a file called setenv.sh and is located in the bin folder in the application's install directory.
  • For Windows it's typically a GUI app with a java tab and java options section.
    • Start > All Programs > Apache Tomcat > Tomcat Configuration
    • Or open the tomcat7w.exe or tomcat8w.exe (depending on your version of java) via command prompt or powershell.
  • For WebSphere, it's found in the admin web interface for that application.

When you find it, you need to add the following 4 options. For linux, they need to be all on the same line with a space separating them. For Windows, multi-line usually works.

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=8686

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

For WebSphere/WebLogic deployments

First, we need to enable the remote JMX on a global level. In the WebSphere administration, there is a setting called "Platform MBean Server" that needs to be enabled. It's location and exact name varies based on your version of WebSphere but it is typically found in the Admin WebUI: Domain > Configuration > General > Advanced > Platform MBean Server Enabled Checkbox.

Once that is enabled then we need to add the following to each webspehere instance we want to monitor. Find the JAVA_OPTS area of startup and add these lines.

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=8686

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

-Djava.rmi.server.hostname=<websphere server ip>

*The last setting, replace <websphere server ip> with the IP of your webspehere server.

Generalities

The jmxremote.port= can be any port you want that isn't already in use. The templates in SAM default to using port 8686.

     *If you have multiple java apps running on the same server like I do, then come up with a standard port convention to make it easier.

     *My java apps ran on ports 8040, 8050, 8060, 8070 and 8080. That means that I would have to add those JAVA_OPTS to EACH of those instances that I want to monitor. So each corresponding JMX port was 2040, 2050, 2060, 2070 and 2080.

The jmxremote.authenticate=false and jmxremote.ssl=false are set to false only in this example and for testing purposes. There are a lot more variables that could break and troubleshooting it is a pain.  Setting those to true is recommended but involve a lot of extra config which would really fall outside of the scope of this article.

Testing

Port check

Once those settings above are in place it will require a service restart to take effect. If you have a dev server, great! If not, schedule a maintenance window.

First, we need to see if the operating system is using the port. Run the following commands via SSH or on Windows Command Prompt/PowerShell.

     Linux: netstat -nlp | grep 8686

     pastedImage_4.png

     Windows: netstat -ano | findstr "8686"

     pastedImage_5.png

If nothing returns then something isn't setup correctly with the java opts, this is where google will be your friend.

Java jconsole

Second, we want to test with Java JDK. Download and install it on your SolarWinds Orion server. The download link is here: Java SE Development Kit 8 - Downloads

Once installed, browser to the installation directory: C:\Program Files\Java\<jdk version number>\bin. Open the jconsole.exe app inside.

Choose Remote Process and enter the IP:Port and click connect.

pastedImage_12.png

Since we originally set the jmxremote.ssl=false we'll get this message, just continue anyways by clicking Insecure connection.

pastedImage_13.png

Success

If all of your hard work has paid off you should be presented with this screen.

pastedImage_14.png

The MBeans tab is where all of the details of the application are located and it's what SAM is polling metrics from. We'll dive into this a little more in another article.

pastedImage_15.png

Finally! On to assigning the SAM java template. Continued on the follow link.

Understanding Java Remote JMX - SAM Template Config

Comments

chad.every

Great post !

Just checking what  credential username / password will be required ?

if you used the settings above there would be no credentials since it's set to this

-Dcom.sun.management.jmxremote.authenticate=false

That can always be set to true, and then credentials would be required, but that falls out of the article above.

Hi Chad,

What are the configuration changes required if  both set to' true'?

-Dcom.sun.management.jmxremote.authenticate=true

-Dcom.sun.management.jmxremote.ssl=true

Thanks,

Deepthi

Hi All,

I am trying to setup jmx definition for ApacheDS 2.0.0 AM25. It is using just JAVA_OPTS and cannot use CATALINA_OPTS. I have the below configurations in setenv.sh file

JAVA_OPTS="$JAVA_OPTS

           -Dcom.sun.management.jmxremote \

           -Dcom.sun.management.jmxremote.port=****\

           -Dcom.sun.management.jmxremote.ssl=false \

           -Dcom.sun.management.jmxremote.authenticate=false \

           -Dcom.sun.management.jmxremote.rmi.port=****\

           -Djava.rmi.server.hostname=$(hostname -s)"

I am having trouble shutting down the app as its throwing below error and seems to be creating a new process to shutdown on the same port.

Error: JMX connector server communication error

Is there anything i can configure to avoid referring the same port for shutdown.

Version history
Revision #:
1 of 1
Last update:
‎09-27-2017 10:53 AM
Updated by: