jmx4perl/lib/JMX/Jmx4Perl/Alias.pm

329 lines
16 KiB
Perl

#!/usr/bin/perl
package JMX::Jmx4Perl::Alias;
use strict;
use Data::Dumper;
use JMX::Jmx4Perl::Alias::Object;
use Carp;
=head1 NAME
JMX::Jmx4Perl::Alias - JMX alias names for jmx4perl
=head1 DESCRIPTION
Aliases are shortcuts for certain MBean attributes and
operations. Additionally, aliasing provides a thin abstraction layer which
allows to map common functionality with different naming schemes across
different application servers. E.g you can access the heap memory usage of your
application by using the alias C<MEMORY_HEAP_USED> regardless how the specific
MBean and its attributes are named on the target application server. Specific
L<JMX::Jmx4Perl::Product> take care about this mapping.
Alias are normally named hierachically, from the most general to the most
specific, where the parts are separate by underscore
(C<_>). I.e. C<OS_MEMORY_TOTAL_PHYSICAL> specifies the total physical memory
installed on the machine.
If you C<use> this module, be aware that B<all> aliases are imported in your
name space a subroutines (so that you an use them without a C<$>).
Most of the methods in C<JMX::Jmx4Perl> which allows for aliases can take an
alias in two forms. Either as a constant import by using this module or as
string. The string can be either the name of the alias itself or, as an
alternative format, a lower cased variant where underscores are replaced by
colons. E.g C<"MEMORY_HEAP_USED"> and C<"memory:heap:used"> are both valid
alias names.
Each alias is an object of the package L<JMX::Jmx4Perl::Alias::Object> which
provides some additional informations about the alias.
To print out all available aliases, sorted by name and with a short
description, you can use the C<help> subroutine, e.g. like in
perl -MJMX::Jmx4Perl::Alias -e 'JMX::Jmx4Perl::Alias::help'
=head1 METHODS
=over
=cut
my %ALIAS_MAP =
(attribute =>
{
# ========================================================================================================
SERVER_VERSION => ["Version of application server"],
SERVER_NAME => ["Name of server software"],
SERVER_ADDRESS => [ "IP Address of server, numeric"],
SERVER_HOSTNAME => [ "Hostname of server"],
# ========================================================================================================
# Standard Java VM Attributes
# Memory
MEMORY_HEAP => [ "Heap memory usage, multiple values", [ "java.lang:type=Memory", "HeapMemoryUsage" ]],
MEMORY_HEAP_USED => [ "Used heap memory", [ "java.lang:type=Memory", "HeapMemoryUsage", "used" ]],
MEMORY_HEAP_INIT => [ "Initially allocated heap memory", [ "java.lang:type=Memory", "HeapMemoryUsage", "init" ]],
MEMORY_HEAP_COMITTED => [ "Committed heap memory. That's the memory currently available for this JVM", [ "java.lang:type=Memory", "HeapMemoryUsage", "committed" ]],
MEMORY_HEAP_MAX => [ "Maximum available heap memory", [ "java.lang:type=Memory", "HeapMemoryUsage", "max" ]],
MEMORY_NONHEAP => [ "Non-Heap memory usage, multiple values", [ "java.lang:type=Memory", "NonHeapMemoryUsage" ]],
MEMORY_NONHEAP_USED => [ "Used non-heap memory (like a 'method area')", [ "java.lang:type=Memory", "NonHeapMemoryUsage", "used" ]],
MEMORY_NONHEAP_INIT => [ "Initially allocated non-heap memory", [ "java.lang:type=Memory", "NonHeapMemoryUsage", "init" ]],
MEMORY_NONHEAP_COMITTED => [ "Committed non-heap memory", [ "java.lang:type=Memory", "NonHeapMemoryUsage", "committed" ]],
MEMORY_NONHEAP_MAX => [ "Maximum available non-heap memory", [ "java.lang:type=Memory", "NonHeapMemoryUsage", "max" ]],
MEMORY_VERBOSE => [ "Switch on/off verbose messages concerning the garbage collector", ["java.lang:type=Memory", "Verbose"]],
# Class loading
CL_LOADED => [ "Number of currently loaded classes", [ "java.lang:type=ClassLoading", "LoadedClassCount"]],
CL_UNLOADED => [ "Number of unloaded classes", [ "java.lang:type=ClassLoading", "UnloadedClassCount"]],
CL_TOTAL => [ "Number of classes loaded in total", [ "java.lang:type=ClassLoading", "TotalLoadedClassCount"]],
# Threads
THREAD_COUNT => ["Active threads in the system", [ "java.lang:type=Threading", "ThreadCount"]],
THREAD_COUNT_PEAK => ["Peak thread count", [ "java.lang:type=Threading", "PeakThreadCount"]],
THREAD_COUNT_STARTED => ["Count of threads started since system start", [ "java.lang:type=Threading", "TotalStartedThreadCount"]],
THREAD_COUNT_DAEMON => ["Count of threads marked as daemons in the system", [ "java.lang:type=Threading", "DaemonThreadCount"]],
# Operating System
OS_MEMORY_PHYSICAL_FREE => ["The amount of free physical memory for the OS", [ "java.lang:type=OperatingSystem", "FreePhysicalMemorySize"]],
OS_MEMORY_PHYSICAL_TOTAL => ["The amount of total physical memory for the OS", [ "java.lang:type=OperatingSystem", "TotalPhysicalMemorySize"]],
OS_MEMORY_SWAP_FREE => ["The amount of free swap space for the OS", [ "java.lang:type=OperatingSystem", "FreeSwapSpaceSize"]],
OS_MEMORY_SWAP_TOTAL => ["The amount of total swap memory available", [ "java.lang:type=OperatingSystem", "TotalSwapSpaceSize"]],
OS_MEMORY_VIRTUAL => ["Size of virtual memory used by this process", [ "java.lang:type=OperatingSystem", "CommittedVirtualMemorySize"]],
OS_FILE_DESC_OPEN => ["Number of open file descriptors", [ "java.lang:type=OperatingSystem", "OpenFileDescriptorCount"]],
OS_FILE_DESC_MAX => ["Maximum number of open file descriptors", [ "java.lang:type=OperatingSystem", "MaxFileDescriptorCount"]],
OS_CPU_TIME => ["The cpu time used by this process", [ "java.lang:type=OperatingSystem", "ProcessCpuTime"]],
OS_INFO_PROCESSORS => ["Number of processors", [ "java.lang:type=OperatingSystem", "AvailableProcessors"]],
OS_INFO_ARCH => ["Architecture", [ "java.lang:type=OperatingSystem", "Arch"]],
OS_INFO_NAME => ["Operating system name", [ "java.lang:type=OperatingSystem", "Name"]],
OS_INFO_VERSION => ["Operating system version", [ "java.lang:type=OperatingSystem", "Version"]],
# Runtime
RUNTIME_SYSTEM_PROPERTIES => ["System properties", [ "java.lang:type=Runtime", "SystemProperties"]],
RUNTIME_VM_VERSION => ["Version of JVM", [ "java.lang:type=Runtime", "VmVersion"]],
RUNTIME_VM_NAME => ["Name of JVM", [ "java.lang:type=Runtime", "VmName"]],
RUNTIME_VM_VENDOR => ["JVM Vendor", [ "java.lang:type=Runtime", "VmVendor"]],
RUNTIME_ARGUMENTS => ["Arguments when starting the JVM", [ "java.lang:type=Runtime", "InputArguments"]],
RUNTIME_UPTIME => ["Total uptime of JVM", [ "java.lang:type=Runtime", "Uptime"]],
RUNTIME_STARTTIME => ["Time when starting the JVM", [ "java.lang:type=Runtime", "StartTime"]],
RUNTIME_CLASSPATH => ["Classpath", [ "java.lang:type=Runtime", "ClassPath"]],
RUNTIME_BOOTCLASSPATH => ["Bootclasspath", [ "java.lang:type=Runtime", "BootClassPath"]],
RUNTIME_LIBRARY_PATH => ["The LD_LIBRARY_PATH", [ "java.lang:type=Runtime", "LibraryPath"]],
RUNTIME_NAME => ["Name of the runtime", [ "java.lang:type=Runtime", "Name"]],
# Jmx4Perl
JMX4PERL_HISTORY_SIZE => [ "Size of the history of all attributes and operations in bytes" , ["jolokia:type=Config","HistorySize"]],
JMX4PERL_HISTORY_MAX_ENTRIES => [ "Maximum number of entries per attribute/operation possible" , ["jolokia:type=Config","HistoryMaxEntries"]],
JMX4PERL_DEBUG => [ "Switch on/off debugging by setting this boolean" , ["jolokia:type=Config","Debug"]],
JMX4PERL_DEBUG_MAX_ENTRIES => [ "Maximum number of entries for storing debug info" , ["jolokia:type=Config","MaxDebugEntries"]],
},
operation =>
{
# Memory
MEMORY_GC => [ "Run a garbage collection", [ "java.lang:type=Memory", "gc" ]],
# Threads
THREAD_DEADLOCKED => [ "Find cycles of threads that are in deadlock waiting to acquire object monitors", [ "java.lang:type=Threading", "findMonitorDeadlockedThreads"]],
# TODO: Check for a default
THREAD_DUMP => [ "Create a thread dump" ],
# Jmx4Perl
JMX4PERL_HISTORY_MAX_ATTRIBUTE => [ "Set the size of the history for a specific attribute" , ["jolokia:type=Config","setHistoryEntriesForAttribute"]],
JMX4PERL_HISTORY_MAX_OPERATION => [ "Set the size of the history for a specific operation" , ["jolokia:type=Config","setHistoryEntriesForOperation"]],
JMX4PERL_HISTORY_RESET => [ "Reset the history for all attributes and operations" , ["jolokia:type=Config","resetHistoryEntries"]],
JMX4PERL_DEBUG_INFO => [ "Print out latest debug info", ["jolokia:type=Config","debugInfo"]],
JMX4PERL_SERVER_INFO => [ "Show information about registered MBeanServers", ["jolokia:type=Config","mBeanServerInfo"]]
});
my %NAME_TO_ALIAS_MAP;
my %ALIAS_OBJECT_MAP;
my $initialized = undef;
# Import alias names directly into the name space
# of the importer
sub import {
my $callpkg = caller;
&_init() unless $initialized;
do {
no strict 'refs';
for my $alias (keys %ALIAS_OBJECT_MAP) {
my $object = $ALIAS_OBJECT_MAP{$alias};
*{$callpkg."::".$alias} = sub { $object };
}
};
}
=item $alias = JMX::Jmx4Perl::Alias->by_name("MEMORY_HEAP_USAGE")
Get an alias object by a name lookup. The argument provided must be a string
containing the name of an alias. If such an alias is not registered, this
method returns C<undef>.
=cut
sub by_name {
my $self = shift;
my $name = shift;
my $ret;
my $alias = $NAME_TO_ALIAS_MAP{$name};
#Try name in form "memory:heap:usage"
if ($alias) {
return $ALIAS_OBJECT_MAP{$alias};
}
# Try name in form "MEMORY_HEAP_USAGE"
return $ALIAS_OBJECT_MAP{$name};
}
=item JMX::Jmx4Perl::Alias->all
Get all aliases defined, sorted by alias name.
=cut
sub all {
return sort { $a->alias cmp $b->alias } values %ALIAS_OBJECT_MAP;
}
=item JMX::Jmx4Perl::Alias::help
Print out all registered aliases along with a short description
=cut
sub help {
my @aliases = &JMX::Jmx4Perl::Alias::all;
for my $alias (@aliases) {
printf('%-30.30s %4.4s %s'."\n",$alias->alias,$alias->type,$alias->description);
}
}
# Build up various hashes
sub _init {
%NAME_TO_ALIAS_MAP = ();
%ALIAS_OBJECT_MAP = ();
for my $type (keys %ALIAS_MAP) {
for my $alias (keys %{$ALIAS_MAP{$type}}) {
my $name = lc $alias;
$name =~ s/_/:/g;
$NAME_TO_ALIAS_MAP{$name} = $alias;
$ALIAS_OBJECT_MAP{$alias} =
new JMX::Jmx4Perl::Alias::Object
(
alias => $alias,
name => $name,
type => $type,
description => $ALIAS_MAP{$type}{$alias}[0],
default => $ALIAS_MAP{$type}{$alias}[1],
);
}
}
$initialized = 1;
}
=back
=head1 ALIASES
The currently aliases are as shown below. Note, that this information might be
outdated, to get the current one, use
perl -MJMX::Jmx4Perl::Alias -e 'JMX::Jmx4Perl::Alias::help'
CL_LOADED attr Number of currently loaded classes
CL_TOTAL attr Number of classes loaded in total
CL_UNLOADED attr Number of unloaded classes
JMX4PERL_DEBUG attr Switch on/off debugging by setting this boolean
JMX4PERL_DEBUG_INFO oper Print out latest debug info
JMX4PERL_DEBUG_MAX_ENTRIES attr Maximum number of entries for storing debug info
JMX4PERL_HISTORY_MAX_ATTRIBUTE oper Set the size of the history for a specific attribute
JMX4PERL_HISTORY_MAX_ENTRIES attr Maximum number of entries per attribute/operation possible
JMX4PERL_HISTORY_MAX_OPERATION oper Set the size of the history for a specific operation
JMX4PERL_HISTORY_RESET oper Reset the history for all attributes and operations
JMX4PERL_HISTORY_SIZE attr Size of the history of all attributes and operations in bytes
JMX4PERL_SERVER_INFO oper Show information about registered MBeanServers
MEMORY_GC oper Run a garbage collection
MEMORY_HEAP attr Heap memory usage, multiple values
MEMORY_HEAP_COMITTED attr Committed heap memory. That's the memory currently available for this JVM
MEMORY_HEAP_INIT attr Initially allocated heap memory
MEMORY_HEAP_MAX attr Maximum available heap memory
MEMORY_HEAP_USED attr Used heap memory
MEMORY_NONHEAP attr Non-Heap memory usage, multiple values
MEMORY_NONHEAP_COMITTED attr Committed non-heap memory
MEMORY_NONHEAP_INIT attr Initially allocated non-heap memory
MEMORY_NONHEAP_MAX attr Maximum available non-heap memory
MEMORY_NONHEAP_USED attr Used non-heap memory (like a 'method area')
MEMORY_VERBOSE attr Switch on/off verbose messages concerning the garbage collector
OS_CPU_TIME attr The cpu time used by this process
OS_FILE_DESC_MAX attr Maximum number of open file descriptors
OS_FILE_DESC_OPEN attr Number of open file descriptors
OS_INFO_ARCH attr Architecture
OS_INFO_NAME attr Operating system name
OS_INFO_PROCESSORS attr Number of processors
OS_INFO_VERSION attr Operating system version
OS_MEMORY_PHYSICAL_FREE attr The amount of free physical memory for the OS
OS_MEMORY_PHYSICAL_TOTAL attr The amount of total physical memory for the OS
OS_MEMORY_SWAP_FREE attr The amount of free swap space for the OS
OS_MEMORY_SWAP_TOTAL attr The amount of total swap memory available
OS_MEMORY_VIRTUAL attr Size of virtual memory used by this process
RUNTIME_ARGUMENTS attr Arguments when starting the JVM
RUNTIME_BOOTCLASSPATH attr Bootclasspath
RUNTIME_CLASSPATH attr Classpath
RUNTIME_LIBRARY_PATH attr The LD_LIBRARY_PATH
RUNTIME_NAME attr Name of the runtime
RUNTIME_STARTTIME attr Time when starting the JVM
RUNTIME_SYSTEM_PROPERTIES attr System properties
RUNTIME_UPTIME attr Total uptime of JVM
RUNTIME_VM_NAME attr Name of JVM
RUNTIME_VM_VENDOR attr JVM Vendor
RUNTIME_VM_VERSION attr Version of JVM
SERVER_ADDRESS attr IP Address of server, numeric
SERVER_HOSTNAME attr Hostname of server
SERVER_NAME attr Name of server software
SERVER_VERSION attr Version of application server
THREAD_COUNT attr Active threads in the system
THREAD_COUNT_DAEMON attr Count of threads marked as daemons in the system
THREAD_COUNT_PEAK attr Peak thread count
THREAD_COUNT_STARTED attr Count of threads started since system start
THREAD_DEADLOCKED oper Find cycles of threads that are in deadlock waiting to acquire object monitors
THREAD_DUMP oper Create a thread dump
=head1 LICENSE
This file is part of jmx4perl.
Jmx4perl is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
jmx4perl is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with jmx4perl. If not, see <http://www.gnu.org/licenses/>.
A commercial license is available as well. Please contact roland@cpan.org for
further details.
=head1 PROFESSIONAL SERVICES
Just in case you need professional support for this module (or Nagios or JMX in
general), you might want to have a look at
http://www.consol.com/opensource/nagios/. Contact roland.huss@consol.de for
further information (or use the contact form at http://www.consol.com/contact/)
=head1 AUTHOR
roland@cpan.org
=cut
1;