views:

630

answers:

7

I'm trying to find a solution that allows me to monitor resource consumption of a server. Preferably, the metrics I'm wanting to obtain are network utilisation IO, and if possible CPU usage/load average and disk IO.

The only other requirement I have is that this information be obtainable by Java so it can be manipulated, and at least work on Linux (Fedora).

I've heard about a few monitoring tools but I'm just not sure of the best way of going about this. I would probably want to be gathering the information about every 30 seconds.

Thanks

Update: Just to re-iterate, I am referring to system-wide monitoring NOT Java specific monitoring. I just want to use Java to access to these metrics

A: 

Your best bet would probably look in /proc for all your systems resource usage /proc/cpuinfo and /proc/net/ are a good place to start.

nelsonslament
+4  A: 

JMX, Here are a couple of examples:

Phill Pafford
Especially in conjunction with JConsole/JVisualVM.
gustafc
yep, and there are a variety of tools which can access the jmx stuff remotely as well.
james
How does JMX help with monitoring resource consumption of the *server* (not the Java application)?
Adamski
A: 

You could look into using the Ganglia monitoring tool. It uses XML for its data representation and so I imagine it would be fairly straightforward to access the data from Java, and there are the added advantages that it's been designed to be highly scaleable, with the potential to record server metrics across a large number of machines.

Adamski
+1  A: 

You could choose to delegate the monitoring to a dedicated tool like Cacti, Centreon, or Zenoss but this might be a bit overkill for a single application.

For a simple solution, JMX might indeed be a better solution. As starting point, I suggest reading the following article: Monitoring Local and Remote Applications Using JMX 1.2 and JConsole. Then, have a look at Using JConsole to Monitor Applications, a very detailed article that shows how to use JConsole to access several core monitoring and management functionalities provided by the Java platform including:

  • Detect low memory
  • Enable or disable GC and class loading verbose tracing
  • Detect deadlocks
  • Control the log level of any loggers in an application
  • Access OS resources—Sun's platform extension
  • Manage an application's Managed Beans (MBeans)

But, AFAIK, JMX won't give you access to network IO so you might need a combination of these tools. Luckily, many tools (e.g. Cacti, SmokePing) use the RDD format that you can easily manipulate with Java APIs like JRobin or rdd4j.

Pascal Thivent
A: 

Check the eG Innovations Monitoring Tool - http://www.eginnovations.com/web/products.htm - its Java based and collects a number of important system metrics.

Tom
A: 

What's wrong with Runtime.exec("some command")?

Eamorr
A: 

I'm growing fond of collectd, a modular C daemon focusing on monitoring (rather than graphing) with a multitude of plugins:

There would seem to be several options for getting metrics into your Java code:

  • in-process, using the aforementioned Java plugin to register a write callback to receive data from the various other plugins
  • over the network, by embedding jcollectd (a Java implementation of collectd's protocol) into your app
  • indirectly, by writing to a CSV or RRD file and using one of the various RRD implementations for Java
SimonJ