The idea is to spawn a few Docker containers, which will showcase a common monitoring solution for a JVM-based component:
- A Java application container, which will represent the component under observation. It will expose a JMX interface on an arbitrary port.
- A jmxtrans container, which will query the JMX endpoint and push selected metrics over UDP to StatsD.
- A dashboard container, which will contain the StatsD server along with a Graphite and Grafana instance.
Application under observation needs to enable a JMX endpoint on the process level. This is
reflected in the startup arguments, which are passed to the
java command in
Please note, that this setup assumes no security on the JMX interface itself. You should provide some kind of firewall when replicating this type of environment in an actual data center.
The app could be anything, since JMX support is built into the JVM, and no
external libraries are required. As long as
are set on the Java process you should be good to go.
For simplicity, our example will generate some noise, but do nothing apart from it:
You can test connectivity using jvisualvm
by replacing the host name value in
docker-machine ip output, and
connecting it to
JMX metric publisher
Application container will be queried by a
jmxtrans container, which is defined in a
All configuration, including metric and endpoint definitions will be set at runtime in the service script. This allows us to rely on environment variables as shown below:
After the environment is spawned using
docker-compose up you can start testing
it by creating some dashboards in the Grafana panel.
First, you’ll need to login and set up a
Graphite data source as described here:
You should be able to define metrics using the
stats.counters.servers tree as shown below:
Don’t forget to add an aggregation function at the far end of your metric string
definition. Adjusting the
Time Range should also help with improving the visibility
of the data.
I hope this minimal example will help you to get started with JVM monitoring in a Docker environment. You can find the complete source code here, if you would like to experiment with it yourself.