jmx4perl/examples/jsr77.pl
2017-10-31 14:38:28 +01:00

159 lines
5.0 KiB
Perl
Executable File

#!/usr/bin/perl
use JMX::Jmx4Perl;
use strict;
use Data::Dumper;
use Getopt::Std;
my %opts;
getopts('s',\%opts);
my $url = $ARGV[0] || die "No url given\n";
my $jmx = JMX::Jmx4Perl->new(url => $url,verbose => 0);
my $MODULE_HANDLER = init_handler($jmx);
my %VISITED = ();
my $product = $jmx->product;
print "Product: ",$product->name," ",$product->version,"\n";
print "JSR77 : ",$product->jsr77 ? "Yes" : "No","\n\n";
my $domains = $jmx->search("*:j2eeType=J2EEDomain,*");
$domains = [ "(none)" ] unless $domains;
# Special fix for geronimo which seems to have a problem with properly spelling
# the domain name
#push @$domains,"Geronimo:j2eeType=J2EEDomain,name=Geronimo" if grep { /^geronimo:/ } @$domains;
for my $d (@{$domains || []}) {
my $dn = $d eq "(none)" ? "*" : _print(1,$d,"Domain");
my $servers = $jmx->search("$dn:j2eeType=J2EEServer,*");
if (!$servers && $d eq "(none)") {
# That's probably not a real jsr77 container
# We are looking up all J2EEObject on our own without server and domain
my $objects = [ grep { /j2eeType/ } @{$jmx->search("*:*")} ];
print_modules(1,$objects);
} elsif (!$servers) {
print " == No servers defined for domain $dn ==\n";
} else {
for my $s (@{$servers || []}) {
my $sn = _print(2,$s,"Server");
for my $o (qw(deployedObjects resources javaVMs)) {
my $objects = $jmx->get_attribute($s,$o);
print_modules(3,$objects);
}
}
}
print "\n";
}
# Special JBoss handling, since it seems than deployed WARs (WebModules)
# don't appear below a server but stand on their own (despite the rules
# layed out in JSR77)
if ($product->id eq "jboss" || $product->id eq "weblogic") {
my $web_modules = $jmx->search("*:j2eeType=WebModule,*");
if ($web_modules) {
print "\n=============================================\nJBoss WebModules:\n";
my $new = [ grep { !$VISITED{$_} } @$web_modules ];
print_modules(1,$new);
}
}
sub init_handler {
my $jmx = shift;
return {
"J2EEApplication" => "modules",
"AppClientModule" => 0,
"ResourceAdapterModule" => "resourceAdapters",
"WebModule" => "servlets",
"Servlet" => 0,
"EJBModule" => "ejbs",
"MessageDrivenBean" => 0,
"EntityBean" => 0,
"StatelessSessionBean" => 0,
"StatefulSessionBean" => 0,
"JCAResource" => "connectionFactories",
"JCAConnectionFactory" => "managedConnectionFactory",
"JCAManagedConnectionFactory" => 0,
"JavaMailResource" => 0,
"JDBCResource" => "jdbcDataSources",
"JDBCDataSource" => "jdbcDriver",
"JDBCDriver" => 0,
"JMSResource" => 0,
"JNDIResource" => 0,
"JTAResource" => 0,
"RMI_IIOPResource" => 0,
"URLResource" => 0,
"JVM" => sub {
my ($l,$mod) = @_;
print " ",
join(", ",map { $jmx->get_attribute($mod,$_) } qw(javaVendor javaVersion node)),"\n";
},
# JBoss specific:
"ServiceModule" => 0,
"MBean" => 0
};
}
sub print_modules {
my ($l,$objects) = @_;
for my $k (sort keys %$MODULE_HANDLER) {
my @mods = grep { $_ =~ /j2eeType=$k/ } @$objects;
if (@mods) {
my $handler = $MODULE_HANDLER->{$k};
for my $mod (@mods) {
_print($l,$mod);
if (ref($handler) eq "CODE") {
$handler->($l,$mod);
} elsif ($handler && !ref($handler)) {
my $modules = $jmx->get_attribute($mod,$handler);
if ($modules) {
$modules = ref($modules) eq "ARRAY" ? $modules : [ $modules ];
# Fix for Jonas 4.1.2 with jetty, which includes the
# WebModule itself in the list of contained Servlets
$modules = [ grep { $_ !~ /j2eeType=$k/} @$modules ];
print_modules($l+1,$modules) if scalar(@$modules);
}
}
}
}
}
}
sub _print {
my ($i,$s,$t) = @_;
$VISITED{$s} = $s;
my $n = extract_name($s);
unless ($t) {
$t = $1 if $s =~ /j2eeType=(\w+)/;
}
my $can_stat = check_for_statistics($s);
print " " x $i,$t,": ",$n,($can_stat ? " [S] " : ""),"\n";
print " " x $i," " x length($t)," ",$s,"\n";
if ($opts{s} && $can_stat) {
eval {
my $ret = $jmx->get_attribute($s,"stats");
print Dumper($ret);
};
}
return $n;
}
sub check_for_statistics {
my $mbean = shift;
my $ret;
eval {
$ret = $jmx->get_attribute($mbean,"statisticsProvider");
};
return $@ ? undef : lc($ret) eq "true";
}
sub extract_name {
my $s = shift;
$s =~ /.*:.*name=([^,]+)/;
return $1;
}