#! /usr/bin/perl use strict ; use warnings ; package Probe::Proc ; use base 'Probe' ; # uptime days proc uptime # cpu_load real proc loadavg sub ITEMS { [ { name => 'uptime' , kind => 'days' , args => [ qw(uptime) ] } , { name => 'cpu_load' , kind => 'real' , args => [ qw(loadavg) ] } , { name => 'swap_size' , kind => 'gbs' , args => [ qw(swaps) ] } , { name => 'swap_usage' , kind => 'perc' , args => [ qw(swaps) ] } ] ; } ; sub main { my $self = shift ; my $itms = shift ; # items to probe : [ item, ... ] my $clnt = shift ; # main::CLIENT for my $item ( sort { $a -> name cmp $b -> name } @$itms ) { my $file = '/proc/' . $item -> args -> [ 0 ] ; my $name = $item -> name ; unless ( open PROC, '<', $file ) { $item -> perr ( "Proc can't open $file" ) ; } else { my @lines = ; my $val ; chomp @lines ; close PROC ; if ( $name =~ /^(cpu_load|uptime)$/ ) { $val = ( split ' ', $lines [ 0 ] ) [ 0 ] ; } elsif ( $name =~ /^swap_(size|usage)$/ ) { shift @lines ; my $size = 0 ; my $used = 0 ; for my $line ( @lines ) { my @rec = split ' ', $line ; $size += $rec [ 2 ] ; $used += $rec [ 3 ] ; } $val = ( $name eq 'swap_size' ? $size : ( 100 * ( $size == 0 ? 1 : $used / $size ) ) ) ; } OBB::TT ( ' proc %s val %s <- %s', $name, $val, $file ) ; $item -> set_val ( $val ) ; } } } 1 ;