monitors:diskstat.pl

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revisionBoth sides next revision
monitors:diskstat.pl [2019/02/12 16:43] – [To do] wnelismonitors:diskstat.pl [2019/02/12 17:35] – [diskstat.pl] wnelis
Line 172: Line 172:
 # #
 # This script determines some elementary disk statistics, which are (also) # This script determines some elementary disk statistics, which are (also)
-# accessible via CLI command `iostat`. Pseudo file /proc/diskstats is used +# accessible via CLI command `iostat`. Pseudo file /proc/diskstats is used as 
-as primary source of information.+# primary source of information.
 # #
 # This script does not have any memory by design. It only reports the values # This script does not have any memory by design. It only reports the values
-# found in /proc/diskstat to Xymon, although it does convert some values to +# found in /proc/diskstat to Xymon, although it does convert some values to a 
-more appropiate unit. In most cases, the difference with the value in +# more appropiate unit. In most cases, the difference with the value in the 
-the previous pass is of interest. These differences are computed by RRD, +# previous pass is of interest. These differences are computed by RRD, prior to 
-prior to saving the values.+saving the values.
 # #
 # Written by W.J.M. Nelis, wim.nelis@nlr.nl, 201103 # Written by W.J.M. Nelis, wim.nelis@nlr.nl, 201103
 # #
 use strict ; use strict ;
-use POSIX qw/ strftime / ; # Format time +use Time::Piece ; # Format time 
-use lib "/path/to/xymon/client/ext" ;+use lib "/usr/lib/xymon/client/ext" ;
 use diskstat ; # Import list of devices to check use diskstat ; # Import list of devices to check
  
Line 194: Line 194:
 # Define the parameters to reach the Xymon server. # Define the parameters to reach the Xymon server.
 # #
-my $XyDisp= $ENV{XYMONSERVERHOSTNAME} ; # Name of monitor server+my $XyDisp= $ENV{XYMSRV} ; # Name of monitor server
 my $XySend= $ENV{XYMON} ; # Monitor interface program my $XySend= $ENV{XYMON} ; # Monitor interface program
 my $FmtDate= "%Y.%m.%d %H:%M:%S" ; # Default date format my $FmtDate= "%Y.%m.%d %H:%M:%S" ; # Default date format
    $FmtDate= $ENV{XYMONDATEFORMAT} if defined $ENV{XYMONDATEFORMAT} ;    $FmtDate= $ENV{XYMONDATEFORMAT} if defined $ENV{XYMONDATEFORMAT} ;
 +my $XyTest= 'diskstat' ; # Name of test
 # #
 my $Server= `hostname` ;  chomp $Server ; my $Server= `hostname` ;  chomp $Server ;
-my $Now= strftime( $FmtDate, localtime ; # Timestamp of tests+my $Now= localtime ;                    # Timestamp of tests 
 +   $Now= $Now->strftime( $FmtDate ) ;
 # #
 my $InpFil= '/proc/diskstats' ; # Input file name my $InpFil= '/proc/diskstats' ; # Input file name
-my $Test= 'diskstat' ; # Name of test 
 # #
-# Define the name of each dataset and the unit conversion factor. As most +# Define the name of each dataset and the unit conversion factor. As most of the 
-of the datasets are defined to be of type DERIVED, the value passed to +datasets are defined to be of type DERIVED, the value passed to RRD must be an 
-RRD must be an integer number. Thus the times expressed in [ms] are *not* +integer number. Thus the times expressed in [ms] are *not* converted to [s].
-converted to [s].+
 # #
 my @DS= ( # Define parameters of the datasets my @DS= ( # Define parameters of the datasets
-    [ 'Name'     ,   1 ], #  0 - Name of disk / partition +    [ 'Name'     ,   1, ''       ], #  0 - Name of disk / partition 
-    [ 'RdRequest',   1 ], #  1 - Read requests +    [ 'RdRequest',   1, 'DERIVE' ], #  1 - Read requests 
-    [ 'RdMerge'  ,   1 ], #  2 - Read request merges +    [ 'RdMerge'  ,   1, 'DERIVE' ], #  2 - Read request merges 
-    [ 'RdAmount' , 512 ], #  3 - Sectors read +    [ 'RdAmount' , 512, 'DERIVE' ], #  3 - Sectors read 
-    [ 'RdTime'   ,   1 ], #  4 - Time spent reading [ms] +    [ 'RdTime'   ,   1, 'DERIVE' ], #  4 - Time spent reading [ms] 
-    [ 'WrRequest',   1 ], #  5 - Write requests +    [ 'WrRequest',   1, 'DERIVE' ], #  5 - Write requests 
-    [ 'WrMerge'  ,   1 ], #  6 - Write request merges +    [ 'WrMerge'  ,   1, 'DERIVE' ], #  6 - Write request merges 
-    [ 'WrAmount' , 512 ], #  7 - Sectors written +    [ 'WrAmount' , 512, 'DERIVE' ], #  7 - Sectors written 
-    [ 'WrTime'   ,   1 ], #  8 - Time spent writing [ms] +    [ 'WrTime'   ,   1, 'DERIVE' ], #  8 - Time spent writing [ms] 
-    [ 'IoQueue'  ,   1 ], #  9 - Length of I/O queue +    [ 'IoQueue'  ,   1, 'GAUGE'  ], #  9 - Length of I/O queue 
-    [ 'IoTime'   ,   1,], # 10 - Time spent for I/O [ms] +    [ 'IoTime'   ,   1, 'DERIVE' ], # 10 - Time spent for I/O [ms] 
-    [ 'IoWTime'  ,   1,] # 11 - Time weighted with (9)+    [ 'IoWTime'  ,   1, 'DERIVE' ] # 11 - Time weighted with (9)
 ) ; ) ;
  
