]> git.etc.gen.nz Git - spong.git/commitdiff
initial checkout of file with linux and aix flavors
authorStephen L Johnson <sjohnson@monsters.org>
Fri, 11 Jan 2002 20:40:52 +0000 (20:40 +0000)
committerStephen L Johnson <sjohnson@monsters.org>
Fri, 11 Jan 2002 20:40:52 +0000 (20:40 +0000)
contrib/plugins/spong-client/check_vmstat [new file with mode: 0755]

diff --git a/contrib/plugins/spong-client/check_vmstat b/contrib/plugins/spong-client/check_vmstat
new file mode 100755 (executable)
index 0000000..6f09143
--- /dev/null
@@ -0,0 +1,159 @@
+# Register routine with plugin registery
+$CHECKFUNCS{'vmstat'} = \&check_vmstat;
+
+# check_vmstat is a check which gathers various values
+# from vmstat commands. This plugin will attempt to gather
+# the same set of stats from all platforms.
+#
+# No parameter level checks will be defined in this
+# version. That will come in later versions
+
+# $Id: check_vmstat,v 1.1 2002/01/11 20:40:52 sljohnson Exp $
+
+use Spong::SafeExec qw(safe_exec);
+
+use Config;
+
+$VMSTAT = 'foobar';
+
+# Try to determine which platform we are running on
+# die if we don't have a platform implemented
+$osname = $Config{'osname'};
+if ( $osname =~ /linux|aix/ ) {
+}
+
+{
+   $VMSTAT = '/usr/bin/vmstat 5 2', last if $osname eq 'aix';
+   $VMSTAT = '/usr/bin/vmstat 5 2', last if $osname eq 'linux';
+
+   # Die if we haven't implementeda given OS platform
+   die('check_vmstat: $osname is a not an impletmented OS Platform')
+}
+
+sub check_vmstat {
+   my( $service, $color, $summary, $message ) = ('vmstat', 'green', 'All is well. No checks yet.', '');
+
+   my( $proc_run, $proc_block, $proc_swap, $swpd, $free, $buff, $cache,
+       $si, $so, $bi, $bo, $cs, $cpu_us, $cpu_sy, $cpu_id, $mem_free );
+
+   # Run the command
+   my @msg = safe_exec($VMSTAT);
+
+   if ($osname eq 'linux' ) {
+      my $cache_line = ( $msg[0] =~ /cache/ || $msg[1] =~ /cache/ ) ? 1 : 0;
+
+      # Stuff the last line into the line buffer
+      $_ = $msg[$#msg];
+      $chomp;
+
+      if ($cache_line ) {
+          if (/^(\s+\d+)(\s+\d+)(\s+\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)+\s+(\d+)\s+\d+\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*$/) 
+          { 
+            $proc_run = $1;  $proc_block = $2;  $proc_swap = $3;
+            $swpd = $4;  $free = $5;  $buff = $6;  $cache = $7;
+            $si = $8/4;  $so = $9/4;  # Convert from KB/sec to pages/sec
+            $bi = $10;  $bo = $11;
+            $cs = $12;
+            $cpu_us = $13;  $cpu_sy = $14;  $cpu_id = $15;
+            $mem_free = ($free + $buff + $cache) / 1024;  # in MB
+          }
+      }
+      # This is for vmstat's that don't have a cache column.
+      # FIX THIS: This hasn't been tested. 
+      elsif ( /^(\s+\d+)(\s+\d+)(\s+\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)+\s+(\d+)\s+\d+\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*$/ ) 
+      {
+         $proc_run = $1;  $proc_block = $2;  $proc_swap = $3;
+         $swpd = $4;  $free = $5;  $buff = $6; 
+         $si = $7/4;  $so = $8/4;  # Convert from KB/sec to pages/sec
+         $bi = $9;  $bo = $10;
+         $cs = $11;
+         $cpu_us = $12;  $cpu_sy = $13;  $cpu_id = $13;
+         $mem_free = ($free + $buff) / 1024;  # in MB
+      }
+
+      $message =
+         "mem_free = $mem_free\n" .
+         "proc_run = $proc_run\n" . 
+         "proc_block = $proc_block\n" . 
+         "si = $si\n" . 
+         "so = $so\n" . 
+         "cs = $cs\n" . 
+         "cpu_us = $cpu_us\n" . 
+         "cpu_sy = $cpu_sy\n" . 
+         "cpu_id = $cpu_id\n";
+
+      # Extract page in and page out from /proc/stat for linux
+      my( $sleep ) = 5;
+      my ($opi, $opo, $pi, $po) = (0,0,0,0);
+
+
+      # Grab the paging counts
+      my @pmsg = safe_exec('cat /proc/stat');
+      while ($_ =  shift @pmsg) {
+         if ( /^page\s+(\d+)\s+(\d+)/ ) {
+            ($opi, $opo) = ($1, $2);
+            last;
+         }
+      }
+      sleep(5); # Pause a bit
+      # Grab the paging counts again.
+      @pmsg = safe_exec('cat /proc/stat');
+      while ($_ = shift @pmsg) {
+         if ( /^page\s+(\d+)\s+(\d+)/ ) {
+            ($pi, $po) = ($1, $2);
+            last;
+         }
+      }
+
+      # Now calculate the paging rate from the two set of counts
+      $pi -= $opi; $pi = int(($pi / $sleep) + 0.5);
+      $po -= $opo; $po = int(($po / $sleep) + 0.5);
+
+      $message = $message . "pi = $po\npo = $po\n";
+
+      $message = $message . "Command output:\n" . join('',@msg);
+
+   }   
+   elsif ($osname eq 'aix') {
+      # Stuff the last line into the line buffer
+      $_ = $msg[$#msg];
+      $chomp;
+      if (/^\s*(\d+)\s+(..)\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+.+\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*$/)
+       { 
+         my ($avm);
+         $proc_run = $1;  $proc_block = $2;
+         $avm = $3;  $free = $3;
+         $pi = $6;   $po = $7;
+         $cs = $8;
+         # cpu wait is included in cpu_sy
+         $cpu_us = $9;  $cpu_sy = $10+$12;  $cpu_id = $11; 
+         $mem_free = ($free * 4 )/1000 ;  # convert to MB, 1 page = 4K
+      }
+
+      $message =
+         "mem_free = $mem_free\n" .
+         "proc_run = $proc_run\n" . 
+         "proc_block = $proc_block\n" . 
+#         "si = 0\n" .     # AIX doesn't swap
+#         "so = 0\n" . 
+         "pi = $pi\n" . 
+         "po = $po\n" . 
+         "cs = $cs\n" . 
+         "cpu_us = $cpu_us\n" . 
+         "cpu_sy = $cpu_sy\n" . 
+         "cpu_id = $cpu_id\n";
+
+      $message = $message . "Command output:\n" . join('',@msg);
+
+#      main::debug("check_vmstat:  message  = \n$message");
+   }
+   
+   &debug("check_vmstat - $color, $summary");
+   &status( $SPONGSERVER, $HOST, $service, $color, $summary, $message );
+
+}
+
+
+# I'm included perl code, I need this line.
+1;
+