#!/usr/bin/perl use FileHandle; use strict; use RRDs; my %devices; my @extra_devices = ('sda'); my @raids = ('md126'); my $rrddir = '/var/www/apps/diskstats/loke/'; my $devline; &find_devices; # print "Monitoring $devline\n"; my $toskip = scalar keys %devices; $toskip = $toskip + scalar(@extra_devices) + 3; # print "Skipping $toskip lines\n"; my $fh = FileHandle->new; open($fh, "-|", "LANG=C iostat -kxd 10 $devline"); unless(eof($fh)) { my $line; my $linenr = 0; while(<$fh>) { chomp; s/^\s+//; next unless length; $linenr++ if($linenr <= $toskip); next unless($linenr > $toskip); $line = $_; unless($line =~ "Device") { my ($dev,$rrqm,$wrqm,$rs,$ws,$rk,$wk,$avgrq,$avgqu,$await,$rwait,$wwait,$svctm,$util) = split(/\ +/,$line); my $now = time; unless(-e "$rrddir/$devices{$dev}.rrd") { &create("$rrddir/$devices{$dev}.rrd"); } RRDs::update( "$rrddir/$devices{$dev}.rrd", "$now:$rrqm:$wrqm:$rs:$ws:$rk:$wk:$avgrq:$avgqu:$await:$rwait:$wwait:$svctm:$util", ); } } } else { close($fh); } sub find_devices { foreach my $dev(@extra_devices) { $devline .= " $dev"; $devices{$dev} = $dev; } foreach my $dev(@raids) { my $device; my $devid = 0; my $dir = "/sys/block/$dev/slaves"; opendir(DIR,$dir) or die $!; while(my $device = readdir(DIR)) { next if ($device =~ m/^\./); my $str = $dev.'_'.$devid; $devices{$device} = $str; $devline .= " $device"; $devid++; } closedir(DIR); $devline .= " $dev"; $devices{$dev} = $dev; } } sub create { my $outfile = $_[0]; RRDs::create ( "$outfile", "-s 10", 'DS:rrqm:GAUGE:20:U:U', 'DS:wrqm:GAUGE:20:U:U', 'DS:r:GAUGE:20:U:U', 'DS:w:GAUGE:20:U:U', 'DS:read:GAUGE:20:U:U', 'DS:write:GAUGE:20:U:U', 'DS:avgrq:GAUGE:20:U:U', 'DS:avgqu:GAUGE:20:U:U', 'DS:await:GAUGE:20:U:U', 'DS:rwait:GAUGE:20:U:U', 'DS:wwait:GAUGE:20:U:U', 'DS:svctm:GAUGE:20:U:U', 'DS:util:GAUGE:20:U:U', 'RRA:AVERAGE:0.5:1:360', 'RRA:AVERAGE:0.5:6:1440', 'RRA:AVERAGE:0.5:30:2014', 'RRA:AVERAGE:0.5:360:672', 'RRA:AVERAGE:0.5:8640:365', ); `chmod 640 "$outfile"`; `chown admin:www-data "$outfile"`; }