3 Replies Latest reply on Dec 12, 2008 8:05 AM by bill_tuer

    problem with twiddle.bat syntax

    bill_tuer

      Hi,

      i try to get the ServerInfo from my JBOSS on a Win2000 Server. I use this command:

      twiddle.bat get jboss.system:type=ServerInfo

      but i get this error:

      C:\jboss-4.0.5.GA\bin>twiddle.bat get jboss.system:type=ServerInfo
      13:23:36,633 ERROR [Twiddle] Command failure
      org.jboss.console.twiddle.command.CommandException: Invalid object name: jboss.s
      ystem:type
       at org.jboss.console.twiddle.command.MBeanServerCommand.createObjectName
      (MBeanServerCommand.java:53)
       at org.jboss.console.twiddle.command.GetCommand.processArguments(GetComm
      and.java:123)
       at org.jboss.console.twiddle.command.GetCommand.execute(GetCommand.java:
      142)
       at org.jboss.console.twiddle.Twiddle.main(Twiddle.java:305)
      
      Help for command: 'get'
      
      Get the values of one or more MBean attributes
      
      usage: get [options] <name> [<attr>+]
       If no attribute names are given all readable attributes are retrieved
      options:
       --noprefix Do not display attribute name prefixes
       -- Stop processing options


      any idea why this is not working?

      BiLL

        • 1. Re: problem with twiddle.bat syntax
          peterj

          Add quotes around the object name:

          twiddle.bat get "jboss.system:type=ServerInfo"

          • 2. Re: problem with twiddle.bat syntax
            bill_tuer

            thanks, zaht works. another rpoblem is that i have to call a perl-script like this:

            C:\Monitoring>check_jboss.pl -H localhost -T "ServerInfo" -J "jboss.system" -a "
            ActiveThreadCount" -w 300: -c 250: -f

            but this tells my that data is missing. this is the code fragment where twiddle statement is build:

            # prepare command line that will be called and list of attributes hash array
            my $twcall=$twiddle;
            $twcall .= " -s $o_host" if defined($o_host);
            $twcall .= " get " . $o_jmxmbean;
            $twcall .= ":type=" . $o_datatype if $o_datatype;
            $twcall .= ":service=" . $o_servicetype if $o_servicetype;
            for ($i=0;$i<scalar(@o_jmxattrL);$i++) {
             $twcall .= " $o_jmxattrL[$i]";
             $dataresults{$o_jmxattrL[$i]} = ["check", undef];
            }
            for ($i=0;$i<scalar(@o_perfattrL);$i++) {
             $twcall .= " $o_perfattrL[$i]" if !defined($dataresults{$o_perfattrL[$i]});
             $dataresults{$o_perfattrL[$i]} = ["perf", undef];
            }
            


            but i dont know what i have to modify that a correct twiddle systax is generated for windows.

            any ideas?

            BiLL

            • 3. Re: problem with twiddle.bat syntax
              bill_tuer

              ahhh, i got it. here is the complete script if someone want to use it under windows servers (script is originaly from w.leibzon!):

              #!/usr/bin/perl -w
              #
              # ============================== SUMMARY =====================================
              #
              # Program : check_jboss.pl
              # Version : 0.31
              # Date : May 16, 2007
              # Author : William Leibzon - william@leibzon.org
              # Summary : This is a nagios plugin to check jboss parameters by means
              # of twindle utility on the same host
              # Licence : GPL - summary below, full text at http://www.fsf.org/licenses/gpl.txt
              #
              # =========================== PROGRAM LICENSE ================================
              #
              # This program 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.
              #
              # This program 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 this program; if not, write to the Free Software
              # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
              #
              # ============================= SETUP NOTES ==================================
              #
              # This is a nagios plugin to check JBOSS server attributes. It requires
              # local JBOSS provided twiddle utility to be available and will call it
              # (and consequently JAVA process) to actually connect to JBOSS server.
              # Therefore keep in mind that this plugin requires rather heavy processing
              # and you're lot better off doing this through NRPE.
              #
              # For setup make sure to adjust path to twiddle which is rather non-standard
              # in this plugin by default (/opt/jboss/bin/twiddle) and make sure you have
              # either utils.pm in the directory specified with "use lib" or comment it out
              # uncomment 'my %ERRORS' and 'my $TIMEOUT'.
              #
              # The attributes are data attributes of JBOSS bean which you must
              # specify with '-J'; specifying type with '-T' is also required by
              # twiddle, please see documentation for JBOSS and twiddle.
              #
              # For each attribute you specify in '-a' you must also specify warning
              # and critical values in the same order in '-w' and '-c' (see below)
              # Using '-f' would cause all attribute values to also be available
              # for Nagios performance processing and with '-A' you can specify
              # list of that attributes even if they are not otherwise listed in
              # '-a' (you can also do '-A *' to just get all the atributes).
              #
              # Warning and critical levels are specified with '-w' and '-c' and each
              # one must have exact same number of values (separated by ',') as number
              # of attribute names specified with '-a'. Any values you dont want
              # to compare you specify as ~ (or just not specify a value, i.e. ',,').
              # There are also number of other one-letter modifiers that can be used
              # before actual data value to direct how data is to be checked.
              # These are as follows:
              # > : issue alert if data is above this value (default for numeric value)
              # < : issue alert if data is below this value (must be followed by number)
              # = : issue alert if data is equal to this value (default for non-numeric)
              # ! : issue alert if data is NOT equal to this value
              # A special modifier '^' can also be used to disable checking that warn
              # values are less then (or greater then) critical values (it is rarely
              # needed). A quick example of specialized use is '--warn=^<100 --crit=>200'
              # which will cause warning alert if value is < 100 and critical alert
              # if its greater then 200.
              #
              # =================================== TODO ===================================
              #
              # 1. [0.3 DONE] Update to my latest format & code for parsing warning & critical
              # parameters so they can be of the form "<value", ">value" as well
              # as "~". Note that in this version the "<value" is specified as
              # "-value" as with check_jboss plugin - but this will be going away!
              # 2. Add support for storing values in some file so as to allow to check
              # on rate of change rather then just actual value
              # 3. As an option instead of using "twiddle" the data is retrieved
              # from JBoss HTTP status/config data.
              # 4. Add full "help" output in the "check_help" function
              # 5. [0.2 DONE] Need to change how twiddle its called so that pid of the remote
              # 6. [0.31 DONE] Added -S parameter to specify JMX service instead of type
              # shell is kept and that process can be killed during timeout (otherise
              # it maybe left hanging and become a zombie).
              #
              # ========================== START OF PROGRAM CODE ============================
              
              $ENV{JAVA_HOME} = "C:\\Java\\jdk1.6.0";
              $ENV{JAVAC} = "$ENV{'JAVA_HOME'}\\bin\\javac";
              $ENV{JDK_HOME} = "$ENV{'JAVA_HOME'}";
              
              use strict;
              use Getopt::Long;
              
              my $twiddle = "c:\\jboss-4.0.5.GA\\bin\\twiddle.bat";
              my $tempdir = "c:\\TEMP";
              
              # Nagios specific
              # use lib "/usr/lib/nagios/plugins";
              # use utils qw(%ERRORS $TIMEOUT);
              my $TIMEOUT = 20;
              my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4);
              
              ################# DO NOT MODIFY BELOW THIS LINE ########################
              
              my $o_host= undef; # hostname
              my $o_help= undef; # help option
              my $o_verb= undef; # verbose mode
              my $o_version= undef; # version info option
              my $o_warn= undef; # warning level option
              my @o_warnLv= (); # array of warn values
              my @o_warnLp= (); # array of warn data processing modifiers
              my $o_crit= undef; # Critical level option
              my @o_critLv= (); # array of critical values
              my @o_critLp= (); # array of critical data processing modifiers
              my $o_perf= undef; # Performance data option
              my $o_timeout= 5; # Default 5s Timeout
              
              my $o_jmxmbean= undef; # JMX MBean to check
              my $o_datatype= undef; # Data type from specified JMX MBean
              my $o_servicetype= undef; # Service type for specified Mbean (use in place of -T)
              my $o_jmxattr= undef; # Specific MBean attributes to monitor
              my @o_jmxattrL= (); # array from above list
              my $o_perfattr= undef; # JMX Mbean attribute that is only displayed in performance data
              my @o_perfattrL= (); # array from above list
              my $tw_pid=undef;
              
              my $Version='0.3';
              
              sub p_version { print "check_jboss version : $Version\n"; }
              
              sub print_usage {
               print "Usage: $0 [-v] -J <jmx mbean name> -T <data type from specified mbean> [-H <host>] [-a <attribute list> -w <warn levels> -c <critical levels> [-f]] [-A <attributes for perfomance data>] [-t <timeout>] [-V]\n";
              }
              
              # Return true if arg is a number
              sub isnum {
               my $num = shift;
               if ( $num =~ /^[-|+]?((\d+\.?\d*)|(^\.\d+))$/ ) { return 1 ;}
               return 0;
              }
              
              sub help {
               print "\nJBoss Monitor for Nagios version ",$Version,"\n";
               print " by William Leibzon - william(at)leibzon.org\n\n";
               print_usage();
              }
              
              # For verbose output - don't use it right now
              sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; }
              
              # Get the alarm signal (just in case this plugin screws up)
              $SIG{'ALRM'} = sub {
               print ("ERROR: Alarm signal (Nagios time-out)\n");
               kill 9, $tw_pid if defined($tw_pid);
               exit $ERRORS{"UNKNOWN"};
              };
              
              sub check_options {
               Getopt::Long::Configure ("bundling");
               GetOptions(
               'v' => $o_verb, 'verbose' => $o_verb,
               'h' => $o_help, 'help' => $o_help,
               'H:s' => $o_host, 'hostname:s' => $o_host,
               'J:s' => $o_jmxmbean, 'jmx_mbean:s' => $o_jmxmbean,
               'T:s' => $o_datatype, 'data_type:s' => $o_datatype,
               'S:s' => $o_servicetype, 'service_type:s' => $o_servicetype,
               't:i' => $o_timeout, 'timeout:i' => $o_timeout,
               'V' => $o_version, 'version' => $o_version,
               'c:s' => $o_crit, 'critical:s' => $o_crit,
               'w:s' => $o_warn, 'warn:s' => $o_warn,
               'a:s' => $o_jmxattr, 'attributes:s' => $o_jmxattr,
               'f' => $o_perf, 'perfdata' => $o_perf,
               'A:s' => $o_perfattr, 'perf_attributes:s' => $o_perfattr,
               );
               if (defined($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}};
               if (defined($o_version)) { p_version(); exit $ERRORS{"UNKNOWN"}};
               if (!defined($o_jmxmbean) || (!defined($o_datatype) && !defined($o_servicetype)))
               { print "No JMX Mbean name or data type specified!\n";print_usage(); exit $ERRORS{"UNKNOWN"}}
              
               if (defined($o_perfattr)) {
               @o_perfattrL=split(/,/ ,$o_perfattr) if defined($o_perfattr);
               }
               if (defined($o_warn) || defined($o_crit) || defined($o_jmxattr)) {
               if (defined($o_jmxattr)) {
               @o_jmxattrL=split(/,/, $o_jmxattr);
               @o_warnLv=split(/,/ ,$o_warn) if defined($o_warn);
               @o_critLv=split(/,/ ,$o_crit) if defined($o_crit);
               }
               else {
               print "Specifying warning and critical levels requires '-a' parameter with MBEAN attribute names\n";
               print_usage();
               exit $ERRORS{"UNKNOWN"};
               }
               if (scalar(@o_warnLv)!=scalar(@o_jmxattrL) || scalar(@o_critLv)!=scalar(@o_jmxattrL)) {
               printf "Number of spefied warning levels (%d) and critical levels (%d) must be equal to the number of attributes specified at '-a' (%d). If you need to ignore some attribute do it as ',,'\n", scalar(@o_warnLv), scalar(@o_critLv), scalar(@o_jmxattrL);
               print_usage();
               exit $ERRORS{"UNKNOWN"};
               }
               for (my $i=0; $i<scalar(@o_jmxattrL); $i++) {
               $o_warnLv[$i] =~ s/^(\^?[>|<|=|!|~]?)//;
               $o_warnLp[$i] = $1;
               $o_warnLp[$i] = "~" if !$o_warnLp[$i] && !$o_warnLv[$i];
               $o_critLv[$i] =~ s/^([>|<|=|!|~]?)//;
               $o_critLp[$i] = $1;
               $o_critLp[$i] = "~" if !$o_critLp[$i] && !$o_critLv[$i];
              
               if (($o_warnLp[$i] =~ /^[>|<]/ && !isnum($o_warnLv[$i])) ||
               ($o_critLp[$i] =~ /^[>|<]/ && !isnum($o_critLv[$i]))) {
               print "Numeric value required when '>' or '<' are used !\n";
               print_usage();
               exit $ERRORS{"UNKNOWN"};
               }
               if (isnum($o_warnLv[$i]) && isnum($o_critLv[$i]) && $o_warnLp[$i] eq $o_critLp[$i] && (
               ($o_warnLv[$i]>=$o_critLv[$i] && $o_warnLp[$i] !~ /</) ||
               ($o_warnLv[$i]<=$o_critLv[$i] && $o_warnLp[$i] =~ /</)
               )) {
               print "Problem with warning value $o_warnLv[$i] and critical value $o_critLv[$i] :\n";
               print "All numeric warning values must be less then critical (or greater then when '<' is used)\n";
               print "Note: to override this check prefix warning value with ^\n";
               print_usage();
               exit $ERRORS{"UNKNOWN"};
               }
               $o_warnLp[$i] =~ s/\^//;
               $o_warnLp[$i] = '=' if !$o_warnLp[$i] && !isnum($o_warnLv[$i]);
               $o_warnLp[$i] = '>' if !$o_warnLp[$i] && isnum($o_warnLv[$i]);
               $o_critLp[$i] = '=' if !$o_critLp[$i] && !isnum($o_critLv[$i]);
               $o_critLp[$i] = '>' if !$o_critLp[$i] && isnum($o_critLv[$i]);
               }
               }
               if (scalar(@o_jmxattrL)==0 && scalar(@o_perfattrL)==0) {
               print "You must specify list of attributes with either '-a' or '-A'\n";
               print_usage();
               exit $ERRORS{"UNKNOWN"};
               }
              }
              
              # help function used when checking data against critical and warn values
              sub check_value {
               my ($attrib, $data, $level, $modifier) = @_;
              
               return "" if $modifier eq '~';
               return " " . $attrib . " is " . $data . " = " . $level if $modifier eq '=' && $data eq $level;
               return " " . $attrib . " is " . $data . " != " . $level if $modifier eq '!' && $data ne $level;
               return " " . $attrib . " is " . $data . " > " . $level if $modifier eq '>' && $data>$level;
               return " " . $attrib . " is " . $data . " < " . $level if $modifier eq '<' && $data<$level;
               return "";
              }
              
              # twiddle needs to be able to write to twiddle.log file
              # this function attempts to make sure it can be done for /tmp/twiddle.log
              # or if it can not it will try to create new empty directory in /tmp
              sub changedir {
               my $twlogfile="twiddle.log";
               my $maxtry=20;
               my $twdir_prefix="twlog";
              
               if (!defined($tempdir) || ! -d $tempdir) {
               $tempdir="/tmp"
               }
               my $cnt=0;
               my $twextra="";
               do {
               $twextra="/".$twdir_prefix.$cnt if $cnt!=0;
               if (!chdir($tempdir.$twextra)) {
               chdir $tempdir.$twextra if mkdir($tempdir.$twextra,0755);
               }
               $cnt++;
               }
               until (open(FLT, ">>", $tempdir.$twextra."/".$twlogfile) || $cnt==$maxtry);
               if ($cnt<$maxtry) {
               close FLT;
               chmod 0777, $tempdir.$twextra."/".$twlogfile;
               }
               else {
               print "Unable to find or create directory within $tempdir tree with writable $twlogfile file\n";
               exit $ERRORS{"UNKNOWN"};
               }
              }
              
              ########## MAIN #######
              
              check_options();
              
              # Check global timeout if something goes wrong
              if (defined($TIMEOUT)) {
               verb("Alarm at $TIMEOUT");
               alarm($TIMEOUT);
              } else {
               verb("no timeout defined : $o_timeout + 10");
               alarm ($o_timeout+10);
              }
              
              my %dataresults;
              my $statuscode = "OK";
              my $statusinfo = "";
              my $statusdata = "";
              my $perfdata = "";
              my $chk = "";
              my $i;
              
              # prepare command line that will be called and list of attributes hash array
              my $twcall=$twiddle;
              $twcall .= " -s $o_host" if defined($o_host);
              $twcall .= " get \"" . $o_jmxmbean;
              $twcall .= ":type=" . $o_datatype if $o_datatype;
              $twcall .= "\"";
              $twcall .= ":service=" . $o_servicetype if $o_servicetype;
              for ($i=0;$i<scalar(@o_jmxattrL);$i++) {
               $twcall .= " $o_jmxattrL[$i]";
               $dataresults{$o_jmxattrL[$i]} = ["check", undef];
              }
              for ($i=0;$i<scalar(@o_perfattrL);$i++) {
               $twcall .= " $o_perfattrL[$i]" if !defined($dataresults{$o_perfattrL[$i]});
               $dataresults{$o_perfattrL[$i]} = ["perf", undef];
              }
              
              # here we actually collect the data and put in our hash, very simple actually
              changedir();
              verb("Executing $twcall");
              $tw_pid=open(SHELL_PROCESS,"$twcall 2>&1 |");
              if (!$tw_pid) {
               print "UNKNOWN ERROR - unable to execute $twcall - $!";
               exit $ERRORS{"UNKNOWN"};
              }
              while (<SHELL_PROCESS>) {
               foreach $i (keys %dataresults) {
               $dataresults{$i}[1] = $1 if /$i=(\w+)\s/;
               }
              }
              close(SHELL_PROCESS);
              
              # main loop to check if warning & critical attributes are ok
              for ($i=0;$i<scalar(@o_jmxattrL);$i++) {
               if (defined($dataresults{$o_jmxattrL[$i]}[1])) {
               if ($chk = check_value($o_jmxattrL[$i],$dataresults{$o_jmxattrL[$i]}[1],$o_critLv[$i],$o_critLp[$i])) {
               $statuscode = "CRITICAL";
               $statusinfo .= $chk;
               }
               elsif ($chk = check_value($o_jmxattrL[$i],$dataresults{$o_jmxattrL[$i]}[1],$o_warnLv[$i],$o_warnLp[$i])) {
               $statuscode="WARNING" if $statuscode eq "OK";
               $statusinfo .= $chk;
               }
               else {
               $statusdata .= "," if ($statusdata);
               $statusdata .= " " . $o_jmxattrL[$i] . " is " . $dataresults{$o_jmxattrL[$i]}[1] ;
               }
               $perfdata .= " " . $o_jmxattrL[$i] . "=" . $dataresults{$o_jmxattrL[$i]}[1] if defined($o_perf) && $dataresults{$o_jmxattrL[$i]}[0] ne "perf";
               }
               else {
               $statuscode="CRITICAL";
               $statusinfo .= " $o_jmxattrL[$i] data is missing";
               }
              }
              
              # add data for performance-only attributes
              for ($i=0;$i<scalar(@o_perfattrL);$i++) {
               if (defined($dataresults{$o_perfattrL[$i]}[1])) {
               $perfdata .= " " . $o_perfattrL[$i] . "=" . $dataresults{$o_perfattrL[$i]}[1];
               }
              }
              
              print "JBOSS " . $statuscode . $statusinfo;
              print " -".$statusdata if $statusdata;
              print " |".$perfdata if $perfdata;
              print "\n";
              
              exit $ERRORS{$statuscode};