JmxProxyClient is an Object Oriented interface for JmxProxy which is a part of the manager app in Tomcat. It offers a quick and easy access to MBeans via HTTP and can be used in shell scripts, performance graphing apps, monitoring apps etc. Currently it's only available in Perl.
Features in this release:
+ JmxProxyClient class supports qry requests with wildcards returning array of MBeans as a result (search method)
+ JmxProxyClient class supports qry requests without wildcards returing a MBean objects as a result (mbean method)
+ MBean class supports get requests for specific attributes which only work if MBean was fully created or through JmxProxyClient::mbean method
TODOs:
+ set support
+ error handling
use JmxProxyClient;
use JmxProxyClient::MBean;
# Create a new instance of JmxProxyClient
my $jpc = new JmxProxyClient(
server => 'localhost',
port => 8080,
user => 'man',
password=> 'man123',
);
# Fetch all available MBeans
my @allBeans = $jpc->get_all_mbeans;
for my $mbean (@allBeans) {
print $mbean->name . "\n";
my %attrs = $mbean->get_attributes;
while (my ($attr, $val) = each (%attrs)) {
print "\t" . $attr . ": " . $val . "\n";
}
}
use JmxProxyClient;
use JmxProxyClient::MBean;
# Create a new instance of JmxProxyClient
my $jpc = new JmxProxyClient(
server => 'localhost',
port => 8080,
user => 'man',
password=> 'man123',
);
# Run a query and display results
my @mbeans = $jpc->search("Catalina:type=ThreadPool,*");
for my $mbean (@mbeans) {
print $mbean->name . "\n";
my %attrs = $mbean->attributes;
while (my ($attr, $val) = each (%attrs)) {
print "\t" . $attr . ": " . $val . "\n";
}
print "\n\n";
printf "Busy/Current = %d/%d = %.2f\n",
$attrs{currentThreadsBusy},
$attrs{currentThreadCount},
$attrs{currentThreadsBusy} / $attrs{currentThreadCount};
print "\n\n";
}
use strict;
use JmxProxyClient;
use JmxProxyClient::MBean;
# Create a new instance of JmxProxyClient
my $jpc = new JmxProxyClient(
server => 'localhost',
port => 8080,
user => 'man',
password=> 'man123',
);
my $mem = "java.lang:type=Memory";
# Using hash of results
my %memstats = $jpc->mbean($mem)->heap_mem_usage;
while (my($key, $val) = each(%memstats)) {
printf "\t%s\t=%d\n", $key, $val;
}
# Querying individual mem areas
foreach ((qw/committed max used init/)) {
printf "\t%20s= %d\n", $_, $jpc->mbean($mem)->heap_mem_usage($_);
}
use strict;
use JmxProxyClient;
use JmxProxyClient::MBean;
# Create a new instance of JmxProxyClient
my $jpc = new JmxProxyClient(
server => 'localhost',
port => 8080,
user => 'man',
password=> 'man123',
);
# Run a query and display results
my $gm_prefix = "tomcat_";
my $mbean_name = "Catalina:type=ThreadPool,name=http-8080";
while (1) {
foreach (("currentThreadsBusy", "currentThreadCount")) {
my %metric = (
name => $gm_prefix . $mbean_name . "_" . $_,
type => "int32",
units => "threads",
value => $jpc->mbean($mbean_name)->get($_)
);
exec(gmetric(%metric));
}
sleep 15;
}
sub gmetric {
my %params = @_;
# Replace illegal chars with _
$params{'name'} =~ s/[^a-zA-Z0-9_]/_/g;
my $cmd = "/usr/bin/gmetric --name='%s' --type='%s' --units='%s' --value='";
# Set the correct format for the value
if ($params{type} =~ /.*int.*/) { $cmd .= "%d'"; }
elsif ($params{type} =~ /(float)|(double)/) { $cmd .= "%s'"; }
else { $cmd .= "%s'"; }
return sprintf $cmd, $params{'name'}, $params{'type'}, $params{'units'}, $params{'value'};
}