Line 233: Line 233:
  
 # #
-# Function ReadStatistics retrieves the disk usage statistics for the +# Function ReadStatistics retrieves the disk usage statistics for the disks and 
-disks and partitions mentioned in %Disk.+partitions mentioned in %Disk.
 # #
 sub ReadStatistics() { sub ReadStatistics() {
Line 251: Line 251:
       chomp ;       chomp ;
       @Field= split ; # Extract all fields       @Field= split ; # Extract all fields
-      next unless defined $Disks{$Field[2]} ;+      next unless exists $Disks{$Field[2]} ;
       if ( @Field != 14 ) {       if ( @Field != 14 ) {
  $Result.= "&yellow Format of statistics of $Field[2] is wrong\n" ;  $Result.= "&yellow Format of statistics of $Field[2] is wrong\n" ;
Line 270: Line 270:
       $Stats{$Disk}[0]= $Disks{$Disk}{Name} ;       $Stats{$Disk}[0]= $Disks{$Disk}{Name} ;
       $Result.= "&yellow No statistics found for $Disk\n" ;       $Result.= "&yellow No statistics found for $Disk\n" ;
-      $Color= "yellow" ;+      $Color  = "yellow" ;
     }  # of foreach     }  # of foreach
  #  #
Line 281: Line 281:
  
 # #
-# Function BuildRrdData converts the list of values into a list of NCV +# Function BuildRrdData reports the values in Devmon format to Xymon, causing 
-patterns, which are recognised by Xymon and ultimately RRD. The names +# Xymon to write the values to an RRD. The names of the mountpoints are adapted 
-of the mountpoints are adapted to match the Xymon conventions.+to match the Xymon conventions.
 # #
 sub BuildRrdData() { sub BuildRrdData() {
-  my $Disk ; # Loop control variable 
   my $Rra ; # Part of name of RRA   my $Rra ; # Part of name of RRA
   my $Val ; # Value of one statistic   my $Val ; # Value of one statistic
Line 292: Line 291:
  
   $Result.= "<!-- linecount=" . scalar(keys %Stats) . " -->\n" ;   $Result.= "<!-- linecount=" . scalar(keys %Stats) . " -->\n" ;
-  $Result.= "<!--\n" ; # Hide measurements in HTML comment +  $Result.= "<!--DEVMON RRD: diskstat 0 0\n" ; 
-  foreach $Disk ( sort keys %Stats ) {+  foreach my $ds ( @DS ) { 
 +    next if $$ds[2] eq ''
 +    $Result.= "DS:$$ds[0]:$$ds[2]:600:0:U " ; 
 +  }  of foreach 
 +  chop $Result ; # Remove trailing space 
 +  $Result.= "\n"
 + 
 +  foreach my $Disk ( sort keys %Stats ) {
     $ar= $Stats{$Disk} ; # Ref to array     $ar= $Stats{$Disk} ; # Ref to array
     $Rra= $$ar[0] ; # Mountpoint of disk     $Rra= $$ar[0] ; # Mountpoint of disk
Line 299: Line 305:
     $Rra=~ s/\//,/g ; # '/' -> ','     $Rra=~ s/\//,/g ; # '/' -> ','
  
 +    $Result.= "$Rra " ;
     for ( my $i= 1 ; $i<= 11 ; $i++ ) {     for ( my $i= 1 ; $i<= 11 ; $i++ ) {
       $Val= $Stats{$Disk}[$i] ;       $Val= $Stats{$Disk}[$i] ;
       if ( $Val eq 'U' ) {       if ( $Val eq 'U' ) {
- $Result.= sprintf( "%s/%s : U\n", $Rra, $DS[$i][0] ) ;+ $Result.= 'U:' ;
       } else {       } else {
  $Val= $Val * $DS[$i][1] ; # Unit conversion  $Val= $Val * $DS[$i][1] ; # Unit conversion
- $Result.= sprintf( "%s/%s : %d\n", $Rra, $DS[$i][0], $Val ) ;+ $Result.= sprintf( "%d:", $Val ) ;
       }  # of else       }  # of else
     }  # of for     }  # of for
 +    chop $Result ; # Remove trailing colon
 +    $Result.= "\n" ;
   }  # of foreach   }  # of foreach
-  $Result.= '-->' ;+  $Result.= '-->' ; # End of Devmon format
 }  # of BuildRrdData }  # of BuildRrdData
  
Line 318: Line 327:
 # #
 if ( scalar(keys %Disks) ) { if ( scalar(keys %Disks) ) {
-  ReadStatistics ; # Read disk statistics +  ReadStatistics() ; # Read disk statistics 
-  BuildRrdData ; # Format measurements for Xymon / RRD+  BuildRrdData() ; # Format measurements for Xymon / RRD
 } else { } else {
   $Result= "There are no disks defined to monitor\n" ;   $Result= "There are no disks defined to monitor\n" ;
 }  # of else }  # of else
  
-$Result= "\"status $Server.$Test $Color $Now\n" .+$Result= "\"status $Server.$XyTest $Color $Now\n" .
  "Disk and partition statistics\n\n" .  "Disk and partition statistics\n\n" .
  $Result . "\"\n" ;  $Result . "\"\n" ;
  • monitors/diskstat.pl.txt
  • Last modified: 2019/02/16 17:53
  • by wnelis