#! /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 => 'cpu_count' , kind => 'int' , args => [ qw(cpuinfo) ] } , { name => 'cpu_busy' , kind => 'real' , args => [ qw(loadavg) ] } , { name => 'swap_size' , kind => 'gbs' , args => [ qw(swaps) ] } , { name => 'swap_usage' , kind => 'perc' , args => [ qw(swaps) ] } , { name => 'vmrss' , kind => 'gbs' , args => [ qw(self/statm) ] } ] ; } ; 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 ; if ( $name eq 'cpu_count' ) { my $val = $Util::CPU_COUNT ; OBB::TT ( ' proc %s val %s', $name, $val ) ; $item -> set_val ( $val ) ; } elsif ( ! open PROC, '<', $file ) { $item -> perr ( "Proc can't open $file" ) ; } else { my @lines = ; close PROC ; chomp @lines ; my $val ; if ( $name =~ /^(cpu_(load|busy)|uptime)$/ ) { $val = ( split ' ', $lines [ 0 ] ) [ 0 ] ; $val /= $Util::CPU_COUNT if $name eq 'cpu_busy' ; } 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 ) ) ) ; } elsif ( $name eq 'vmrss' ) { my $line = shift @lines ; $val = ( split ' ', $line ) [ 1 ] * 4 ; # pagesize = 4 KB } OBB::TT ( ' proc %s val %s <- %s', $name, $val, $file ) ; $item -> set_val ( $val ) ; } } } 1 ;