Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

executable file 151 lines (110 sloc) 4.583 kb
#!@@PERL@@ -w
# -*- perl -*-
=head1 NAME
jmx_ - Wildcard plugin to monitor Java application servers via JMX
=head1 APPLICABLE SYSTEMS
Tested with Tomcat 4.1/5.0/5.5/6.0 on Sun JVM 5/6 and OpenJDK.
Any JVM that supports JMX should in theory do.
Needs nc in path for autoconf.
=head1 CONFIGURATION
[jmx_*]
env.ip 127.0.0.1
env.port 5400
env.category jvm
env.username monitorRole
env.password SomethingSecret
# The critical and warning levels are in % of the pool size
env.critical 90
env.warning 70
env.JRE_HOME /usr/lib/jvm/java-6-sun/jre
Needed configuration on the Tomcat side: add
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=5400 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false
to CATALINA_OPTS in your startup scripts.
Replace authenticate=false with
-Dcom.sun.management.jmxremote.password.file=/etc/tomcat/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=/etc/tomcat/jmxremote.access
...if you want authentication.
jmxremote.password:
monitorRole SomethingSecret
jmxremote.access:
monitorRole readonly
You may need higher access levels for some counters, notably ThreadsDeadlocked.
=head1 BUGS
No encryption supported in the JMX connection.
The plugins available reflect the most interesting aspects of a
JVM runtime. This should be extended to cover things specific to
Tomcat, JBoss, Glassfish and so on. Patches welcome.
=head1 AUTHORS
=encoding UTF-8
Code written by Jimmy Olsen, Redpill Linpro AS. This code also
uses code written by Mo Amini, Diyar Amin and Younes Hajji,
Høgskolen i Oslo/Oslo University College.
Previous work on JMX plugin by Aleksey Studnev. Support for
authentication added by Ingvar Hagelund, Redpill Linpro AS.
=head1 LICENSE
GPLv2
=head1 MAGIC MARKERS
#%# family=manual
=cut
use strict;
my $beans="Catalina:type=DataSource,class=javax.sql.DataSource,name=*";
my $munin_jar='@@JAVALIBDIR@@/munin-jmx-plugins.jar';
my $java='@@JAVARUN@@';
my $ip=$ENV{'ip'} || "127.0.0.";
my $port=$ENV{'port'} || "5400";
if($ENV{'JRE_HOME'}) {
$java="$ENV{'JRE_HOME'}/bin/java";
}
sub config() {
open(CMD, "-|", $java, "-cp", $munin_jar, "org.munin.plugin.jmx.Beans", $beans, "maxActive") or die "Error: could not run \"$java -cp $munin_jar org.munin.plugin.jmx.Beans maxActive\": $!";
print "graph_title Tomcat database pool overview\n";
print "graph_vlabel current connections\n";
print "graph_info Shows the number of connections used for every pool in a Tomcat instance\n";
print "graph_category tomcat\n";
while(my $line = <CMD>) {
chomp($line);
if($line =~ /^[^\t]+,name="([^\t"]+)"\t([^\t]+)\t([^\t]+)$/) {
my $max = $3;
my $label = $1;
my $field = "v" . $label; # Prefix with a known good char, as field names can't start with a number
$field =~ s/[^A-Za-z0-9]/_/g;
print "$field.label $label\n$field.max $max\n";
if(defined $ENV{'critical'}) {
print "$field.critical " . ($max * $ENV{'critical'} / 100), "\n";
}
if(defined $ENV{'warning'}) {
print "$field.warning " . ($max * $ENV{'warning'} / 100), "\n";
}
}
}
close(CMD);
}
sub fetch() {
# Fetch bean values (through jmx) via the command line. We basically run the class "org.munin.plugin.jmx.Beans"
# with the parameters <bean> and <filter>, the <bean> being a bean pattern to fetch (in this case
# "Catalina:type=DataSource,class=javax.sql.DataSource,name=*", and <filter> being "numActive" (the single field
# we're actually interested in). We can fetch multiple fields by listing them all as parameters, or list all fields
# by not supplying a filter (only a bean).
open(CMD, "-|", $java, "-cp", $munin_jar, "org.munin.plugin.jmx.Beans", $beans, "numActive") or die "Error: could not run \"$java -cp $munin_jar org.munin.plugin.jmx.Beans maxActive\": $!";
while(my $line = <CMD>) {
chomp($line);
if($line =~ /^[^\t]+,name="([^\t"]+)"\t([^\t]+)\t([^\t]+)$/) {
my $num = $3;
my $field = "v" . $1; # Prefix with a known good char, as field names can't start with a number
$field =~ s/[^A-Za-z0-9]/_/g;
print "$field.value $num\n";
}
}
close(CMD);
}
$ENV{'ip'} = $ip;
$ENV{'port'} = $port;
if(defined $ARGV[0] and $ARGV[0] eq "config") {
config();
} else {
fetch();
}
# vim: ts=4:ai:et:syntax=perl
Jump to Line
Something went wrong with that request. Please try again.