monitors:diskstat.pl

Error loading plugin struct
ParseError: syntax error, unexpected 'fn' (T_STRING), expecting :: (T_PAAMAYIM_NEKUDOTAYIM)
More info is available in the error log.

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
monitors:diskstat.pl [2019/02/12 16:40] – [Installation] wnelismonitors:diskstat.pl [2019/02/16 17:53] (current) – [diskstat.pl] wnelis
Line 5: Line 5:
 ^ Requirements | Perl, Linux | ^ Requirements | Perl, Linux |
 ^ Download | None | ^ Download | None |
-^ Last Update | 2012-04-02 |+^ Last Update | 2019-02-12 |
  
 ===== Description ===== ===== Description =====
Line 16: Line 16:
 ===== Installation ===== ===== Installation =====
  
-At the client side, script diskstat.pl and module diskstat.pm need to be installed and one configuration file needs to be modified. At the server side, two scripts need to be installed and four configuration files of Xymon need to be modified.+At the client side, script diskstat.pl and module diskstat.pm need to be installed and one configuration file needs to be modified. At the server side, one script needs to be installed and four configuration files of Xymon need to be modified.
  
 === Client side === === Client side ===
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 appropriate 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 data-set, the unit conversion factor and the RRD type
-of the datasets are defined to be of type DERIVED, the value passed to +Note that RRD requires that the values of type 'DERIVE' are integer. If 
-# RRD must be an integer number. Thus the times expressed in [ms] are *not* +however floating point numbers are used, the RRD type must be set to 
-converted to [s].+'DDERIVE'.
 # #
 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'   , 0.001, 'DDERIVE' ], #  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'   , 0.001, 'DDERIVE' ], #  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'   , 0.001'DDERIVE' ], # 10 - Time spent for I/O [ms] 
-    [ 'IoWTime'   1,] # 11 - Time weighted with (9)+    [ 'IoWTime' 0.001'DDERIVE' ] # 11 - Time weighted with (9)
 ) ; ) ;
  
Line 233: Line 234:
  
 # #
-# 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 252:
       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 271:
       $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 282:
  
 # #
-# 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 mount-points 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 292:
  
   $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 306:
     $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 ) ;+ if ( $DS[$i][2] eq 'DDERIVE' ) { 
 +   $Result.= sprintf( "%.3f:", $Val ) ; 
 + } else { 
 +   $Result.= sprintf( "%d:", $Val ) ; 
 + }  # of else
       }  # 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 332:
 # #
 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" ;
Line 356: Line 370:
  
 ===== To do ===== ===== To do =====
-An option is to rework this script to send a trends-message to Xymon in stead of a status message. An advantage is that there is no need any more for script rrd_status.pl, a disadvantage might be the lack of a column named 'diskstat'.+An option is to rework this script to send a trends-message to Xymon in stead of a status message. The lack of a column named 'diskstat' might be an advantage for some.
  
 ===== Changelog ===== ===== Changelog =====
Line 362: Line 376:
   * **2012-04-02**   * **2012-04-02**
     * Initial release     * Initial release
-  * **2019-2-12**+  * **2019-02-12**
     * Use Devmon format to pass the statistics to xymon / RRD in stead of the NCV format.     * Use Devmon format to pass the statistics to xymon / RRD in stead of the NCV format.
  
  • monitors/diskstat.pl.1549989644.txt.gz
  • Last modified: 2019/02/12 16:40
  • by wnelis